// This file is distributed under the University of Illinois Open Source License.
// See LICENSE.TXT for details.
// RUN: c_compiler -c -o %t1.o -I "common" "common/testsuite.c"
// RUN: cxx_compiler cxx_rtti -c %s -I "common" -o %t2.o
// RUN: c_compiler -c %s -I "common" -o %t3.o
// RUN: linker -o %t2%exeext  %t1.o %t2.o %t3.o
// RUN: runtool %t2%exeext | checker "TEST PASSED"
#include "testsuite.h"
#ifdef __cplusplus

struct  aa0  {
  int a;
};
//SIG(-1 aa0) C1{ Fi}



static void Test_aa0()
{
  {
    init_simple_test("aa0");
    aa0 lv;
    check2(sizeof(lv), 4, "sizeof(aa0)");
    check2(__alignof__(lv), 4, "__alignof__(aa0)");
    check_field_offset(lv, a, 0, "aa0.a");
  }
}
static Arrange_To_Call_Me vaa0(Test_aa0, "aa0", 4);

#else // __cplusplus

extern VTBL_ENTRY _ZTI3aa0[];
VTBL_ENTRY *P__ZTI3aa0 = _ZTI3aa0; 
Class_Descriptor cd_aa0 = {  "aa0", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  4, // object size
  NSPAIRA(_ZTI3aa0),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  aa1  {
  int a;
  virtual void  foo(); // _ZN3aa13fooEv
  ~aa1(); // tgen
  aa1(); // tgen
};
//SIG(-1 aa1) C1{ v1 Fi}


void  aa1 ::foo(){vfunc_called(this, "_ZN3aa13fooEv");}
aa1 ::~aa1(){ note_dtor("aa1", this);} // tgen
aa1 ::aa1(){ note_ctor("aa1", this);} // tgen

static void Test_aa1()
{
  extern Class_Descriptor cd_aa1;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_aa1, buf);
    aa1 *dp, &lv = *(dp=new (buf) aa1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(aa1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(aa1)");
    check_field_offset(lv, a, ABISELECT(8,4), "aa1.a");
    test_class_info(&lv, &cd_aa1);
    dp->~aa1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vaa1(Test_aa1, "aa1", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aa1C1Ev();
extern void _ZN3aa1D1Ev();
Name_Map name_map_aa1[] = {
  NSPAIR(_ZN3aa1C1Ev),
  NSPAIR(_ZN3aa1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI3aa1[];
extern void _ZN3aa13fooEv();
static  VTBL_ENTRY vtc_aa1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI3aa1[0]),
  (VTBL_ENTRY)&_ZN3aa13fooEv,
};
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
Class_Descriptor cd_aa1 = {  "aa1", // class name
  0,0,//no base classes
  &(vtc_aa1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI3aa1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV3aa1),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  aa2  {
  int a;
  virtual void  foo(); // _ZN3aa23fooEv
  virtual void  bar(); // _ZN3aa23barEv
  ~aa2(); // tgen
  aa2(); // tgen
};
//SIG(-1 aa2) C1{ v1 v2 Fi}


void  aa2 ::foo(){vfunc_called(this, "_ZN3aa23fooEv");}
void  aa2 ::bar(){vfunc_called(this, "_ZN3aa23barEv");}
aa2 ::~aa2(){ note_dtor("aa2", this);} // tgen
aa2 ::aa2(){ note_ctor("aa2", this);} // tgen

static void Test_aa2()
{
  extern Class_Descriptor cd_aa2;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_aa2, buf);
    aa2 *dp, &lv = *(dp=new (buf) aa2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(aa2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(aa2)");
    check_field_offset(lv, a, ABISELECT(8,4), "aa2.a");
    test_class_info(&lv, &cd_aa2);
    dp->~aa2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vaa2(Test_aa2, "aa2", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aa2C1Ev();
extern void _ZN3aa2D1Ev();
Name_Map name_map_aa2[] = {
  NSPAIR(_ZN3aa2C1Ev),
  NSPAIR(_ZN3aa2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI3aa2[];
extern void _ZN3aa23fooEv();
extern void _ZN3aa23barEv();
static  VTBL_ENTRY vtc_aa2[] = {
  0,
  (VTBL_ENTRY)&(_ZTI3aa2[0]),
  (VTBL_ENTRY)&_ZN3aa23fooEv,
  (VTBL_ENTRY)&_ZN3aa23barEv,
};
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
Class_Descriptor cd_aa2 = {  "aa2", // class name
  0,0,//no base classes
  &(vtc_aa2[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI3aa2),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV3aa2),4, //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  bb60  : aa0 {
  int b;
  virtual void  bar(); // _ZN4bb603barEv
  virtual void  foo(); // _ZN4bb603fooEv
  ~bb60(); // tgen
  bb60(); // tgen
};
//SIG(-1 bb60) C1{ BC2{ Fi} v1 v2 Fi}


void  bb60 ::bar(){vfunc_called(this, "_ZN4bb603barEv");}
void  bb60 ::foo(){vfunc_called(this, "_ZN4bb603fooEv");}
bb60 ::~bb60(){ note_dtor("bb60", this);} // tgen
bb60 ::bb60(){ note_ctor("bb60", this);} // tgen

static void Test_bb60()
{
  extern Class_Descriptor cd_bb60;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(3,4)];
    init_test(&cd_bb60, buf);
    bb60 *dp, &lv = *(dp=new (buf) bb60());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(bb60)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(bb60)");
    check_base_class_offset(lv, (aa0*), ABISELECT(8,4), "bb60");
    check_field_offset(lv, b, ABISELECT(12,8), "bb60.b");
    test_class_info(&lv, &cd_bb60);
    dp->~bb60();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vbb60(Test_bb60, "bb60", ABISELECT(16,12));

#else // __cplusplus

extern void _ZN4bb60C1Ev();
extern void _ZN4bb60D1Ev();
Name_Map name_map_bb60[] = {
  NSPAIR(_ZN4bb60C1Ev),
  NSPAIR(_ZN4bb60D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
static Base_Class bases_bb60[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4bb60[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_bb60[] = {
  0,
  (VTBL_ENTRY)&(_ZTI4bb60[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
Class_Descriptor cd_bb60 = {  "bb60", // class name
  bases_bb60, 1,
  &(vtc_bb60[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,12), // object size
  NSPAIRA(_ZTI4bb60),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV4bb60),4, //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  cc060  : bb60 {
  int c;
  ~cc060(); // tgen
  cc060(); // tgen
};
//SIG(-1 cc060) C1{ BC2{ BC3{ Fi} v1 v2 Fi} Fi}


cc060 ::~cc060(){ note_dtor("cc060", this);} // tgen
cc060 ::cc060(){ note_ctor("cc060", this);} // tgen

static void Test_cc060()
{
  extern Class_Descriptor cd_cc060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc060, buf);
    cc060 *dp, &lv = *(dp=new (buf) cc060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc060)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(8,4), "cc060");
    check_base_class_offset(lv, (bb60*), 0, "cc060");
    check_field_offset(lv, c, ABISELECT(16,12), "cc060.c");
    test_class_info(&lv, &cd_cc060);
    dp->~cc060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc060(Test_cc060, "cc060", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc060C1Ev();
extern void _ZN5cc060D1Ev();
Name_Map name_map_cc060[] = {
  NSPAIR(_ZN5cc060C1Ev),
  NSPAIR(_ZN5cc060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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 _ZTI5cc060[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_cc060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
Class_Descriptor cd_cc060 = {  "cc060", // class name
  bases_cc060, 2,
  &(vtc_cc060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc060),4, //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  dd0060  : cc060 {
  int d;
  ~dd0060(); // tgen
  dd0060(); // tgen
};
//SIG(-1 dd0060) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} Fi} Fi}


dd0060 ::~dd0060(){ note_dtor("dd0060", this);} // tgen
dd0060 ::dd0060(){ note_ctor("dd0060", this);} // tgen

static void Test_dd0060()
{
  extern Class_Descriptor cd_dd0060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0060, buf);
    dd0060 *dp, &lv = *(dp=new (buf) dd0060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(8,4), "dd0060");
    check_base_class_offset(lv, (bb60*)(cc060*), 0, "dd0060");
    check_base_class_offset(lv, (cc060*), 0, "dd0060");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0060.d");
    test_class_info(&lv, &cd_dd0060);
    dp->~dd0060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0060(Test_dd0060, "dd0060", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0060C1Ev();
extern void _ZN6dd0060D1Ev();
Name_Map name_map_dd0060[] = {
  NSPAIR(_ZN6dd0060C1Ev),
  NSPAIR(_ZN6dd0060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd0060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd0060[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd0060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
Class_Descriptor cd_dd0060 = {  "dd0060", // class name
  bases_dd0060, 3,
  &(vtc_dd0060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0060),4, //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  ee00060  : dd0060 {
  int e;
  ~ee00060(); // tgen
  ee00060(); // tgen
};
//SIG(1 ee00060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee00060 ::~ee00060(){ note_dtor("ee00060", this);} // tgen
ee00060 ::ee00060(){ note_ctor("ee00060", this);} // tgen

static void Test_ee00060()
{
  extern Class_Descriptor cd_ee00060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00060, buf);
    ee00060 *dp, &lv = *(dp=new (buf) ee00060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(8,4), "ee00060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), 0, "ee00060");
    check_base_class_offset(lv, (cc060*)(dd0060*), 0, "ee00060");
    check_base_class_offset(lv, (dd0060*), 0, "ee00060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00060.e");
    test_class_info(&lv, &cd_ee00060);
    dp->~ee00060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00060(Test_ee00060, "ee00060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00060C1Ev();
extern void _ZN7ee00060D1Ev();
Name_Map name_map_ee00060[] = {
  NSPAIR(_ZN7ee00060C1Ev),
  NSPAIR(_ZN7ee00060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee00060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee00060[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee00060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee00060[];
extern  VTBL_ENTRY _ZTV7ee00060[];
Class_Descriptor cd_ee00060 = {  "ee00060", // class name
  bases_ee00060, 4,
  &(vtc_ee00060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00060),4, //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  ee10060  : virtual dd0060 {
  int e;
  ~ee10060(); // tgen
  ee10060(); // tgen
};
//SIG(1 ee10060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee10060 ::~ee10060(){ note_dtor("ee10060", this);} // tgen
ee10060 ::ee10060(){ note_ctor("ee10060", this);} // tgen

static void Test_ee10060()
{
  extern Class_Descriptor cd_ee10060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10060, buf);
    ee10060 *dp, &lv = *(dp=new (buf) ee10060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(24,12), "ee10060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), ABISELECT(16,8), "ee10060");
    check_base_class_offset(lv, (cc060*)(dd0060*), ABISELECT(16,8), "ee10060");
    check_base_class_offset(lv, (dd0060*), ABISELECT(16,8), "ee10060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10060.e");
    test_class_info(&lv, &cd_ee10060);
    dp->~ee10060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10060(Test_ee10060, "ee10060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10060C1Ev();
extern void _ZN7ee10060D1Ev();
Name_Map name_map_ee10060[] = {
  NSPAIR(_ZN7ee10060C1Ev),
  NSPAIR(_ZN7ee10060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee10060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10060[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee10060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10060[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee10060[];
static  VTT_ENTRY vtt_ee10060[] = {
  {&(_ZTV7ee10060[3]),  3,9},
  {&(_ZTV7ee10060[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10060[];
extern  VTBL_ENTRY _ZTV7ee10060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10060[];
Class_Descriptor cd_ee10060 = {  "ee10060", // class name
  bases_ee10060, 4,
  &(vtc_ee10060[0]), // expected_vtbl_contents
  &(vtt_ee10060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10060),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10060),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  ee20060  : dd0060 {
  int e;
  virtual void  foo(); // _ZN7ee200603fooEv
  ~ee20060(); // tgen
  ee20060(); // tgen
};
//SIG(1 ee20060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee20060 ::foo(){vfunc_called(this, "_ZN7ee200603fooEv");}
ee20060 ::~ee20060(){ note_dtor("ee20060", this);} // tgen
ee20060 ::ee20060(){ note_ctor("ee20060", this);} // tgen

static void Test_ee20060()
{
  extern Class_Descriptor cd_ee20060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20060, buf);
    ee20060 *dp, &lv = *(dp=new (buf) ee20060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(8,4), "ee20060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), 0, "ee20060");
    check_base_class_offset(lv, (cc060*)(dd0060*), 0, "ee20060");
    check_base_class_offset(lv, (dd0060*), 0, "ee20060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20060.e");
    test_class_info(&lv, &cd_ee20060);
    dp->~ee20060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20060(Test_ee20060, "ee20060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20060C1Ev();
extern void _ZN7ee20060D1Ev();
Name_Map name_map_ee20060[] = {
  NSPAIR(_ZN7ee20060C1Ev),
  NSPAIR(_ZN7ee20060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee20060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee20060[];
extern void _ZN4bb603barEv();
extern void _ZN7ee200603fooEv();
static  VTBL_ENTRY vtc_ee20060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN7ee200603fooEv,
};
extern VTBL_ENTRY _ZTI7ee20060[];
extern  VTBL_ENTRY _ZTV7ee20060[];
Class_Descriptor cd_ee20060 = {  "ee20060", // class name
  bases_ee20060, 4,
  &(vtc_ee20060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20060),4, //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  ee30060  : virtual dd0060 {
  int e;
  virtual void  foo(); // _ZN7ee300603fooEv
  ~ee30060(); // tgen
  ee30060(); // tgen
};
//SIG(1 ee30060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee30060 ::foo(){vfunc_called(this, "_ZN7ee300603fooEv");}
ee30060 ::~ee30060(){ note_dtor("ee30060", this);} // tgen
ee30060 ::ee30060(){ note_ctor("ee30060", this);} // tgen

static void Test_ee30060()
{
  extern Class_Descriptor cd_ee30060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30060, buf);
    ee30060 *dp, &lv = *(dp=new (buf) ee30060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(24,12), "ee30060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), ABISELECT(16,8), "ee30060");
    check_base_class_offset(lv, (cc060*)(dd0060*), ABISELECT(16,8), "ee30060");
    check_base_class_offset(lv, (dd0060*), ABISELECT(16,8), "ee30060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30060.e");
    test_class_info(&lv, &cd_ee30060);
    dp->~ee30060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30060(Test_ee30060, "ee30060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30060C1Ev();
extern void _ZN7ee30060D1Ev();
Name_Map name_map_ee30060[] = {
  NSPAIR(_ZN7ee30060C1Ev),
  NSPAIR(_ZN7ee30060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee30060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30060[];
extern void _ZN7ee300603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee300603fooEv,_ZTv0_n16_N7ee300603fooEv)();
extern void ABISELECT(_ZThn16_N7ee300603fooEv,_ZThn8_N7ee300603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30060[0]),
  (VTBL_ENTRY)&_ZN7ee300603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee300603fooEv,_ZTv0_n16_N7ee300603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30060[];
static  VTT_ENTRY vtt_ee30060[] = {
  {&(_ZTV7ee30060[3]),  3,10},
  {&(_ZTV7ee30060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30060[];
extern  VTBL_ENTRY _ZTV7ee30060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30060[];
static VTBL_ENTRY alt_thunk_names1[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee300603fooEv,_ZTv0_n16_N7ee300603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee300603fooEv,_ZThn8_N7ee300603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30060 = {  "ee30060", // class name
  bases_ee30060, 4,
  &(vtc_ee30060[0]), // expected_vtbl_contents
  &(vtt_ee30060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40060  : dd0060 {
  int e;
  virtual void  bar(); // _ZN7ee400603barEv
  ~ee40060(); // tgen
  ee40060(); // tgen
};
//SIG(1 ee40060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee40060 ::bar(){vfunc_called(this, "_ZN7ee400603barEv");}
ee40060 ::~ee40060(){ note_dtor("ee40060", this);} // tgen
ee40060 ::ee40060(){ note_ctor("ee40060", this);} // tgen

static void Test_ee40060()
{
  extern Class_Descriptor cd_ee40060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40060, buf);
    ee40060 *dp, &lv = *(dp=new (buf) ee40060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(8,4), "ee40060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), 0, "ee40060");
    check_base_class_offset(lv, (cc060*)(dd0060*), 0, "ee40060");
    check_base_class_offset(lv, (dd0060*), 0, "ee40060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40060.e");
    test_class_info(&lv, &cd_ee40060);
    dp->~ee40060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40060(Test_ee40060, "ee40060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40060C1Ev();
extern void _ZN7ee40060D1Ev();
Name_Map name_map_ee40060[] = {
  NSPAIR(_ZN7ee40060C1Ev),
  NSPAIR(_ZN7ee40060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee40060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee40060[];
extern void _ZN7ee400603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee40060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40060[0]),
  (VTBL_ENTRY)&_ZN7ee400603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee40060[];
extern  VTBL_ENTRY _ZTV7ee40060[];
Class_Descriptor cd_ee40060 = {  "ee40060", // class name
  bases_ee40060, 4,
  &(vtc_ee40060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40060),4, //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  ee50060  : virtual dd0060 {
  int e;
  virtual void  bar(); // _ZN7ee500603barEv
  ~ee50060(); // tgen
  ee50060(); // tgen
};
//SIG(1 ee50060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee50060 ::bar(){vfunc_called(this, "_ZN7ee500603barEv");}
ee50060 ::~ee50060(){ note_dtor("ee50060", this);} // tgen
ee50060 ::ee50060(){ note_ctor("ee50060", this);} // tgen

static void Test_ee50060()
{
  extern Class_Descriptor cd_ee50060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50060, buf);
    ee50060 *dp, &lv = *(dp=new (buf) ee50060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(24,12), "ee50060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), ABISELECT(16,8), "ee50060");
    check_base_class_offset(lv, (cc060*)(dd0060*), ABISELECT(16,8), "ee50060");
    check_base_class_offset(lv, (dd0060*), ABISELECT(16,8), "ee50060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50060.e");
    test_class_info(&lv, &cd_ee50060);
    dp->~ee50060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50060(Test_ee50060, "ee50060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50060C1Ev();
extern void _ZN7ee50060D1Ev();
Name_Map name_map_ee50060[] = {
  NSPAIR(_ZN7ee50060C1Ev),
  NSPAIR(_ZN7ee50060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee50060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50060[];
extern void _ZN7ee500603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee500603barEv,_ZTv0_n12_N7ee500603barEv)();
extern void ABISELECT(_ZThn16_N7ee500603barEv,_ZThn8_N7ee500603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee50060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50060[0]),
  (VTBL_ENTRY)&_ZN7ee500603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee500603barEv,_ZTv0_n12_N7ee500603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee50060[];
static  VTT_ENTRY vtt_ee50060[] = {
  {&(_ZTV7ee50060[3]),  3,10},
  {&(_ZTV7ee50060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50060[];
extern  VTBL_ENTRY _ZTV7ee50060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50060[];
static VTBL_ENTRY alt_thunk_names2[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee500603barEv,_ZTv0_n12_N7ee500603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee500603barEv,_ZThn8_N7ee500603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50060 = {  "ee50060", // class name
  bases_ee50060, 4,
  &(vtc_ee50060[0]), // expected_vtbl_contents
  &(vtt_ee50060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60060  : dd0060 {
  int e;
  virtual void  foo(); // _ZN7ee600603fooEv
  virtual void  bar(); // _ZN7ee600603barEv
  ~ee60060(); // tgen
  ee60060(); // tgen
};
//SIG(1 ee60060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee60060 ::foo(){vfunc_called(this, "_ZN7ee600603fooEv");}
void  ee60060 ::bar(){vfunc_called(this, "_ZN7ee600603barEv");}
ee60060 ::~ee60060(){ note_dtor("ee60060", this);} // tgen
ee60060 ::ee60060(){ note_ctor("ee60060", this);} // tgen

static void Test_ee60060()
{
  extern Class_Descriptor cd_ee60060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60060, buf);
    ee60060 *dp, &lv = *(dp=new (buf) ee60060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(8,4), "ee60060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), 0, "ee60060");
    check_base_class_offset(lv, (cc060*)(dd0060*), 0, "ee60060");
    check_base_class_offset(lv, (dd0060*), 0, "ee60060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60060.e");
    test_class_info(&lv, &cd_ee60060);
    dp->~ee60060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60060(Test_ee60060, "ee60060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60060C1Ev();
extern void _ZN7ee60060D1Ev();
Name_Map name_map_ee60060[] = {
  NSPAIR(_ZN7ee60060C1Ev),
  NSPAIR(_ZN7ee60060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee60060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee60060[];
extern void _ZN7ee600603barEv();
extern void _ZN7ee600603fooEv();
static  VTBL_ENTRY vtc_ee60060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60060[0]),
  (VTBL_ENTRY)&_ZN7ee600603barEv,
  (VTBL_ENTRY)&_ZN7ee600603fooEv,
};
extern VTBL_ENTRY _ZTI7ee60060[];
extern  VTBL_ENTRY _ZTV7ee60060[];
Class_Descriptor cd_ee60060 = {  "ee60060", // class name
  bases_ee60060, 4,
  &(vtc_ee60060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60060),4, //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  ee70060  : virtual dd0060 {
  int e;
  virtual void  foo(); // _ZN7ee700603fooEv
  virtual void  bar(); // _ZN7ee700603barEv
  ~ee70060(); // tgen
  ee70060(); // tgen
};
//SIG(1 ee70060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee70060 ::foo(){vfunc_called(this, "_ZN7ee700603fooEv");}
void  ee70060 ::bar(){vfunc_called(this, "_ZN7ee700603barEv");}
ee70060 ::~ee70060(){ note_dtor("ee70060", this);} // tgen
ee70060 ::ee70060(){ note_ctor("ee70060", this);} // tgen

static void Test_ee70060()
{
  extern Class_Descriptor cd_ee70060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70060, buf);
    ee70060 *dp, &lv = *(dp=new (buf) ee70060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd0060*), ABISELECT(24,12), "ee70060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd0060*), ABISELECT(16,8), "ee70060");
    check_base_class_offset(lv, (cc060*)(dd0060*), ABISELECT(16,8), "ee70060");
    check_base_class_offset(lv, (dd0060*), ABISELECT(16,8), "ee70060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70060.e");
    test_class_info(&lv, &cd_ee70060);
    dp->~ee70060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70060(Test_ee70060, "ee70060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70060C1Ev();
extern void _ZN7ee70060D1Ev();
Name_Map name_map_ee70060[] = {
  NSPAIR(_ZN7ee70060C1Ev),
  NSPAIR(_ZN7ee70060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd0060;
extern VTBL_ENTRY _ZTI6dd0060[];
extern  VTBL_ENTRY _ZTV6dd0060[];
static Base_Class bases_ee70060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70060[];
extern void _ZN7ee700603fooEv();
extern void _ZN7ee700603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee700603barEv,_ZTv0_n12_N7ee700603barEv)();
extern void ABISELECT(_ZThn16_N7ee700603barEv,_ZThn8_N7ee700603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee700603fooEv,_ZTv0_n16_N7ee700603fooEv)();
extern void ABISELECT(_ZThn16_N7ee700603fooEv,_ZThn8_N7ee700603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70060[0]),
  (VTBL_ENTRY)&_ZN7ee700603fooEv,
  (VTBL_ENTRY)&_ZN7ee700603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee700603barEv,_ZTv0_n12_N7ee700603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee700603fooEv,_ZTv0_n16_N7ee700603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70060[];
static  VTT_ENTRY vtt_ee70060[] = {
  {&(_ZTV7ee70060[3]),  3,11},
  {&(_ZTV7ee70060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70060[];
extern  VTBL_ENTRY _ZTV7ee70060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70060[];
static VTBL_ENTRY alt_thunk_names3[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee700603fooEv,_ZTv0_n16_N7ee700603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee700603fooEv,_ZThn8_N7ee700603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee700603barEv,_ZTv0_n12_N7ee700603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee700603barEv,_ZThn8_N7ee700603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70060 = {  "ee70060", // class name
  bases_ee70060, 4,
  &(vtc_ee70060[0]), // expected_vtbl_contents
  &(vtt_ee70060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names3,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1060  : virtual cc060 {
  int d;
  ~dd1060(); // tgen
  dd1060(); // tgen
};
//SIG(-1 dd1060) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} Fi} Fi}


dd1060 ::~dd1060(){ note_dtor("dd1060", this);} // tgen
dd1060 ::dd1060(){ note_ctor("dd1060", this);} // tgen

static void Test_dd1060()
{
  extern Class_Descriptor cd_dd1060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1060, buf);
    dd1060 *dp, &lv = *(dp=new (buf) dd1060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,12), "dd1060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,8), "dd1060");
    check_base_class_offset(lv, (cc060*), ABISELECT(16,8), "dd1060");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1060.d");
    test_class_info(&lv, &cd_dd1060);
    dp->~dd1060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1060(Test_dd1060, "dd1060", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1060C1Ev();
extern void _ZN6dd1060D1Ev();
Name_Map name_map_dd1060[] = {
  NSPAIR(_ZN6dd1060C1Ev),
  NSPAIR(_ZN6dd1060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd1060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1060[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd1060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd1060[];
static  VTT_ENTRY vtt_dd1060[] = {
  {&(_ZTV6dd1060[3]),  3,9},
  {&(_ZTV6dd1060[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
Class_Descriptor cd_dd1060 = {  "dd1060", // class name
  bases_dd1060, 3,
  &(vtc_dd1060[0]), // expected_vtbl_contents
  &(vtt_dd1060[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1060),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1060),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  ee01060  : dd1060 {
  int e;
  ~ee01060(); // tgen
  ee01060(); // tgen
};
//SIG(1 ee01060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee01060 ::~ee01060(){ note_dtor("ee01060", this);} // tgen
ee01060 ::ee01060(){ note_ctor("ee01060", this);} // tgen

static void Test_ee01060()
{
  extern Class_Descriptor cd_ee01060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01060, buf);
    ee01060 *dp, &lv = *(dp=new (buf) ee01060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee01060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee01060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(16,12), "ee01060");
    check_base_class_offset(lv, (dd1060*), 0, "ee01060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01060.e");
    test_class_info(&lv, &cd_ee01060);
    dp->~ee01060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01060(Test_ee01060, "ee01060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01060C1Ev();
extern void _ZN7ee01060D1Ev();
Name_Map name_map_ee01060[] = {
  NSPAIR(_ZN7ee01060C1Ev),
  NSPAIR(_ZN7ee01060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee01060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01060[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee01060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01060[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee01060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee01060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee01060[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee01060[] = {
  {&(_ZTV7ee01060[3]),  3,9},
  {&(_tg__ZTV6dd1060__7ee01060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee01060[4]),  4,6},
  {&(_ZTV7ee01060[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01060[];
extern  VTBL_ENTRY _ZTV7ee01060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01060[];
Class_Descriptor cd_ee01060 = {  "ee01060", // class name
  bases_ee01060, 4,
  &(vtc_ee01060[0]), // expected_vtbl_contents
  &(vtt_ee01060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01060),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01060),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  ee11060  : virtual dd1060 {
  int e;
  ~ee11060(); // tgen
  ee11060(); // tgen
};
//SIG(1 ee11060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee11060 ::~ee11060(){ note_dtor("ee11060", this);} // tgen
ee11060 ::ee11060(){ note_ctor("ee11060", this);} // tgen

static void Test_ee11060()
{
  extern Class_Descriptor cd_ee11060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11060, buf);
    ee11060 *dp, &lv = *(dp=new (buf) ee11060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee11060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee11060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(32,16), "ee11060");
    check_base_class_offset(lv, (dd1060*), ABISELECT(16,8), "ee11060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11060.e");
    test_class_info(&lv, &cd_ee11060);
    dp->~ee11060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11060(Test_ee11060, "ee11060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11060C1Ev();
extern void _ZN7ee11060D1Ev();
Name_Map name_map_ee11060[] = {
  NSPAIR(_ZN7ee11060C1Ev),
  NSPAIR(_ZN7ee11060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee11060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11060[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee11060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11060[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11060[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee11060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee11060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee11060[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee11060[] = {
  {&(_ZTV7ee11060[4]),  4,13},
  {&(_ZTV7ee11060[7]),  7,13},
  {&(_ZTV7ee11060[11]),  11,13},
  {&(_tg__ZTV6dd1060__7ee11060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee11060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11060[];
extern  VTBL_ENTRY _ZTV7ee11060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11060[];
Class_Descriptor cd_ee11060 = {  "ee11060", // class name
  bases_ee11060, 4,
  &(vtc_ee11060[0]), // expected_vtbl_contents
  &(vtt_ee11060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11060),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11060),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  ee21060  : dd1060 {
  int e;
  virtual void  foo(); // _ZN7ee210603fooEv
  ~ee21060(); // tgen
  ee21060(); // tgen
};
//SIG(1 ee21060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee21060 ::foo(){vfunc_called(this, "_ZN7ee210603fooEv");}
ee21060 ::~ee21060(){ note_dtor("ee21060", this);} // tgen
ee21060 ::ee21060(){ note_ctor("ee21060", this);} // tgen

static void Test_ee21060()
{
  extern Class_Descriptor cd_ee21060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21060, buf);
    ee21060 *dp, &lv = *(dp=new (buf) ee21060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee21060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee21060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(16,12), "ee21060");
    check_base_class_offset(lv, (dd1060*), 0, "ee21060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21060.e");
    test_class_info(&lv, &cd_ee21060);
    dp->~ee21060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21060(Test_ee21060, "ee21060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21060C1Ev();
extern void _ZN7ee21060D1Ev();
Name_Map name_map_ee21060[] = {
  NSPAIR(_ZN7ee21060C1Ev),
  NSPAIR(_ZN7ee21060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee21060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21060[];
extern void _ZN7ee210603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee210603fooEv,_ZTv0_n16_N7ee210603fooEv)();
extern void ABISELECT(_ZThn16_N7ee210603fooEv,_ZThn12_N7ee210603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21060[0]),
  (VTBL_ENTRY)&_ZN7ee210603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee210603fooEv,_ZTv0_n16_N7ee210603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee21060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee21060[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee21060[] = {
  {&(_ZTV7ee21060[3]),  3,10},
  {&(_tg__ZTV6dd1060__7ee21060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee21060[4]),  4,6},
  {&(_ZTV7ee21060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21060[];
extern  VTBL_ENTRY _ZTV7ee21060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21060[];
static VTBL_ENTRY alt_thunk_names4[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee210603fooEv,_ZTv0_n16_N7ee210603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee210603fooEv,_ZThn12_N7ee210603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21060 = {  "ee21060", // class name
  bases_ee21060, 4,
  &(vtc_ee21060[0]), // expected_vtbl_contents
  &(vtt_ee21060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names4,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31060  : virtual dd1060 {
  int e;
  virtual void  foo(); // _ZN7ee310603fooEv
  ~ee31060(); // tgen
  ee31060(); // tgen
};
//SIG(1 ee31060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee31060 ::foo(){vfunc_called(this, "_ZN7ee310603fooEv");}
ee31060 ::~ee31060(){ note_dtor("ee31060", this);} // tgen
ee31060 ::ee31060(){ note_ctor("ee31060", this);} // tgen

static void Test_ee31060()
{
  extern Class_Descriptor cd_ee31060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31060, buf);
    ee31060 *dp, &lv = *(dp=new (buf) ee31060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee31060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee31060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(32,16), "ee31060");
    check_base_class_offset(lv, (dd1060*), ABISELECT(16,8), "ee31060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31060.e");
    test_class_info(&lv, &cd_ee31060);
    dp->~ee31060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31060(Test_ee31060, "ee31060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31060C1Ev();
extern void _ZN7ee31060D1Ev();
Name_Map name_map_ee31060[] = {
  NSPAIR(_ZN7ee31060C1Ev),
  NSPAIR(_ZN7ee31060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee31060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31060[];
extern void _ZN7ee310603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee310603fooEv,_ZTv0_n16_N7ee310603fooEv)();
extern void ABISELECT(_ZThn32_N7ee310603fooEv,_ZThn16_N7ee310603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31060[0]),
  (VTBL_ENTRY)&_ZN7ee310603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31060[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee310603fooEv,_ZTv0_n16_N7ee310603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee31060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee31060[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee31060[] = {
  {&(_ZTV7ee31060[4]),  4,14},
  {&(_ZTV7ee31060[8]),  8,14},
  {&(_ZTV7ee31060[12]),  12,14},
  {&(_tg__ZTV6dd1060__7ee31060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee31060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31060[];
extern  VTBL_ENTRY _ZTV7ee31060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31060[];
static VTBL_ENTRY alt_thunk_names5[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee310603fooEv,_ZTv0_n16_N7ee310603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee310603fooEv,_ZThn16_N7ee310603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31060 = {  "ee31060", // class name
  bases_ee31060, 4,
  &(vtc_ee31060[0]), // expected_vtbl_contents
  &(vtt_ee31060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31060),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names5,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41060  : dd1060 {
  int e;
  virtual void  bar(); // _ZN7ee410603barEv
  ~ee41060(); // tgen
  ee41060(); // tgen
};
//SIG(1 ee41060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee41060 ::bar(){vfunc_called(this, "_ZN7ee410603barEv");}
ee41060 ::~ee41060(){ note_dtor("ee41060", this);} // tgen
ee41060 ::ee41060(){ note_ctor("ee41060", this);} // tgen

static void Test_ee41060()
{
  extern Class_Descriptor cd_ee41060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41060, buf);
    ee41060 *dp, &lv = *(dp=new (buf) ee41060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee41060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee41060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(16,12), "ee41060");
    check_base_class_offset(lv, (dd1060*), 0, "ee41060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41060.e");
    test_class_info(&lv, &cd_ee41060);
    dp->~ee41060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41060(Test_ee41060, "ee41060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41060C1Ev();
extern void _ZN7ee41060D1Ev();
Name_Map name_map_ee41060[] = {
  NSPAIR(_ZN7ee41060C1Ev),
  NSPAIR(_ZN7ee41060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee41060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41060[];
extern void _ZN7ee410603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee410603barEv,_ZTv0_n12_N7ee410603barEv)();
extern void ABISELECT(_ZThn16_N7ee410603barEv,_ZThn12_N7ee410603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee41060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41060[0]),
  (VTBL_ENTRY)&_ZN7ee410603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee410603barEv,_ZTv0_n12_N7ee410603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee41060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee41060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee41060[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee41060[] = {
  {&(_ZTV7ee41060[3]),  3,10},
  {&(_tg__ZTV6dd1060__7ee41060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee41060[4]),  4,6},
  {&(_ZTV7ee41060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41060[];
extern  VTBL_ENTRY _ZTV7ee41060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41060[];
static VTBL_ENTRY alt_thunk_names6[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee410603barEv,_ZTv0_n12_N7ee410603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee410603barEv,_ZThn12_N7ee410603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41060 = {  "ee41060", // class name
  bases_ee41060, 4,
  &(vtc_ee41060[0]), // expected_vtbl_contents
  &(vtt_ee41060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names6,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51060  : virtual dd1060 {
  int e;
  virtual void  bar(); // _ZN7ee510603barEv
  ~ee51060(); // tgen
  ee51060(); // tgen
};
//SIG(1 ee51060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee51060 ::bar(){vfunc_called(this, "_ZN7ee510603barEv");}
ee51060 ::~ee51060(){ note_dtor("ee51060", this);} // tgen
ee51060 ::ee51060(){ note_ctor("ee51060", this);} // tgen

static void Test_ee51060()
{
  extern Class_Descriptor cd_ee51060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51060, buf);
    ee51060 *dp, &lv = *(dp=new (buf) ee51060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee51060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee51060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(32,16), "ee51060");
    check_base_class_offset(lv, (dd1060*), ABISELECT(16,8), "ee51060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51060.e");
    test_class_info(&lv, &cd_ee51060);
    dp->~ee51060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51060(Test_ee51060, "ee51060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51060C1Ev();
extern void _ZN7ee51060D1Ev();
Name_Map name_map_ee51060[] = {
  NSPAIR(_ZN7ee51060C1Ev),
  NSPAIR(_ZN7ee51060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee51060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51060[];
extern void _ZN7ee510603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee510603barEv,_ZTv0_n12_N7ee510603barEv)();
extern void ABISELECT(_ZThn32_N7ee510603barEv,_ZThn16_N7ee510603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee51060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51060[0]),
  (VTBL_ENTRY)&_ZN7ee510603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51060[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee510603barEv,_ZTv0_n12_N7ee510603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee51060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee51060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee51060[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee51060[] = {
  {&(_ZTV7ee51060[4]),  4,14},
  {&(_ZTV7ee51060[8]),  8,14},
  {&(_ZTV7ee51060[12]),  12,14},
  {&(_tg__ZTV6dd1060__7ee51060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee51060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51060[];
extern  VTBL_ENTRY _ZTV7ee51060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51060[];
static VTBL_ENTRY alt_thunk_names7[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee510603barEv,_ZTv0_n12_N7ee510603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee510603barEv,_ZThn16_N7ee510603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51060 = {  "ee51060", // class name
  bases_ee51060, 4,
  &(vtc_ee51060[0]), // expected_vtbl_contents
  &(vtt_ee51060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51060),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names7,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61060  : dd1060 {
  int e;
  virtual void  foo(); // _ZN7ee610603fooEv
  virtual void  bar(); // _ZN7ee610603barEv
  ~ee61060(); // tgen
  ee61060(); // tgen
};
//SIG(1 ee61060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee61060 ::foo(){vfunc_called(this, "_ZN7ee610603fooEv");}
void  ee61060 ::bar(){vfunc_called(this, "_ZN7ee610603barEv");}
ee61060 ::~ee61060(){ note_dtor("ee61060", this);} // tgen
ee61060 ::ee61060(){ note_ctor("ee61060", this);} // tgen

static void Test_ee61060()
{
  extern Class_Descriptor cd_ee61060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61060, buf);
    ee61060 *dp, &lv = *(dp=new (buf) ee61060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee61060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee61060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(16,12), "ee61060");
    check_base_class_offset(lv, (dd1060*), 0, "ee61060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61060.e");
    test_class_info(&lv, &cd_ee61060);
    dp->~ee61060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61060(Test_ee61060, "ee61060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61060C1Ev();
extern void _ZN7ee61060D1Ev();
Name_Map name_map_ee61060[] = {
  NSPAIR(_ZN7ee61060C1Ev),
  NSPAIR(_ZN7ee61060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee61060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61060[];
extern void _ZN7ee610603fooEv();
extern void _ZN7ee610603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee610603barEv,_ZTv0_n12_N7ee610603barEv)();
extern void ABISELECT(_ZThn16_N7ee610603barEv,_ZThn12_N7ee610603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee610603fooEv,_ZTv0_n16_N7ee610603fooEv)();
extern void ABISELECT(_ZThn16_N7ee610603fooEv,_ZThn12_N7ee610603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61060[0]),
  (VTBL_ENTRY)&_ZN7ee610603fooEv,
  (VTBL_ENTRY)&_ZN7ee610603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee610603barEv,_ZTv0_n12_N7ee610603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee610603fooEv,_ZTv0_n16_N7ee610603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee61060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee61060[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee61060[] = {
  {&(_ZTV7ee61060[3]),  3,11},
  {&(_tg__ZTV6dd1060__7ee61060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee61060[4]),  4,6},
  {&(_ZTV7ee61060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61060[];
extern  VTBL_ENTRY _ZTV7ee61060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61060[];
static VTBL_ENTRY alt_thunk_names8[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee610603fooEv,_ZTv0_n16_N7ee610603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee610603fooEv,_ZThn12_N7ee610603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee610603barEv,_ZTv0_n12_N7ee610603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee610603barEv,_ZThn12_N7ee610603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61060 = {  "ee61060", // class name
  bases_ee61060, 4,
  &(vtc_ee61060[0]), // expected_vtbl_contents
  &(vtt_ee61060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names8,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71060  : virtual dd1060 {
  int e;
  virtual void  foo(); // _ZN7ee710603fooEv
  virtual void  bar(); // _ZN7ee710603barEv
  ~ee71060(); // tgen
  ee71060(); // tgen
};
//SIG(1 ee71060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee71060 ::foo(){vfunc_called(this, "_ZN7ee710603fooEv");}
void  ee71060 ::bar(){vfunc_called(this, "_ZN7ee710603barEv");}
ee71060 ::~ee71060(){ note_dtor("ee71060", this);} // tgen
ee71060 ::ee71060(){ note_ctor("ee71060", this);} // tgen

static void Test_ee71060()
{
  extern Class_Descriptor cd_ee71060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71060, buf);
    ee71060 *dp, &lv = *(dp=new (buf) ee71060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee71060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee71060");
    check_base_class_offset(lv, (cc060*)(dd1060*), ABISELECT(32,16), "ee71060");
    check_base_class_offset(lv, (dd1060*), ABISELECT(16,8), "ee71060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71060.e");
    test_class_info(&lv, &cd_ee71060);
    dp->~ee71060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71060(Test_ee71060, "ee71060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71060C1Ev();
extern void _ZN7ee71060D1Ev();
Name_Map name_map_ee71060[] = {
  NSPAIR(_ZN7ee71060C1Ev),
  NSPAIR(_ZN7ee71060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd1060;
extern VTBL_ENTRY _ZTI6dd1060[];
extern  VTBL_ENTRY _ZTV6dd1060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1060[];
static Base_Class bases_ee71060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1060,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71060[];
extern void _ZN7ee710603fooEv();
extern void _ZN7ee710603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee710603barEv,_ZTv0_n12_N7ee710603barEv)();
extern void ABISELECT(_ZThn32_N7ee710603barEv,_ZThn16_N7ee710603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee710603fooEv,_ZTv0_n16_N7ee710603fooEv)();
extern void ABISELECT(_ZThn32_N7ee710603fooEv,_ZThn16_N7ee710603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71060[0]),
  (VTBL_ENTRY)&_ZN7ee710603fooEv,
  (VTBL_ENTRY)&_ZN7ee710603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71060[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee710603barEv,_ZTv0_n12_N7ee710603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee710603fooEv,_ZTv0_n16_N7ee710603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71060[];
static  VTBL_ENTRY _tg__ZTV6dd1060__7ee71060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd1060__7ee71060[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee71060[] = {
  {&(_ZTV7ee71060[4]),  4,15},
  {&(_ZTV7ee71060[9]),  9,15},
  {&(_ZTV7ee71060[13]),  13,15},
  {&(_tg__ZTV6dd1060__7ee71060[3]),  3,3},
  {&(_tg__ZTV4bb605cc060__6dd1060__7ee71060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71060[];
extern  VTBL_ENTRY _ZTV7ee71060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71060[];
static VTBL_ENTRY alt_thunk_names9[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee710603fooEv,_ZTv0_n16_N7ee710603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee710603fooEv,_ZThn16_N7ee710603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee710603barEv,_ZTv0_n12_N7ee710603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee710603barEv,_ZThn16_N7ee710603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71060 = {  "ee71060", // class name
  bases_ee71060, 4,
  &(vtc_ee71060[0]), // expected_vtbl_contents
  &(vtt_ee71060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71060),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names9,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2060  : cc060 {
  int d;
  virtual void  foo(); // _ZN6dd20603fooEv
  ~dd2060(); // tgen
  dd2060(); // tgen
};
//SIG(-1 dd2060) C1{ BC2{ BC3{ BC4{ Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd2060 ::foo(){vfunc_called(this, "_ZN6dd20603fooEv");}
dd2060 ::~dd2060(){ note_dtor("dd2060", this);} // tgen
dd2060 ::dd2060(){ note_ctor("dd2060", this);} // tgen

static void Test_dd2060()
{
  extern Class_Descriptor cd_dd2060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2060, buf);
    dd2060 *dp, &lv = *(dp=new (buf) dd2060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(8,4), "dd2060");
    check_base_class_offset(lv, (bb60*)(cc060*), 0, "dd2060");
    check_base_class_offset(lv, (cc060*), 0, "dd2060");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2060.d");
    test_class_info(&lv, &cd_dd2060);
    dp->~dd2060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2060(Test_dd2060, "dd2060", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2060C1Ev();
extern void _ZN6dd2060D1Ev();
Name_Map name_map_dd2060[] = {
  NSPAIR(_ZN6dd2060C1Ev),
  NSPAIR(_ZN6dd2060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd2060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd2060[];
extern void _ZN4bb603barEv();
extern void _ZN6dd20603fooEv();
static  VTBL_ENTRY vtc_dd2060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN6dd20603fooEv,
};
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
Class_Descriptor cd_dd2060 = {  "dd2060", // class name
  bases_dd2060, 3,
  &(vtc_dd2060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2060),4, //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  ee02060  : dd2060 {
  int e;
  ~ee02060(); // tgen
  ee02060(); // tgen
};
//SIG(1 ee02060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee02060 ::~ee02060(){ note_dtor("ee02060", this);} // tgen
ee02060 ::ee02060(){ note_ctor("ee02060", this);} // tgen

static void Test_ee02060()
{
  extern Class_Descriptor cd_ee02060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02060, buf);
    ee02060 *dp, &lv = *(dp=new (buf) ee02060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(8,4), "ee02060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), 0, "ee02060");
    check_base_class_offset(lv, (cc060*)(dd2060*), 0, "ee02060");
    check_base_class_offset(lv, (dd2060*), 0, "ee02060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02060.e");
    test_class_info(&lv, &cd_ee02060);
    dp->~ee02060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02060(Test_ee02060, "ee02060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02060C1Ev();
extern void _ZN7ee02060D1Ev();
Name_Map name_map_ee02060[] = {
  NSPAIR(_ZN7ee02060C1Ev),
  NSPAIR(_ZN7ee02060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee02060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02060[];
extern void _ZN4bb603barEv();
extern void _ZN6dd20603fooEv();
static  VTBL_ENTRY vtc_ee02060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN6dd20603fooEv,
};
extern VTBL_ENTRY _ZTI7ee02060[];
extern  VTBL_ENTRY _ZTV7ee02060[];
Class_Descriptor cd_ee02060 = {  "ee02060", // class name
  bases_ee02060, 4,
  &(vtc_ee02060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02060),4, //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  ee12060  : virtual dd2060 {
  int e;
  ~ee12060(); // tgen
  ee12060(); // tgen
};
//SIG(1 ee12060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee12060 ::~ee12060(){ note_dtor("ee12060", this);} // tgen
ee12060 ::ee12060(){ note_ctor("ee12060", this);} // tgen

static void Test_ee12060()
{
  extern Class_Descriptor cd_ee12060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12060, buf);
    ee12060 *dp, &lv = *(dp=new (buf) ee12060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(24,12), "ee12060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), ABISELECT(16,8), "ee12060");
    check_base_class_offset(lv, (cc060*)(dd2060*), ABISELECT(16,8), "ee12060");
    check_base_class_offset(lv, (dd2060*), ABISELECT(16,8), "ee12060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12060.e");
    test_class_info(&lv, &cd_ee12060);
    dp->~ee12060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12060(Test_ee12060, "ee12060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12060C1Ev();
extern void _ZN7ee12060D1Ev();
Name_Map name_map_ee12060[] = {
  NSPAIR(_ZN7ee12060C1Ev),
  NSPAIR(_ZN7ee12060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee12060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12060[];
extern void _ZN4bb603barEv();
extern void _ZN6dd20603fooEv();
static  VTBL_ENTRY vtc_ee12060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12060[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN6dd20603fooEv,
};
extern VTBL_ENTRY _ZTV7ee12060[];
static  VTT_ENTRY vtt_ee12060[] = {
  {&(_ZTV7ee12060[3]),  3,9},
  {&(_ZTV7ee12060[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12060[];
extern  VTBL_ENTRY _ZTV7ee12060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12060[];
Class_Descriptor cd_ee12060 = {  "ee12060", // class name
  bases_ee12060, 4,
  &(vtc_ee12060[0]), // expected_vtbl_contents
  &(vtt_ee12060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12060),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12060),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  ee22060  : dd2060 {
  int e;
  virtual void  foo(); // _ZN7ee220603fooEv
  ~ee22060(); // tgen
  ee22060(); // tgen
};
//SIG(1 ee22060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee22060 ::foo(){vfunc_called(this, "_ZN7ee220603fooEv");}
ee22060 ::~ee22060(){ note_dtor("ee22060", this);} // tgen
ee22060 ::ee22060(){ note_ctor("ee22060", this);} // tgen

static void Test_ee22060()
{
  extern Class_Descriptor cd_ee22060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22060, buf);
    ee22060 *dp, &lv = *(dp=new (buf) ee22060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(8,4), "ee22060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), 0, "ee22060");
    check_base_class_offset(lv, (cc060*)(dd2060*), 0, "ee22060");
    check_base_class_offset(lv, (dd2060*), 0, "ee22060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22060.e");
    test_class_info(&lv, &cd_ee22060);
    dp->~ee22060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22060(Test_ee22060, "ee22060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22060C1Ev();
extern void _ZN7ee22060D1Ev();
Name_Map name_map_ee22060[] = {
  NSPAIR(_ZN7ee22060C1Ev),
  NSPAIR(_ZN7ee22060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee22060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee22060[];
extern void _ZN4bb603barEv();
extern void _ZN7ee220603fooEv();
static  VTBL_ENTRY vtc_ee22060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN7ee220603fooEv,
};
extern VTBL_ENTRY _ZTI7ee22060[];
extern  VTBL_ENTRY _ZTV7ee22060[];
Class_Descriptor cd_ee22060 = {  "ee22060", // class name
  bases_ee22060, 4,
  &(vtc_ee22060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22060),4, //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  ee32060  : virtual dd2060 {
  int e;
  virtual void  foo(); // _ZN7ee320603fooEv
  ~ee32060(); // tgen
  ee32060(); // tgen
};
//SIG(1 ee32060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee32060 ::foo(){vfunc_called(this, "_ZN7ee320603fooEv");}
ee32060 ::~ee32060(){ note_dtor("ee32060", this);} // tgen
ee32060 ::ee32060(){ note_ctor("ee32060", this);} // tgen

static void Test_ee32060()
{
  extern Class_Descriptor cd_ee32060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32060, buf);
    ee32060 *dp, &lv = *(dp=new (buf) ee32060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(24,12), "ee32060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), ABISELECT(16,8), "ee32060");
    check_base_class_offset(lv, (cc060*)(dd2060*), ABISELECT(16,8), "ee32060");
    check_base_class_offset(lv, (dd2060*), ABISELECT(16,8), "ee32060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32060.e");
    test_class_info(&lv, &cd_ee32060);
    dp->~ee32060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32060(Test_ee32060, "ee32060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32060C1Ev();
extern void _ZN7ee32060D1Ev();
Name_Map name_map_ee32060[] = {
  NSPAIR(_ZN7ee32060C1Ev),
  NSPAIR(_ZN7ee32060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee32060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32060[];
extern void _ZN7ee320603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee320603fooEv,_ZTv0_n16_N7ee320603fooEv)();
extern void ABISELECT(_ZThn16_N7ee320603fooEv,_ZThn8_N7ee320603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32060[0]),
  (VTBL_ENTRY)&_ZN7ee320603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee320603fooEv,_ZTv0_n16_N7ee320603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32060[];
static  VTT_ENTRY vtt_ee32060[] = {
  {&(_ZTV7ee32060[3]),  3,10},
  {&(_ZTV7ee32060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32060[];
extern  VTBL_ENTRY _ZTV7ee32060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32060[];
static VTBL_ENTRY alt_thunk_names10[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee320603fooEv,_ZTv0_n16_N7ee320603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee320603fooEv,_ZThn8_N7ee320603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32060 = {  "ee32060", // class name
  bases_ee32060, 4,
  &(vtc_ee32060[0]), // expected_vtbl_contents
  &(vtt_ee32060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names10,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42060  : dd2060 {
  int e;
  virtual void  bar(); // _ZN7ee420603barEv
  ~ee42060(); // tgen
  ee42060(); // tgen
};
//SIG(1 ee42060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee42060 ::bar(){vfunc_called(this, "_ZN7ee420603barEv");}
ee42060 ::~ee42060(){ note_dtor("ee42060", this);} // tgen
ee42060 ::ee42060(){ note_ctor("ee42060", this);} // tgen

static void Test_ee42060()
{
  extern Class_Descriptor cd_ee42060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42060, buf);
    ee42060 *dp, &lv = *(dp=new (buf) ee42060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(8,4), "ee42060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), 0, "ee42060");
    check_base_class_offset(lv, (cc060*)(dd2060*), 0, "ee42060");
    check_base_class_offset(lv, (dd2060*), 0, "ee42060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42060.e");
    test_class_info(&lv, &cd_ee42060);
    dp->~ee42060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42060(Test_ee42060, "ee42060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42060C1Ev();
extern void _ZN7ee42060D1Ev();
Name_Map name_map_ee42060[] = {
  NSPAIR(_ZN7ee42060C1Ev),
  NSPAIR(_ZN7ee42060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee42060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee42060[];
extern void _ZN7ee420603barEv();
extern void _ZN6dd20603fooEv();
static  VTBL_ENTRY vtc_ee42060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42060[0]),
  (VTBL_ENTRY)&_ZN7ee420603barEv,
  (VTBL_ENTRY)&_ZN6dd20603fooEv,
};
extern VTBL_ENTRY _ZTI7ee42060[];
extern  VTBL_ENTRY _ZTV7ee42060[];
Class_Descriptor cd_ee42060 = {  "ee42060", // class name
  bases_ee42060, 4,
  &(vtc_ee42060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42060),4, //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  ee52060  : virtual dd2060 {
  int e;
  virtual void  bar(); // _ZN7ee520603barEv
  ~ee52060(); // tgen
  ee52060(); // tgen
};
//SIG(1 ee52060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee52060 ::bar(){vfunc_called(this, "_ZN7ee520603barEv");}
ee52060 ::~ee52060(){ note_dtor("ee52060", this);} // tgen
ee52060 ::ee52060(){ note_ctor("ee52060", this);} // tgen

static void Test_ee52060()
{
  extern Class_Descriptor cd_ee52060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52060, buf);
    ee52060 *dp, &lv = *(dp=new (buf) ee52060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(24,12), "ee52060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), ABISELECT(16,8), "ee52060");
    check_base_class_offset(lv, (cc060*)(dd2060*), ABISELECT(16,8), "ee52060");
    check_base_class_offset(lv, (dd2060*), ABISELECT(16,8), "ee52060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52060.e");
    test_class_info(&lv, &cd_ee52060);
    dp->~ee52060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52060(Test_ee52060, "ee52060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52060C1Ev();
extern void _ZN7ee52060D1Ev();
Name_Map name_map_ee52060[] = {
  NSPAIR(_ZN7ee52060C1Ev),
  NSPAIR(_ZN7ee52060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee52060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52060[];
extern void _ZN7ee520603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee520603barEv,_ZTv0_n12_N7ee520603barEv)();
extern void ABISELECT(_ZThn16_N7ee520603barEv,_ZThn8_N7ee520603barEv)() __attribute__((weak));
extern void _ZN6dd20603fooEv();
static  VTBL_ENTRY vtc_ee52060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52060[0]),
  (VTBL_ENTRY)&_ZN7ee520603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee520603barEv,_ZTv0_n12_N7ee520603barEv),
  (VTBL_ENTRY)&_ZN6dd20603fooEv,
};
extern VTBL_ENTRY _ZTV7ee52060[];
static  VTT_ENTRY vtt_ee52060[] = {
  {&(_ZTV7ee52060[3]),  3,10},
  {&(_ZTV7ee52060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52060[];
extern  VTBL_ENTRY _ZTV7ee52060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52060[];
static VTBL_ENTRY alt_thunk_names11[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee520603barEv,_ZTv0_n12_N7ee520603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee520603barEv,_ZThn8_N7ee520603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52060 = {  "ee52060", // class name
  bases_ee52060, 4,
  &(vtc_ee52060[0]), // expected_vtbl_contents
  &(vtt_ee52060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names11,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62060  : dd2060 {
  int e;
  virtual void  foo(); // _ZN7ee620603fooEv
  virtual void  bar(); // _ZN7ee620603barEv
  ~ee62060(); // tgen
  ee62060(); // tgen
};
//SIG(1 ee62060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee62060 ::foo(){vfunc_called(this, "_ZN7ee620603fooEv");}
void  ee62060 ::bar(){vfunc_called(this, "_ZN7ee620603barEv");}
ee62060 ::~ee62060(){ note_dtor("ee62060", this);} // tgen
ee62060 ::ee62060(){ note_ctor("ee62060", this);} // tgen

static void Test_ee62060()
{
  extern Class_Descriptor cd_ee62060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62060, buf);
    ee62060 *dp, &lv = *(dp=new (buf) ee62060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(8,4), "ee62060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), 0, "ee62060");
    check_base_class_offset(lv, (cc060*)(dd2060*), 0, "ee62060");
    check_base_class_offset(lv, (dd2060*), 0, "ee62060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62060.e");
    test_class_info(&lv, &cd_ee62060);
    dp->~ee62060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62060(Test_ee62060, "ee62060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62060C1Ev();
extern void _ZN7ee62060D1Ev();
Name_Map name_map_ee62060[] = {
  NSPAIR(_ZN7ee62060C1Ev),
  NSPAIR(_ZN7ee62060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee62060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee62060[];
extern void _ZN7ee620603barEv();
extern void _ZN7ee620603fooEv();
static  VTBL_ENTRY vtc_ee62060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62060[0]),
  (VTBL_ENTRY)&_ZN7ee620603barEv,
  (VTBL_ENTRY)&_ZN7ee620603fooEv,
};
extern VTBL_ENTRY _ZTI7ee62060[];
extern  VTBL_ENTRY _ZTV7ee62060[];
Class_Descriptor cd_ee62060 = {  "ee62060", // class name
  bases_ee62060, 4,
  &(vtc_ee62060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62060),4, //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  ee72060  : virtual dd2060 {
  int e;
  virtual void  foo(); // _ZN7ee720603fooEv
  virtual void  bar(); // _ZN7ee720603barEv
  ~ee72060(); // tgen
  ee72060(); // tgen
};
//SIG(1 ee72060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee72060 ::foo(){vfunc_called(this, "_ZN7ee720603fooEv");}
void  ee72060 ::bar(){vfunc_called(this, "_ZN7ee720603barEv");}
ee72060 ::~ee72060(){ note_dtor("ee72060", this);} // tgen
ee72060 ::ee72060(){ note_ctor("ee72060", this);} // tgen

static void Test_ee72060()
{
  extern Class_Descriptor cd_ee72060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72060, buf);
    ee72060 *dp, &lv = *(dp=new (buf) ee72060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd2060*), ABISELECT(24,12), "ee72060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd2060*), ABISELECT(16,8), "ee72060");
    check_base_class_offset(lv, (cc060*)(dd2060*), ABISELECT(16,8), "ee72060");
    check_base_class_offset(lv, (dd2060*), ABISELECT(16,8), "ee72060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72060.e");
    test_class_info(&lv, &cd_ee72060);
    dp->~ee72060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72060(Test_ee72060, "ee72060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72060C1Ev();
extern void _ZN7ee72060D1Ev();
Name_Map name_map_ee72060[] = {
  NSPAIR(_ZN7ee72060C1Ev),
  NSPAIR(_ZN7ee72060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd2060;
extern VTBL_ENTRY _ZTI6dd2060[];
extern  VTBL_ENTRY _ZTV6dd2060[];
static Base_Class bases_ee72060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2060,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72060[];
extern void _ZN7ee720603fooEv();
extern void _ZN7ee720603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee720603barEv,_ZTv0_n12_N7ee720603barEv)();
extern void ABISELECT(_ZThn16_N7ee720603barEv,_ZThn8_N7ee720603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee720603fooEv,_ZTv0_n16_N7ee720603fooEv)();
extern void ABISELECT(_ZThn16_N7ee720603fooEv,_ZThn8_N7ee720603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72060[0]),
  (VTBL_ENTRY)&_ZN7ee720603fooEv,
  (VTBL_ENTRY)&_ZN7ee720603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee720603barEv,_ZTv0_n12_N7ee720603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee720603fooEv,_ZTv0_n16_N7ee720603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72060[];
static  VTT_ENTRY vtt_ee72060[] = {
  {&(_ZTV7ee72060[3]),  3,11},
  {&(_ZTV7ee72060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72060[];
extern  VTBL_ENTRY _ZTV7ee72060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72060[];
static VTBL_ENTRY alt_thunk_names12[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee720603fooEv,_ZTv0_n16_N7ee720603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee720603fooEv,_ZThn8_N7ee720603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee720603barEv,_ZTv0_n12_N7ee720603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee720603barEv,_ZThn8_N7ee720603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72060 = {  "ee72060", // class name
  bases_ee72060, 4,
  &(vtc_ee72060[0]), // expected_vtbl_contents
  &(vtt_ee72060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names12,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3060  : virtual cc060 {
  int d;
  virtual void  foo(); // _ZN6dd30603fooEv
  ~dd3060(); // tgen
  dd3060(); // tgen
};
//SIG(-1 dd3060) C1{ VBC2{ BC3{ BC4{ Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd3060 ::foo(){vfunc_called(this, "_ZN6dd30603fooEv");}
dd3060 ::~dd3060(){ note_dtor("dd3060", this);} // tgen
dd3060 ::dd3060(){ note_ctor("dd3060", this);} // tgen

static void Test_dd3060()
{
  extern Class_Descriptor cd_dd3060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3060, buf);
    dd3060 *dp, &lv = *(dp=new (buf) dd3060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,12), "dd3060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,8), "dd3060");
    check_base_class_offset(lv, (cc060*), ABISELECT(16,8), "dd3060");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3060.d");
    test_class_info(&lv, &cd_dd3060);
    dp->~dd3060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3060(Test_dd3060, "dd3060", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3060C1Ev();
extern void _ZN6dd3060D1Ev();
Name_Map name_map_dd3060[] = {
  NSPAIR(_ZN6dd3060C1Ev),
  NSPAIR(_ZN6dd3060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd3060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3060[];
extern void _ZN6dd30603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3060[];
static  VTT_ENTRY vtt_dd3060[] = {
  {&(_ZTV6dd3060[3]),  3,10},
  {&(_ZTV6dd3060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static VTBL_ENTRY alt_thunk_names13[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3060 = {  "dd3060", // class name
  bases_dd3060, 3,
  &(vtc_dd3060[0]), // expected_vtbl_contents
  &(vtt_dd3060[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3060),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names13,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03060  : dd3060 {
  int e;
  ~ee03060(); // tgen
  ee03060(); // tgen
};
//SIG(1 ee03060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee03060 ::~ee03060(){ note_dtor("ee03060", this);} // tgen
ee03060 ::ee03060(){ note_ctor("ee03060", this);} // tgen

static void Test_ee03060()
{
  extern Class_Descriptor cd_ee03060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03060, buf);
    ee03060 *dp, &lv = *(dp=new (buf) ee03060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee03060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee03060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(16,12), "ee03060");
    check_base_class_offset(lv, (dd3060*), 0, "ee03060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03060.e");
    test_class_info(&lv, &cd_ee03060);
    dp->~ee03060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03060(Test_ee03060, "ee03060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03060C1Ev();
extern void _ZN7ee03060D1Ev();
Name_Map name_map_ee03060[] = {
  NSPAIR(_ZN7ee03060C1Ev),
  NSPAIR(_ZN7ee03060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee03060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03060[];
extern void _ZN6dd30603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee03060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee03060[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee03060[] = {
  {&(_ZTV7ee03060[3]),  3,10},
  {&(_tg__ZTV6dd3060__7ee03060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee03060[4]),  4,6},
  {&(_ZTV7ee03060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03060[];
extern  VTBL_ENTRY _ZTV7ee03060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03060[];
static VTBL_ENTRY alt_thunk_names14[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03060 = {  "ee03060", // class name
  bases_ee03060, 4,
  &(vtc_ee03060[0]), // expected_vtbl_contents
  &(vtt_ee03060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03060),4, //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  ee13060  : virtual dd3060 {
  int e;
  ~ee13060(); // tgen
  ee13060(); // tgen
};
//SIG(1 ee13060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee13060 ::~ee13060(){ note_dtor("ee13060", this);} // tgen
ee13060 ::ee13060(){ note_ctor("ee13060", this);} // tgen

static void Test_ee13060()
{
  extern Class_Descriptor cd_ee13060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13060, buf);
    ee13060 *dp, &lv = *(dp=new (buf) ee13060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee13060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee13060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(32,16), "ee13060");
    check_base_class_offset(lv, (dd3060*), ABISELECT(16,8), "ee13060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13060.e");
    test_class_info(&lv, &cd_ee13060);
    dp->~ee13060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13060(Test_ee13060, "ee13060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13060C1Ev();
extern void _ZN7ee13060D1Ev();
Name_Map name_map_ee13060[] = {
  NSPAIR(_ZN7ee13060C1Ev),
  NSPAIR(_ZN7ee13060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee13060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13060[];
extern void _ZN6dd30603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13060[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee13060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee13060[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee13060[] = {
  {&(_ZTV7ee13060[4]),  4,15},
  {&(_ZTV7ee13060[8]),  8,15},
  {&(_ZTV7ee13060[13]),  13,15},
  {&(_tg__ZTV6dd3060__7ee13060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee13060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13060[];
extern  VTBL_ENTRY _ZTV7ee13060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13060[];
static VTBL_ENTRY alt_thunk_names15[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13060 = {  "ee13060", // class name
  bases_ee13060, 4,
  &(vtc_ee13060[0]), // expected_vtbl_contents
  &(vtt_ee13060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13060),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13060),5, //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  ee23060  : dd3060 {
  int e;
  virtual void  foo(); // _ZN7ee230603fooEv
  ~ee23060(); // tgen
  ee23060(); // tgen
};
//SIG(1 ee23060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee23060 ::foo(){vfunc_called(this, "_ZN7ee230603fooEv");}
ee23060 ::~ee23060(){ note_dtor("ee23060", this);} // tgen
ee23060 ::ee23060(){ note_ctor("ee23060", this);} // tgen

static void Test_ee23060()
{
  extern Class_Descriptor cd_ee23060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23060, buf);
    ee23060 *dp, &lv = *(dp=new (buf) ee23060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee23060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee23060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(16,12), "ee23060");
    check_base_class_offset(lv, (dd3060*), 0, "ee23060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23060.e");
    test_class_info(&lv, &cd_ee23060);
    dp->~ee23060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23060(Test_ee23060, "ee23060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23060C1Ev();
extern void _ZN7ee23060D1Ev();
Name_Map name_map_ee23060[] = {
  NSPAIR(_ZN7ee23060C1Ev),
  NSPAIR(_ZN7ee23060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee23060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23060[];
extern void _ZN7ee230603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee230603fooEv,_ZTv0_n16_N7ee230603fooEv)();
extern void ABISELECT(_ZThn16_N7ee230603fooEv,_ZThn12_N7ee230603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23060[0]),
  (VTBL_ENTRY)&_ZN7ee230603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee230603fooEv,_ZTv0_n16_N7ee230603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee23060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee23060[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee23060[] = {
  {&(_ZTV7ee23060[3]),  3,10},
  {&(_tg__ZTV6dd3060__7ee23060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee23060[4]),  4,6},
  {&(_ZTV7ee23060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23060[];
extern  VTBL_ENTRY _ZTV7ee23060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23060[];
static VTBL_ENTRY alt_thunk_names16[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee230603fooEv,_ZTv0_n16_N7ee230603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee230603fooEv,_ZThn12_N7ee230603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23060 = {  "ee23060", // class name
  bases_ee23060, 4,
  &(vtc_ee23060[0]), // expected_vtbl_contents
  &(vtt_ee23060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23060),4, //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  ee33060  : virtual dd3060 {
  int e;
  virtual void  foo(); // _ZN7ee330603fooEv
  ~ee33060(); // tgen
  ee33060(); // tgen
};
//SIG(1 ee33060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee33060 ::foo(){vfunc_called(this, "_ZN7ee330603fooEv");}
ee33060 ::~ee33060(){ note_dtor("ee33060", this);} // tgen
ee33060 ::ee33060(){ note_ctor("ee33060", this);} // tgen

static void Test_ee33060()
{
  extern Class_Descriptor cd_ee33060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33060, buf);
    ee33060 *dp, &lv = *(dp=new (buf) ee33060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee33060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee33060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(32,16), "ee33060");
    check_base_class_offset(lv, (dd3060*), ABISELECT(16,8), "ee33060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33060.e");
    test_class_info(&lv, &cd_ee33060);
    dp->~ee33060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33060(Test_ee33060, "ee33060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33060C1Ev();
extern void _ZN7ee33060D1Ev();
Name_Map name_map_ee33060[] = {
  NSPAIR(_ZN7ee33060C1Ev),
  NSPAIR(_ZN7ee33060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee33060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33060[];
extern void _ZN7ee330603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee330603fooEv,_ZTv0_n16_N7ee330603fooEv)();
extern void ABISELECT(_ZThn16_N7ee330603fooEv,_ZThn8_N7ee330603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee330603fooEv,_ZTv0_n16_N7ee330603fooEv)();
extern void ABISELECT(_ZThn32_N7ee330603fooEv,_ZThn16_N7ee330603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33060[0]),
  (VTBL_ENTRY)&_ZN7ee330603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee330603fooEv,_ZTv0_n16_N7ee330603fooEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee330603fooEv,_ZTv0_n16_N7ee330603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee33060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee33060[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee33060[] = {
  {&(_ZTV7ee33060[4]),  4,16},
  {&(_ZTV7ee33060[9]),  9,16},
  {&(_ZTV7ee33060[14]),  14,16},
  {&(_tg__ZTV6dd3060__7ee33060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee33060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33060[];
extern  VTBL_ENTRY _ZTV7ee33060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33060[];
static VTBL_ENTRY alt_thunk_names17[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee330603fooEv,_ZTv0_n16_N7ee330603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee330603fooEv,_ZThn16_N7ee330603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee330603fooEv,_ZThn8_N7ee330603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33060 = {  "ee33060", // class name
  bases_ee33060, 4,
  &(vtc_ee33060[0]), // expected_vtbl_contents
  &(vtt_ee33060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33060),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33060),5, //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  ee43060  : dd3060 {
  int e;
  virtual void  bar(); // _ZN7ee430603barEv
  ~ee43060(); // tgen
  ee43060(); // tgen
};
//SIG(1 ee43060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee43060 ::bar(){vfunc_called(this, "_ZN7ee430603barEv");}
ee43060 ::~ee43060(){ note_dtor("ee43060", this);} // tgen
ee43060 ::ee43060(){ note_ctor("ee43060", this);} // tgen

static void Test_ee43060()
{
  extern Class_Descriptor cd_ee43060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43060, buf);
    ee43060 *dp, &lv = *(dp=new (buf) ee43060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee43060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee43060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(16,12), "ee43060");
    check_base_class_offset(lv, (dd3060*), 0, "ee43060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43060.e");
    test_class_info(&lv, &cd_ee43060);
    dp->~ee43060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43060(Test_ee43060, "ee43060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43060C1Ev();
extern void _ZN7ee43060D1Ev();
Name_Map name_map_ee43060[] = {
  NSPAIR(_ZN7ee43060C1Ev),
  NSPAIR(_ZN7ee43060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee43060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43060[];
extern void _ZN6dd30603fooEv();
extern void _ZN7ee430603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee430603barEv,_ZTv0_n12_N7ee430603barEv)();
extern void ABISELECT(_ZThn16_N7ee430603barEv,_ZThn12_N7ee430603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
  (VTBL_ENTRY)&_ZN7ee430603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee430603barEv,_ZTv0_n12_N7ee430603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee43060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee43060[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee43060[] = {
  {&(_ZTV7ee43060[3]),  3,11},
  {&(_tg__ZTV6dd3060__7ee43060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee43060[4]),  4,6},
  {&(_ZTV7ee43060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43060[];
extern  VTBL_ENTRY _ZTV7ee43060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43060[];
static VTBL_ENTRY alt_thunk_names18[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee430603barEv,_ZTv0_n12_N7ee430603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee430603barEv,_ZThn12_N7ee430603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43060 = {  "ee43060", // class name
  bases_ee43060, 4,
  &(vtc_ee43060[0]), // expected_vtbl_contents
  &(vtt_ee43060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names18,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53060  : virtual dd3060 {
  int e;
  virtual void  bar(); // _ZN7ee530603barEv
  ~ee53060(); // tgen
  ee53060(); // tgen
};
//SIG(1 ee53060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee53060 ::bar(){vfunc_called(this, "_ZN7ee530603barEv");}
ee53060 ::~ee53060(){ note_dtor("ee53060", this);} // tgen
ee53060 ::ee53060(){ note_ctor("ee53060", this);} // tgen

static void Test_ee53060()
{
  extern Class_Descriptor cd_ee53060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53060, buf);
    ee53060 *dp, &lv = *(dp=new (buf) ee53060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee53060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee53060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(32,16), "ee53060");
    check_base_class_offset(lv, (dd3060*), ABISELECT(16,8), "ee53060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53060.e");
    test_class_info(&lv, &cd_ee53060);
    dp->~ee53060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53060(Test_ee53060, "ee53060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53060C1Ev();
extern void _ZN7ee53060D1Ev();
Name_Map name_map_ee53060[] = {
  NSPAIR(_ZN7ee53060C1Ev),
  NSPAIR(_ZN7ee53060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee53060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53060[];
extern void _ZN7ee530603barEv();
extern void _ZN6dd30603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee530603barEv,_ZTv0_n12_N7ee530603barEv)();
extern void ABISELECT(_ZThn32_N7ee530603barEv,_ZThn16_N7ee530603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53060[0]),
  (VTBL_ENTRY)&_ZN7ee530603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee530603barEv,_ZTv0_n12_N7ee530603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee53060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee53060[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee53060[] = {
  {&(_ZTV7ee53060[4]),  4,16},
  {&(_ZTV7ee53060[9]),  9,16},
  {&(_ZTV7ee53060[14]),  14,16},
  {&(_tg__ZTV6dd3060__7ee53060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee53060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53060[];
extern  VTBL_ENTRY _ZTV7ee53060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53060[];
static VTBL_ENTRY alt_thunk_names19[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee530603barEv,_ZTv0_n12_N7ee530603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee530603barEv,_ZThn16_N7ee530603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53060 = {  "ee53060", // class name
  bases_ee53060, 4,
  &(vtc_ee53060[0]), // expected_vtbl_contents
  &(vtt_ee53060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53060),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names19,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63060  : dd3060 {
  int e;
  virtual void  foo(); // _ZN7ee630603fooEv
  virtual void  bar(); // _ZN7ee630603barEv
  ~ee63060(); // tgen
  ee63060(); // tgen
};
//SIG(1 ee63060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee63060 ::foo(){vfunc_called(this, "_ZN7ee630603fooEv");}
void  ee63060 ::bar(){vfunc_called(this, "_ZN7ee630603barEv");}
ee63060 ::~ee63060(){ note_dtor("ee63060", this);} // tgen
ee63060 ::ee63060(){ note_ctor("ee63060", this);} // tgen

static void Test_ee63060()
{
  extern Class_Descriptor cd_ee63060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63060, buf);
    ee63060 *dp, &lv = *(dp=new (buf) ee63060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee63060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee63060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(16,12), "ee63060");
    check_base_class_offset(lv, (dd3060*), 0, "ee63060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63060.e");
    test_class_info(&lv, &cd_ee63060);
    dp->~ee63060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63060(Test_ee63060, "ee63060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63060C1Ev();
extern void _ZN7ee63060D1Ev();
Name_Map name_map_ee63060[] = {
  NSPAIR(_ZN7ee63060C1Ev),
  NSPAIR(_ZN7ee63060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee63060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63060[];
extern void _ZN7ee630603fooEv();
extern void _ZN7ee630603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee630603barEv,_ZTv0_n12_N7ee630603barEv)();
extern void ABISELECT(_ZThn16_N7ee630603barEv,_ZThn12_N7ee630603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee630603fooEv,_ZTv0_n16_N7ee630603fooEv)();
extern void ABISELECT(_ZThn16_N7ee630603fooEv,_ZThn12_N7ee630603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63060[0]),
  (VTBL_ENTRY)&_ZN7ee630603fooEv,
  (VTBL_ENTRY)&_ZN7ee630603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee630603barEv,_ZTv0_n12_N7ee630603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee630603fooEv,_ZTv0_n16_N7ee630603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee63060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee63060[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee63060[] = {
  {&(_ZTV7ee63060[3]),  3,11},
  {&(_tg__ZTV6dd3060__7ee63060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee63060[4]),  4,6},
  {&(_ZTV7ee63060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63060[];
extern  VTBL_ENTRY _ZTV7ee63060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63060[];
static VTBL_ENTRY alt_thunk_names20[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn12_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee630603fooEv,_ZTv0_n16_N7ee630603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee630603fooEv,_ZThn12_N7ee630603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee630603barEv,_ZTv0_n12_N7ee630603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee630603barEv,_ZThn12_N7ee630603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63060 = {  "ee63060", // class name
  bases_ee63060, 4,
  &(vtc_ee63060[0]), // expected_vtbl_contents
  &(vtt_ee63060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names20,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73060  : virtual dd3060 {
  int e;
  virtual void  foo(); // _ZN7ee730603fooEv
  virtual void  bar(); // _ZN7ee730603barEv
  ~ee73060(); // tgen
  ee73060(); // tgen
};
//SIG(1 ee73060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee73060 ::foo(){vfunc_called(this, "_ZN7ee730603fooEv");}
void  ee73060 ::bar(){vfunc_called(this, "_ZN7ee730603barEv");}
ee73060 ::~ee73060(){ note_dtor("ee73060", this);} // tgen
ee73060 ::ee73060(){ note_ctor("ee73060", this);} // tgen

static void Test_ee73060()
{
  extern Class_Descriptor cd_ee73060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73060, buf);
    ee73060 *dp, &lv = *(dp=new (buf) ee73060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee73060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee73060");
    check_base_class_offset(lv, (cc060*)(dd3060*), ABISELECT(32,16), "ee73060");
    check_base_class_offset(lv, (dd3060*), ABISELECT(16,8), "ee73060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73060.e");
    test_class_info(&lv, &cd_ee73060);
    dp->~ee73060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73060(Test_ee73060, "ee73060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73060C1Ev();
extern void _ZN7ee73060D1Ev();
Name_Map name_map_ee73060[] = {
  NSPAIR(_ZN7ee73060C1Ev),
  NSPAIR(_ZN7ee73060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd3060;
extern VTBL_ENTRY _ZTI6dd3060[];
extern  VTBL_ENTRY _ZTV6dd3060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3060[];
static Base_Class bases_ee73060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73060[];
extern void _ZN7ee730603fooEv();
extern void _ZN7ee730603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee730603fooEv,_ZTv0_n16_N7ee730603fooEv)();
extern void ABISELECT(_ZThn16_N7ee730603fooEv,_ZThn8_N7ee730603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee730603barEv,_ZTv0_n12_N7ee730603barEv)();
extern void ABISELECT(_ZThn32_N7ee730603barEv,_ZThn16_N7ee730603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee730603fooEv,_ZTv0_n16_N7ee730603fooEv)();
extern void ABISELECT(_ZThn32_N7ee730603fooEv,_ZThn16_N7ee730603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73060[0]),
  (VTBL_ENTRY)&_ZN7ee730603fooEv,
  (VTBL_ENTRY)&_ZN7ee730603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee730603fooEv,_ZTv0_n16_N7ee730603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee730603barEv,_ZTv0_n12_N7ee730603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee730603fooEv,_ZTv0_n16_N7ee730603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73060[];
extern void _ZN6dd30603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3060__7ee73060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN6dd30603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv)();
extern void ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd3060__7ee73060[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3060[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv),
};
static  VTT_ENTRY vtt_ee73060[] = {
  {&(_ZTV7ee73060[4]),  4,17},
  {&(_ZTV7ee73060[10]),  10,17},
  {&(_ZTV7ee73060[15]),  15,17},
  {&(_tg__ZTV6dd3060__7ee73060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd3060__7ee73060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73060[];
extern  VTBL_ENTRY _ZTV7ee73060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73060[];
static VTBL_ENTRY alt_thunk_names21[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd30603fooEv,_ZTv0_n16_N6dd30603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30603fooEv,_ZThn8_N6dd30603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee730603barEv,_ZTv0_n12_N7ee730603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee730603barEv,_ZThn16_N7ee730603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee730603fooEv,_ZTv0_n16_N7ee730603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee730603fooEv,_ZThn16_N7ee730603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee730603fooEv,_ZThn8_N7ee730603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73060 = {  "ee73060", // class name
  bases_ee73060, 4,
  &(vtc_ee73060[0]), // expected_vtbl_contents
  &(vtt_ee73060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73060),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names21,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4060  : cc060 {
  int d;
  virtual void  bar(); // _ZN6dd40603barEv
  ~dd4060(); // tgen
  dd4060(); // tgen
};
//SIG(-1 dd4060) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd4060 ::bar(){vfunc_called(this, "_ZN6dd40603barEv");}
dd4060 ::~dd4060(){ note_dtor("dd4060", this);} // tgen
dd4060 ::dd4060(){ note_ctor("dd4060", this);} // tgen

static void Test_dd4060()
{
  extern Class_Descriptor cd_dd4060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4060, buf);
    dd4060 *dp, &lv = *(dp=new (buf) dd4060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(8,4), "dd4060");
    check_base_class_offset(lv, (bb60*)(cc060*), 0, "dd4060");
    check_base_class_offset(lv, (cc060*), 0, "dd4060");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4060.d");
    test_class_info(&lv, &cd_dd4060);
    dp->~dd4060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4060(Test_dd4060, "dd4060", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4060C1Ev();
extern void _ZN6dd4060D1Ev();
Name_Map name_map_dd4060[] = {
  NSPAIR(_ZN6dd4060C1Ev),
  NSPAIR(_ZN6dd4060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd4060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd4060[];
extern void _ZN6dd40603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd4060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4060[0]),
  (VTBL_ENTRY)&_ZN6dd40603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
Class_Descriptor cd_dd4060 = {  "dd4060", // class name
  bases_dd4060, 3,
  &(vtc_dd4060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4060),4, //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  ee04060  : dd4060 {
  int e;
  ~ee04060(); // tgen
  ee04060(); // tgen
};
//SIG(1 ee04060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee04060 ::~ee04060(){ note_dtor("ee04060", this);} // tgen
ee04060 ::ee04060(){ note_ctor("ee04060", this);} // tgen

static void Test_ee04060()
{
  extern Class_Descriptor cd_ee04060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04060, buf);
    ee04060 *dp, &lv = *(dp=new (buf) ee04060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(8,4), "ee04060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), 0, "ee04060");
    check_base_class_offset(lv, (cc060*)(dd4060*), 0, "ee04060");
    check_base_class_offset(lv, (dd4060*), 0, "ee04060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04060.e");
    test_class_info(&lv, &cd_ee04060);
    dp->~ee04060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04060(Test_ee04060, "ee04060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04060C1Ev();
extern void _ZN7ee04060D1Ev();
Name_Map name_map_ee04060[] = {
  NSPAIR(_ZN7ee04060C1Ev),
  NSPAIR(_ZN7ee04060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee04060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04060[];
extern void _ZN6dd40603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee04060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04060[0]),
  (VTBL_ENTRY)&_ZN6dd40603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee04060[];
extern  VTBL_ENTRY _ZTV7ee04060[];
Class_Descriptor cd_ee04060 = {  "ee04060", // class name
  bases_ee04060, 4,
  &(vtc_ee04060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04060),4, //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  ee14060  : virtual dd4060 {
  int e;
  ~ee14060(); // tgen
  ee14060(); // tgen
};
//SIG(1 ee14060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee14060 ::~ee14060(){ note_dtor("ee14060", this);} // tgen
ee14060 ::ee14060(){ note_ctor("ee14060", this);} // tgen

static void Test_ee14060()
{
  extern Class_Descriptor cd_ee14060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14060, buf);
    ee14060 *dp, &lv = *(dp=new (buf) ee14060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(24,12), "ee14060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), ABISELECT(16,8), "ee14060");
    check_base_class_offset(lv, (cc060*)(dd4060*), ABISELECT(16,8), "ee14060");
    check_base_class_offset(lv, (dd4060*), ABISELECT(16,8), "ee14060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14060.e");
    test_class_info(&lv, &cd_ee14060);
    dp->~ee14060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14060(Test_ee14060, "ee14060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14060C1Ev();
extern void _ZN7ee14060D1Ev();
Name_Map name_map_ee14060[] = {
  NSPAIR(_ZN7ee14060C1Ev),
  NSPAIR(_ZN7ee14060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee14060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14060[];
extern void _ZN6dd40603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee14060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14060[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14060[0]),
  (VTBL_ENTRY)&_ZN6dd40603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee14060[];
static  VTT_ENTRY vtt_ee14060[] = {
  {&(_ZTV7ee14060[3]),  3,9},
  {&(_ZTV7ee14060[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14060[];
extern  VTBL_ENTRY _ZTV7ee14060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14060[];
Class_Descriptor cd_ee14060 = {  "ee14060", // class name
  bases_ee14060, 4,
  &(vtc_ee14060[0]), // expected_vtbl_contents
  &(vtt_ee14060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14060),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14060),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  ee24060  : dd4060 {
  int e;
  virtual void  foo(); // _ZN7ee240603fooEv
  ~ee24060(); // tgen
  ee24060(); // tgen
};
//SIG(1 ee24060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee24060 ::foo(){vfunc_called(this, "_ZN7ee240603fooEv");}
ee24060 ::~ee24060(){ note_dtor("ee24060", this);} // tgen
ee24060 ::ee24060(){ note_ctor("ee24060", this);} // tgen

static void Test_ee24060()
{
  extern Class_Descriptor cd_ee24060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24060, buf);
    ee24060 *dp, &lv = *(dp=new (buf) ee24060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(8,4), "ee24060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), 0, "ee24060");
    check_base_class_offset(lv, (cc060*)(dd4060*), 0, "ee24060");
    check_base_class_offset(lv, (dd4060*), 0, "ee24060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24060.e");
    test_class_info(&lv, &cd_ee24060);
    dp->~ee24060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24060(Test_ee24060, "ee24060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24060C1Ev();
extern void _ZN7ee24060D1Ev();
Name_Map name_map_ee24060[] = {
  NSPAIR(_ZN7ee24060C1Ev),
  NSPAIR(_ZN7ee24060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee24060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee24060[];
extern void _ZN6dd40603barEv();
extern void _ZN7ee240603fooEv();
static  VTBL_ENTRY vtc_ee24060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24060[0]),
  (VTBL_ENTRY)&_ZN6dd40603barEv,
  (VTBL_ENTRY)&_ZN7ee240603fooEv,
};
extern VTBL_ENTRY _ZTI7ee24060[];
extern  VTBL_ENTRY _ZTV7ee24060[];
Class_Descriptor cd_ee24060 = {  "ee24060", // class name
  bases_ee24060, 4,
  &(vtc_ee24060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24060),4, //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  ee34060  : virtual dd4060 {
  int e;
  virtual void  foo(); // _ZN7ee340603fooEv
  ~ee34060(); // tgen
  ee34060(); // tgen
};
//SIG(1 ee34060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee34060 ::foo(){vfunc_called(this, "_ZN7ee340603fooEv");}
ee34060 ::~ee34060(){ note_dtor("ee34060", this);} // tgen
ee34060 ::ee34060(){ note_ctor("ee34060", this);} // tgen

static void Test_ee34060()
{
  extern Class_Descriptor cd_ee34060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34060, buf);
    ee34060 *dp, &lv = *(dp=new (buf) ee34060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(24,12), "ee34060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), ABISELECT(16,8), "ee34060");
    check_base_class_offset(lv, (cc060*)(dd4060*), ABISELECT(16,8), "ee34060");
    check_base_class_offset(lv, (dd4060*), ABISELECT(16,8), "ee34060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34060.e");
    test_class_info(&lv, &cd_ee34060);
    dp->~ee34060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34060(Test_ee34060, "ee34060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34060C1Ev();
extern void _ZN7ee34060D1Ev();
Name_Map name_map_ee34060[] = {
  NSPAIR(_ZN7ee34060C1Ev),
  NSPAIR(_ZN7ee34060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee34060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34060[];
extern void _ZN7ee340603fooEv();
extern void _ZN6dd40603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee340603fooEv,_ZTv0_n16_N7ee340603fooEv)();
extern void ABISELECT(_ZThn16_N7ee340603fooEv,_ZThn8_N7ee340603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34060[0]),
  (VTBL_ENTRY)&_ZN7ee340603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34060[0]),
  (VTBL_ENTRY)&_ZN6dd40603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee340603fooEv,_ZTv0_n16_N7ee340603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34060[];
static  VTT_ENTRY vtt_ee34060[] = {
  {&(_ZTV7ee34060[3]),  3,10},
  {&(_ZTV7ee34060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34060[];
extern  VTBL_ENTRY _ZTV7ee34060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34060[];
static VTBL_ENTRY alt_thunk_names22[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee340603fooEv,_ZTv0_n16_N7ee340603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee340603fooEv,_ZThn8_N7ee340603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34060 = {  "ee34060", // class name
  bases_ee34060, 4,
  &(vtc_ee34060[0]), // expected_vtbl_contents
  &(vtt_ee34060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names22,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44060  : dd4060 {
  int e;
  virtual void  bar(); // _ZN7ee440603barEv
  ~ee44060(); // tgen
  ee44060(); // tgen
};
//SIG(1 ee44060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee44060 ::bar(){vfunc_called(this, "_ZN7ee440603barEv");}
ee44060 ::~ee44060(){ note_dtor("ee44060", this);} // tgen
ee44060 ::ee44060(){ note_ctor("ee44060", this);} // tgen

static void Test_ee44060()
{
  extern Class_Descriptor cd_ee44060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44060, buf);
    ee44060 *dp, &lv = *(dp=new (buf) ee44060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(8,4), "ee44060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), 0, "ee44060");
    check_base_class_offset(lv, (cc060*)(dd4060*), 0, "ee44060");
    check_base_class_offset(lv, (dd4060*), 0, "ee44060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44060.e");
    test_class_info(&lv, &cd_ee44060);
    dp->~ee44060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44060(Test_ee44060, "ee44060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44060C1Ev();
extern void _ZN7ee44060D1Ev();
Name_Map name_map_ee44060[] = {
  NSPAIR(_ZN7ee44060C1Ev),
  NSPAIR(_ZN7ee44060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee44060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee44060[];
extern void _ZN7ee440603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee44060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44060[0]),
  (VTBL_ENTRY)&_ZN7ee440603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee44060[];
extern  VTBL_ENTRY _ZTV7ee44060[];
Class_Descriptor cd_ee44060 = {  "ee44060", // class name
  bases_ee44060, 4,
  &(vtc_ee44060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44060),4, //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  ee54060  : virtual dd4060 {
  int e;
  virtual void  bar(); // _ZN7ee540603barEv
  ~ee54060(); // tgen
  ee54060(); // tgen
};
//SIG(1 ee54060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee54060 ::bar(){vfunc_called(this, "_ZN7ee540603barEv");}
ee54060 ::~ee54060(){ note_dtor("ee54060", this);} // tgen
ee54060 ::ee54060(){ note_ctor("ee54060", this);} // tgen

static void Test_ee54060()
{
  extern Class_Descriptor cd_ee54060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54060, buf);
    ee54060 *dp, &lv = *(dp=new (buf) ee54060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(24,12), "ee54060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), ABISELECT(16,8), "ee54060");
    check_base_class_offset(lv, (cc060*)(dd4060*), ABISELECT(16,8), "ee54060");
    check_base_class_offset(lv, (dd4060*), ABISELECT(16,8), "ee54060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54060.e");
    test_class_info(&lv, &cd_ee54060);
    dp->~ee54060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54060(Test_ee54060, "ee54060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54060C1Ev();
extern void _ZN7ee54060D1Ev();
Name_Map name_map_ee54060[] = {
  NSPAIR(_ZN7ee54060C1Ev),
  NSPAIR(_ZN7ee54060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee54060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54060[];
extern void _ZN7ee540603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee540603barEv,_ZTv0_n12_N7ee540603barEv)();
extern void ABISELECT(_ZThn16_N7ee540603barEv,_ZThn8_N7ee540603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee54060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54060[0]),
  (VTBL_ENTRY)&_ZN7ee540603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee540603barEv,_ZTv0_n12_N7ee540603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee54060[];
static  VTT_ENTRY vtt_ee54060[] = {
  {&(_ZTV7ee54060[3]),  3,10},
  {&(_ZTV7ee54060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54060[];
extern  VTBL_ENTRY _ZTV7ee54060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54060[];
static VTBL_ENTRY alt_thunk_names23[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee540603barEv,_ZTv0_n12_N7ee540603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee540603barEv,_ZThn8_N7ee540603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54060 = {  "ee54060", // class name
  bases_ee54060, 4,
  &(vtc_ee54060[0]), // expected_vtbl_contents
  &(vtt_ee54060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names23,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64060  : dd4060 {
  int e;
  virtual void  foo(); // _ZN7ee640603fooEv
  virtual void  bar(); // _ZN7ee640603barEv
  ~ee64060(); // tgen
  ee64060(); // tgen
};
//SIG(1 ee64060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee64060 ::foo(){vfunc_called(this, "_ZN7ee640603fooEv");}
void  ee64060 ::bar(){vfunc_called(this, "_ZN7ee640603barEv");}
ee64060 ::~ee64060(){ note_dtor("ee64060", this);} // tgen
ee64060 ::ee64060(){ note_ctor("ee64060", this);} // tgen

static void Test_ee64060()
{
  extern Class_Descriptor cd_ee64060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64060, buf);
    ee64060 *dp, &lv = *(dp=new (buf) ee64060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(8,4), "ee64060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), 0, "ee64060");
    check_base_class_offset(lv, (cc060*)(dd4060*), 0, "ee64060");
    check_base_class_offset(lv, (dd4060*), 0, "ee64060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64060.e");
    test_class_info(&lv, &cd_ee64060);
    dp->~ee64060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64060(Test_ee64060, "ee64060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64060C1Ev();
extern void _ZN7ee64060D1Ev();
Name_Map name_map_ee64060[] = {
  NSPAIR(_ZN7ee64060C1Ev),
  NSPAIR(_ZN7ee64060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee64060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee64060[];
extern void _ZN7ee640603barEv();
extern void _ZN7ee640603fooEv();
static  VTBL_ENTRY vtc_ee64060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64060[0]),
  (VTBL_ENTRY)&_ZN7ee640603barEv,
  (VTBL_ENTRY)&_ZN7ee640603fooEv,
};
extern VTBL_ENTRY _ZTI7ee64060[];
extern  VTBL_ENTRY _ZTV7ee64060[];
Class_Descriptor cd_ee64060 = {  "ee64060", // class name
  bases_ee64060, 4,
  &(vtc_ee64060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64060),4, //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  ee74060  : virtual dd4060 {
  int e;
  virtual void  foo(); // _ZN7ee740603fooEv
  virtual void  bar(); // _ZN7ee740603barEv
  ~ee74060(); // tgen
  ee74060(); // tgen
};
//SIG(1 ee74060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee74060 ::foo(){vfunc_called(this, "_ZN7ee740603fooEv");}
void  ee74060 ::bar(){vfunc_called(this, "_ZN7ee740603barEv");}
ee74060 ::~ee74060(){ note_dtor("ee74060", this);} // tgen
ee74060 ::ee74060(){ note_ctor("ee74060", this);} // tgen

static void Test_ee74060()
{
  extern Class_Descriptor cd_ee74060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74060, buf);
    ee74060 *dp, &lv = *(dp=new (buf) ee74060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd4060*), ABISELECT(24,12), "ee74060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd4060*), ABISELECT(16,8), "ee74060");
    check_base_class_offset(lv, (cc060*)(dd4060*), ABISELECT(16,8), "ee74060");
    check_base_class_offset(lv, (dd4060*), ABISELECT(16,8), "ee74060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74060.e");
    test_class_info(&lv, &cd_ee74060);
    dp->~ee74060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74060(Test_ee74060, "ee74060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74060C1Ev();
extern void _ZN7ee74060D1Ev();
Name_Map name_map_ee74060[] = {
  NSPAIR(_ZN7ee74060C1Ev),
  NSPAIR(_ZN7ee74060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd4060;
extern VTBL_ENTRY _ZTI6dd4060[];
extern  VTBL_ENTRY _ZTV6dd4060[];
static Base_Class bases_ee74060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4060,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74060[];
extern void _ZN7ee740603fooEv();
extern void _ZN7ee740603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee740603barEv,_ZTv0_n12_N7ee740603barEv)();
extern void ABISELECT(_ZThn16_N7ee740603barEv,_ZThn8_N7ee740603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee740603fooEv,_ZTv0_n16_N7ee740603fooEv)();
extern void ABISELECT(_ZThn16_N7ee740603fooEv,_ZThn8_N7ee740603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74060[0]),
  (VTBL_ENTRY)&_ZN7ee740603fooEv,
  (VTBL_ENTRY)&_ZN7ee740603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee740603barEv,_ZTv0_n12_N7ee740603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee740603fooEv,_ZTv0_n16_N7ee740603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74060[];
static  VTT_ENTRY vtt_ee74060[] = {
  {&(_ZTV7ee74060[3]),  3,11},
  {&(_ZTV7ee74060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74060[];
extern  VTBL_ENTRY _ZTV7ee74060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74060[];
static VTBL_ENTRY alt_thunk_names24[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee740603fooEv,_ZTv0_n16_N7ee740603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee740603fooEv,_ZThn8_N7ee740603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee740603barEv,_ZTv0_n12_N7ee740603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee740603barEv,_ZThn8_N7ee740603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74060 = {  "ee74060", // class name
  bases_ee74060, 4,
  &(vtc_ee74060[0]), // expected_vtbl_contents
  &(vtt_ee74060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names24,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5060  : virtual cc060 {
  int d;
  virtual void  bar(); // _ZN6dd50603barEv
  ~dd5060(); // tgen
  dd5060(); // tgen
};
//SIG(-1 dd5060) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd5060 ::bar(){vfunc_called(this, "_ZN6dd50603barEv");}
dd5060 ::~dd5060(){ note_dtor("dd5060", this);} // tgen
dd5060 ::dd5060(){ note_ctor("dd5060", this);} // tgen

static void Test_dd5060()
{
  extern Class_Descriptor cd_dd5060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5060, buf);
    dd5060 *dp, &lv = *(dp=new (buf) dd5060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,12), "dd5060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,8), "dd5060");
    check_base_class_offset(lv, (cc060*), ABISELECT(16,8), "dd5060");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5060.d");
    test_class_info(&lv, &cd_dd5060);
    dp->~dd5060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5060(Test_dd5060, "dd5060", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5060C1Ev();
extern void _ZN6dd5060D1Ev();
Name_Map name_map_dd5060[] = {
  NSPAIR(_ZN6dd5060C1Ev),
  NSPAIR(_ZN6dd5060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd5060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5060[];
extern void _ZN6dd50603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd5060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd5060[];
static  VTT_ENTRY vtt_dd5060[] = {
  {&(_ZTV6dd5060[3]),  3,10},
  {&(_ZTV6dd5060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static VTBL_ENTRY alt_thunk_names25[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5060 = {  "dd5060", // class name
  bases_dd5060, 3,
  &(vtc_dd5060[0]), // expected_vtbl_contents
  &(vtt_dd5060[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5060),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names25,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05060  : dd5060 {
  int e;
  ~ee05060(); // tgen
  ee05060(); // tgen
};
//SIG(1 ee05060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee05060 ::~ee05060(){ note_dtor("ee05060", this);} // tgen
ee05060 ::ee05060(){ note_ctor("ee05060", this);} // tgen

static void Test_ee05060()
{
  extern Class_Descriptor cd_ee05060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05060, buf);
    ee05060 *dp, &lv = *(dp=new (buf) ee05060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee05060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee05060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(16,12), "ee05060");
    check_base_class_offset(lv, (dd5060*), 0, "ee05060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05060.e");
    test_class_info(&lv, &cd_ee05060);
    dp->~ee05060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05060(Test_ee05060, "ee05060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05060C1Ev();
extern void _ZN7ee05060D1Ev();
Name_Map name_map_ee05060[] = {
  NSPAIR(_ZN7ee05060C1Ev),
  NSPAIR(_ZN7ee05060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee05060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05060[];
extern void _ZN6dd50603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee05060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee05060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee05060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee05060[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee05060[] = {
  {&(_ZTV7ee05060[3]),  3,10},
  {&(_tg__ZTV6dd5060__7ee05060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee05060[4]),  4,6},
  {&(_ZTV7ee05060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05060[];
extern  VTBL_ENTRY _ZTV7ee05060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05060[];
static VTBL_ENTRY alt_thunk_names26[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05060 = {  "ee05060", // class name
  bases_ee05060, 4,
  &(vtc_ee05060[0]), // expected_vtbl_contents
  &(vtt_ee05060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names26,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15060  : virtual dd5060 {
  int e;
  ~ee15060(); // tgen
  ee15060(); // tgen
};
//SIG(1 ee15060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee15060 ::~ee15060(){ note_dtor("ee15060", this);} // tgen
ee15060 ::ee15060(){ note_ctor("ee15060", this);} // tgen

static void Test_ee15060()
{
  extern Class_Descriptor cd_ee15060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15060, buf);
    ee15060 *dp, &lv = *(dp=new (buf) ee15060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee15060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee15060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(32,16), "ee15060");
    check_base_class_offset(lv, (dd5060*), ABISELECT(16,8), "ee15060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15060.e");
    test_class_info(&lv, &cd_ee15060);
    dp->~ee15060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15060(Test_ee15060, "ee15060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15060C1Ev();
extern void _ZN7ee15060D1Ev();
Name_Map name_map_ee15060[] = {
  NSPAIR(_ZN7ee15060C1Ev),
  NSPAIR(_ZN7ee15060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee15060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15060[];
extern void _ZN6dd50603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee15060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15060[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee15060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee15060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee15060[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee15060[] = {
  {&(_ZTV7ee15060[4]),  4,15},
  {&(_ZTV7ee15060[8]),  8,15},
  {&(_ZTV7ee15060[13]),  13,15},
  {&(_tg__ZTV6dd5060__7ee15060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee15060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15060[];
extern  VTBL_ENTRY _ZTV7ee15060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15060[];
static VTBL_ENTRY alt_thunk_names27[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15060 = {  "ee15060", // class name
  bases_ee15060, 4,
  &(vtc_ee15060[0]), // expected_vtbl_contents
  &(vtt_ee15060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15060),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names27,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25060  : dd5060 {
  int e;
  virtual void  foo(); // _ZN7ee250603fooEv
  ~ee25060(); // tgen
  ee25060(); // tgen
};
//SIG(1 ee25060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee25060 ::foo(){vfunc_called(this, "_ZN7ee250603fooEv");}
ee25060 ::~ee25060(){ note_dtor("ee25060", this);} // tgen
ee25060 ::ee25060(){ note_ctor("ee25060", this);} // tgen

static void Test_ee25060()
{
  extern Class_Descriptor cd_ee25060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25060, buf);
    ee25060 *dp, &lv = *(dp=new (buf) ee25060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee25060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee25060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(16,12), "ee25060");
    check_base_class_offset(lv, (dd5060*), 0, "ee25060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25060.e");
    test_class_info(&lv, &cd_ee25060);
    dp->~ee25060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25060(Test_ee25060, "ee25060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25060C1Ev();
extern void _ZN7ee25060D1Ev();
Name_Map name_map_ee25060[] = {
  NSPAIR(_ZN7ee25060C1Ev),
  NSPAIR(_ZN7ee25060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee25060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25060[];
extern void _ZN6dd50603barEv();
extern void _ZN7ee250603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee250603fooEv,_ZTv0_n16_N7ee250603fooEv)();
extern void ABISELECT(_ZThn16_N7ee250603fooEv,_ZThn12_N7ee250603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
  (VTBL_ENTRY)&_ZN7ee250603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee250603fooEv,_ZTv0_n16_N7ee250603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee25060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee25060[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee25060[] = {
  {&(_ZTV7ee25060[3]),  3,11},
  {&(_tg__ZTV6dd5060__7ee25060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee25060[4]),  4,6},
  {&(_ZTV7ee25060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25060[];
extern  VTBL_ENTRY _ZTV7ee25060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25060[];
static VTBL_ENTRY alt_thunk_names28[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee250603fooEv,_ZTv0_n16_N7ee250603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee250603fooEv,_ZThn12_N7ee250603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25060 = {  "ee25060", // class name
  bases_ee25060, 4,
  &(vtc_ee25060[0]), // expected_vtbl_contents
  &(vtt_ee25060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names28,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35060  : virtual dd5060 {
  int e;
  virtual void  foo(); // _ZN7ee350603fooEv
  ~ee35060(); // tgen
  ee35060(); // tgen
};
//SIG(1 ee35060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee35060 ::foo(){vfunc_called(this, "_ZN7ee350603fooEv");}
ee35060 ::~ee35060(){ note_dtor("ee35060", this);} // tgen
ee35060 ::ee35060(){ note_ctor("ee35060", this);} // tgen

static void Test_ee35060()
{
  extern Class_Descriptor cd_ee35060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35060, buf);
    ee35060 *dp, &lv = *(dp=new (buf) ee35060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee35060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee35060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(32,16), "ee35060");
    check_base_class_offset(lv, (dd5060*), ABISELECT(16,8), "ee35060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35060.e");
    test_class_info(&lv, &cd_ee35060);
    dp->~ee35060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35060(Test_ee35060, "ee35060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35060C1Ev();
extern void _ZN7ee35060D1Ev();
Name_Map name_map_ee35060[] = {
  NSPAIR(_ZN7ee35060C1Ev),
  NSPAIR(_ZN7ee35060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee35060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35060[];
extern void _ZN7ee350603fooEv();
extern void _ZN6dd50603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee350603fooEv,_ZTv0_n16_N7ee350603fooEv)();
extern void ABISELECT(_ZThn32_N7ee350603fooEv,_ZThn16_N7ee350603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35060[0]),
  (VTBL_ENTRY)&_ZN7ee350603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee350603fooEv,_ZTv0_n16_N7ee350603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee35060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee35060[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee35060[] = {
  {&(_ZTV7ee35060[4]),  4,16},
  {&(_ZTV7ee35060[9]),  9,16},
  {&(_ZTV7ee35060[14]),  14,16},
  {&(_tg__ZTV6dd5060__7ee35060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee35060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35060[];
extern  VTBL_ENTRY _ZTV7ee35060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35060[];
static VTBL_ENTRY alt_thunk_names29[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee350603fooEv,_ZTv0_n16_N7ee350603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee350603fooEv,_ZThn16_N7ee350603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35060 = {  "ee35060", // class name
  bases_ee35060, 4,
  &(vtc_ee35060[0]), // expected_vtbl_contents
  &(vtt_ee35060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35060),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names29,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45060  : dd5060 {
  int e;
  virtual void  bar(); // _ZN7ee450603barEv
  ~ee45060(); // tgen
  ee45060(); // tgen
};
//SIG(1 ee45060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee45060 ::bar(){vfunc_called(this, "_ZN7ee450603barEv");}
ee45060 ::~ee45060(){ note_dtor("ee45060", this);} // tgen
ee45060 ::ee45060(){ note_ctor("ee45060", this);} // tgen

static void Test_ee45060()
{
  extern Class_Descriptor cd_ee45060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45060, buf);
    ee45060 *dp, &lv = *(dp=new (buf) ee45060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee45060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee45060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(16,12), "ee45060");
    check_base_class_offset(lv, (dd5060*), 0, "ee45060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45060.e");
    test_class_info(&lv, &cd_ee45060);
    dp->~ee45060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45060(Test_ee45060, "ee45060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45060C1Ev();
extern void _ZN7ee45060D1Ev();
Name_Map name_map_ee45060[] = {
  NSPAIR(_ZN7ee45060C1Ev),
  NSPAIR(_ZN7ee45060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee45060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45060[];
extern void _ZN7ee450603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee450603barEv,_ZTv0_n12_N7ee450603barEv)();
extern void ABISELECT(_ZThn16_N7ee450603barEv,_ZThn12_N7ee450603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee45060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45060[0]),
  (VTBL_ENTRY)&_ZN7ee450603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee450603barEv,_ZTv0_n12_N7ee450603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee45060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee45060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee45060[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee45060[] = {
  {&(_ZTV7ee45060[3]),  3,10},
  {&(_tg__ZTV6dd5060__7ee45060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee45060[4]),  4,6},
  {&(_ZTV7ee45060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45060[];
extern  VTBL_ENTRY _ZTV7ee45060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45060[];
static VTBL_ENTRY alt_thunk_names30[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee450603barEv,_ZTv0_n12_N7ee450603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee450603barEv,_ZThn12_N7ee450603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45060 = {  "ee45060", // class name
  bases_ee45060, 4,
  &(vtc_ee45060[0]), // expected_vtbl_contents
  &(vtt_ee45060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names30,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55060  : virtual dd5060 {
  int e;
  virtual void  bar(); // _ZN7ee550603barEv
  ~ee55060(); // tgen
  ee55060(); // tgen
};
//SIG(1 ee55060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee55060 ::bar(){vfunc_called(this, "_ZN7ee550603barEv");}
ee55060 ::~ee55060(){ note_dtor("ee55060", this);} // tgen
ee55060 ::ee55060(){ note_ctor("ee55060", this);} // tgen

static void Test_ee55060()
{
  extern Class_Descriptor cd_ee55060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55060, buf);
    ee55060 *dp, &lv = *(dp=new (buf) ee55060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee55060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee55060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(32,16), "ee55060");
    check_base_class_offset(lv, (dd5060*), ABISELECT(16,8), "ee55060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55060.e");
    test_class_info(&lv, &cd_ee55060);
    dp->~ee55060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55060(Test_ee55060, "ee55060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55060C1Ev();
extern void _ZN7ee55060D1Ev();
Name_Map name_map_ee55060[] = {
  NSPAIR(_ZN7ee55060C1Ev),
  NSPAIR(_ZN7ee55060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee55060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55060[];
extern void _ZN7ee550603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee550603barEv,_ZTv0_n16_N7ee550603barEv)();
extern void ABISELECT(_ZThn16_N7ee550603barEv,_ZThn8_N7ee550603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee550603barEv,_ZTv0_n12_N7ee550603barEv)();
extern void ABISELECT(_ZThn32_N7ee550603barEv,_ZThn16_N7ee550603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee55060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55060[0]),
  (VTBL_ENTRY)&_ZN7ee550603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee550603barEv,_ZTv0_n16_N7ee550603barEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee550603barEv,_ZTv0_n12_N7ee550603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee55060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee55060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee55060[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee55060[] = {
  {&(_ZTV7ee55060[4]),  4,16},
  {&(_ZTV7ee55060[9]),  9,16},
  {&(_ZTV7ee55060[14]),  14,16},
  {&(_tg__ZTV6dd5060__7ee55060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee55060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55060[];
extern  VTBL_ENTRY _ZTV7ee55060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55060[];
static VTBL_ENTRY alt_thunk_names31[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee550603barEv,_ZTv0_n12_N7ee550603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee550603barEv,_ZThn16_N7ee550603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee550603barEv,_ZTv0_n16_N7ee550603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee550603barEv,_ZThn8_N7ee550603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55060 = {  "ee55060", // class name
  bases_ee55060, 4,
  &(vtc_ee55060[0]), // expected_vtbl_contents
  &(vtt_ee55060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55060),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55060),5, //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  ee65060  : dd5060 {
  int e;
  virtual void  foo(); // _ZN7ee650603fooEv
  virtual void  bar(); // _ZN7ee650603barEv
  ~ee65060(); // tgen
  ee65060(); // tgen
};
//SIG(1 ee65060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee65060 ::foo(){vfunc_called(this, "_ZN7ee650603fooEv");}
void  ee65060 ::bar(){vfunc_called(this, "_ZN7ee650603barEv");}
ee65060 ::~ee65060(){ note_dtor("ee65060", this);} // tgen
ee65060 ::ee65060(){ note_ctor("ee65060", this);} // tgen

static void Test_ee65060()
{
  extern Class_Descriptor cd_ee65060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65060, buf);
    ee65060 *dp, &lv = *(dp=new (buf) ee65060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee65060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee65060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(16,12), "ee65060");
    check_base_class_offset(lv, (dd5060*), 0, "ee65060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65060.e");
    test_class_info(&lv, &cd_ee65060);
    dp->~ee65060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65060(Test_ee65060, "ee65060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65060C1Ev();
extern void _ZN7ee65060D1Ev();
Name_Map name_map_ee65060[] = {
  NSPAIR(_ZN7ee65060C1Ev),
  NSPAIR(_ZN7ee65060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee65060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65060[];
extern void _ZN7ee650603barEv();
extern void _ZN7ee650603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee650603barEv,_ZTv0_n12_N7ee650603barEv)();
extern void ABISELECT(_ZThn16_N7ee650603barEv,_ZThn12_N7ee650603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee650603fooEv,_ZTv0_n16_N7ee650603fooEv)();
extern void ABISELECT(_ZThn16_N7ee650603fooEv,_ZThn12_N7ee650603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65060[0]),
  (VTBL_ENTRY)&_ZN7ee650603barEv,
  (VTBL_ENTRY)&_ZN7ee650603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee650603barEv,_ZTv0_n12_N7ee650603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee650603fooEv,_ZTv0_n16_N7ee650603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee65060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee65060[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee65060[] = {
  {&(_ZTV7ee65060[3]),  3,11},
  {&(_tg__ZTV6dd5060__7ee65060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee65060[4]),  4,6},
  {&(_ZTV7ee65060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65060[];
extern  VTBL_ENTRY _ZTV7ee65060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65060[];
static VTBL_ENTRY alt_thunk_names32[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn12_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee650603fooEv,_ZTv0_n16_N7ee650603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee650603fooEv,_ZThn12_N7ee650603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee650603barEv,_ZTv0_n12_N7ee650603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee650603barEv,_ZThn12_N7ee650603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65060 = {  "ee65060", // class name
  bases_ee65060, 4,
  &(vtc_ee65060[0]), // expected_vtbl_contents
  &(vtt_ee65060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65060),4, //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  ee75060  : virtual dd5060 {
  int e;
  virtual void  foo(); // _ZN7ee750603fooEv
  virtual void  bar(); // _ZN7ee750603barEv
  ~ee75060(); // tgen
  ee75060(); // tgen
};
//SIG(1 ee75060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee75060 ::foo(){vfunc_called(this, "_ZN7ee750603fooEv");}
void  ee75060 ::bar(){vfunc_called(this, "_ZN7ee750603barEv");}
ee75060 ::~ee75060(){ note_dtor("ee75060", this);} // tgen
ee75060 ::ee75060(){ note_ctor("ee75060", this);} // tgen

static void Test_ee75060()
{
  extern Class_Descriptor cd_ee75060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75060, buf);
    ee75060 *dp, &lv = *(dp=new (buf) ee75060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee75060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee75060");
    check_base_class_offset(lv, (cc060*)(dd5060*), ABISELECT(32,16), "ee75060");
    check_base_class_offset(lv, (dd5060*), ABISELECT(16,8), "ee75060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75060.e");
    test_class_info(&lv, &cd_ee75060);
    dp->~ee75060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75060(Test_ee75060, "ee75060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75060C1Ev();
extern void _ZN7ee75060D1Ev();
Name_Map name_map_ee75060[] = {
  NSPAIR(_ZN7ee75060C1Ev),
  NSPAIR(_ZN7ee75060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd5060;
extern VTBL_ENTRY _ZTI6dd5060[];
extern  VTBL_ENTRY _ZTV6dd5060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5060[];
static Base_Class bases_ee75060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75060[];
extern void _ZN7ee750603fooEv();
extern void _ZN7ee750603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee750603barEv,_ZTv0_n16_N7ee750603barEv)();
extern void ABISELECT(_ZThn16_N7ee750603barEv,_ZThn8_N7ee750603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee750603barEv,_ZTv0_n12_N7ee750603barEv)();
extern void ABISELECT(_ZThn32_N7ee750603barEv,_ZThn16_N7ee750603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee750603fooEv,_ZTv0_n16_N7ee750603fooEv)();
extern void ABISELECT(_ZThn32_N7ee750603fooEv,_ZThn16_N7ee750603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75060[0]),
  (VTBL_ENTRY)&_ZN7ee750603fooEv,
  (VTBL_ENTRY)&_ZN7ee750603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee750603barEv,_ZTv0_n16_N7ee750603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee750603barEv,_ZTv0_n12_N7ee750603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee750603fooEv,_ZTv0_n16_N7ee750603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75060[];
extern void _ZN6dd50603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5060__7ee75060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&_ZN6dd50603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv)();
extern void ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd5060__7ee75060[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee75060[] = {
  {&(_ZTV7ee75060[4]),  4,17},
  {&(_ZTV7ee75060[10]),  10,17},
  {&(_ZTV7ee75060[15]),  15,17},
  {&(_tg__ZTV6dd5060__7ee75060[3]),  3,4},
  {&(_tg__ZTV4bb605cc060__6dd5060__7ee75060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75060[];
extern  VTBL_ENTRY _ZTV7ee75060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75060[];
static VTBL_ENTRY alt_thunk_names33[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd50603barEv,_ZTv0_n12_N6dd50603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50603barEv,_ZThn8_N6dd50603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee750603fooEv,_ZTv0_n16_N7ee750603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee750603fooEv,_ZThn16_N7ee750603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee750603barEv,_ZTv0_n12_N7ee750603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee750603barEv,_ZThn16_N7ee750603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee750603barEv,_ZTv0_n16_N7ee750603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee750603barEv,_ZThn8_N7ee750603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75060 = {  "ee75060", // class name
  bases_ee75060, 4,
  &(vtc_ee75060[0]), // expected_vtbl_contents
  &(vtt_ee75060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75060),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75060),5, //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  dd6060  : cc060 {
  int d;
  virtual void  bar(); // _ZN6dd60603barEv
  virtual void  foo(); // _ZN6dd60603fooEv
  ~dd6060(); // tgen
  dd6060(); // tgen
};
//SIG(-1 dd6060) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd6060 ::bar(){vfunc_called(this, "_ZN6dd60603barEv");}
void  dd6060 ::foo(){vfunc_called(this, "_ZN6dd60603fooEv");}
dd6060 ::~dd6060(){ note_dtor("dd6060", this);} // tgen
dd6060 ::dd6060(){ note_ctor("dd6060", this);} // tgen

static void Test_dd6060()
{
  extern Class_Descriptor cd_dd6060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6060, buf);
    dd6060 *dp, &lv = *(dp=new (buf) dd6060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(8,4), "dd6060");
    check_base_class_offset(lv, (bb60*)(cc060*), 0, "dd6060");
    check_base_class_offset(lv, (cc060*), 0, "dd6060");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6060.d");
    test_class_info(&lv, &cd_dd6060);
    dp->~dd6060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6060(Test_dd6060, "dd6060", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6060C1Ev();
extern void _ZN6dd6060D1Ev();
Name_Map name_map_dd6060[] = {
  NSPAIR(_ZN6dd6060C1Ev),
  NSPAIR(_ZN6dd6060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd6060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd6060[];
extern void _ZN6dd60603barEv();
extern void _ZN6dd60603fooEv();
static  VTBL_ENTRY vtc_dd6060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6060[0]),
  (VTBL_ENTRY)&_ZN6dd60603barEv,
  (VTBL_ENTRY)&_ZN6dd60603fooEv,
};
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
Class_Descriptor cd_dd6060 = {  "dd6060", // class name
  bases_dd6060, 3,
  &(vtc_dd6060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6060),4, //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  ee06060  : dd6060 {
  int e;
  ~ee06060(); // tgen
  ee06060(); // tgen
};
//SIG(1 ee06060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee06060 ::~ee06060(){ note_dtor("ee06060", this);} // tgen
ee06060 ::ee06060(){ note_ctor("ee06060", this);} // tgen

static void Test_ee06060()
{
  extern Class_Descriptor cd_ee06060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06060, buf);
    ee06060 *dp, &lv = *(dp=new (buf) ee06060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(8,4), "ee06060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), 0, "ee06060");
    check_base_class_offset(lv, (cc060*)(dd6060*), 0, "ee06060");
    check_base_class_offset(lv, (dd6060*), 0, "ee06060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06060.e");
    test_class_info(&lv, &cd_ee06060);
    dp->~ee06060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06060(Test_ee06060, "ee06060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06060C1Ev();
extern void _ZN7ee06060D1Ev();
Name_Map name_map_ee06060[] = {
  NSPAIR(_ZN7ee06060C1Ev),
  NSPAIR(_ZN7ee06060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee06060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06060[];
extern void _ZN6dd60603barEv();
extern void _ZN6dd60603fooEv();
static  VTBL_ENTRY vtc_ee06060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06060[0]),
  (VTBL_ENTRY)&_ZN6dd60603barEv,
  (VTBL_ENTRY)&_ZN6dd60603fooEv,
};
extern VTBL_ENTRY _ZTI7ee06060[];
extern  VTBL_ENTRY _ZTV7ee06060[];
Class_Descriptor cd_ee06060 = {  "ee06060", // class name
  bases_ee06060, 4,
  &(vtc_ee06060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06060),4, //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  ee16060  : virtual dd6060 {
  int e;
  ~ee16060(); // tgen
  ee16060(); // tgen
};
//SIG(1 ee16060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee16060 ::~ee16060(){ note_dtor("ee16060", this);} // tgen
ee16060 ::ee16060(){ note_ctor("ee16060", this);} // tgen

static void Test_ee16060()
{
  extern Class_Descriptor cd_ee16060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16060, buf);
    ee16060 *dp, &lv = *(dp=new (buf) ee16060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(24,12), "ee16060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), ABISELECT(16,8), "ee16060");
    check_base_class_offset(lv, (cc060*)(dd6060*), ABISELECT(16,8), "ee16060");
    check_base_class_offset(lv, (dd6060*), ABISELECT(16,8), "ee16060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16060.e");
    test_class_info(&lv, &cd_ee16060);
    dp->~ee16060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16060(Test_ee16060, "ee16060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16060C1Ev();
extern void _ZN7ee16060D1Ev();
Name_Map name_map_ee16060[] = {
  NSPAIR(_ZN7ee16060C1Ev),
  NSPAIR(_ZN7ee16060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee16060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16060[];
extern void _ZN6dd60603barEv();
extern void _ZN6dd60603fooEv();
static  VTBL_ENTRY vtc_ee16060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16060[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16060[0]),
  (VTBL_ENTRY)&_ZN6dd60603barEv,
  (VTBL_ENTRY)&_ZN6dd60603fooEv,
};
extern VTBL_ENTRY _ZTV7ee16060[];
static  VTT_ENTRY vtt_ee16060[] = {
  {&(_ZTV7ee16060[3]),  3,9},
  {&(_ZTV7ee16060[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16060[];
extern  VTBL_ENTRY _ZTV7ee16060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16060[];
Class_Descriptor cd_ee16060 = {  "ee16060", // class name
  bases_ee16060, 4,
  &(vtc_ee16060[0]), // expected_vtbl_contents
  &(vtt_ee16060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16060),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16060),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  ee26060  : dd6060 {
  int e;
  virtual void  foo(); // _ZN7ee260603fooEv
  ~ee26060(); // tgen
  ee26060(); // tgen
};
//SIG(1 ee26060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee26060 ::foo(){vfunc_called(this, "_ZN7ee260603fooEv");}
ee26060 ::~ee26060(){ note_dtor("ee26060", this);} // tgen
ee26060 ::ee26060(){ note_ctor("ee26060", this);} // tgen

static void Test_ee26060()
{
  extern Class_Descriptor cd_ee26060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26060, buf);
    ee26060 *dp, &lv = *(dp=new (buf) ee26060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(8,4), "ee26060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), 0, "ee26060");
    check_base_class_offset(lv, (cc060*)(dd6060*), 0, "ee26060");
    check_base_class_offset(lv, (dd6060*), 0, "ee26060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26060.e");
    test_class_info(&lv, &cd_ee26060);
    dp->~ee26060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26060(Test_ee26060, "ee26060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26060C1Ev();
extern void _ZN7ee26060D1Ev();
Name_Map name_map_ee26060[] = {
  NSPAIR(_ZN7ee26060C1Ev),
  NSPAIR(_ZN7ee26060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee26060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee26060[];
extern void _ZN6dd60603barEv();
extern void _ZN7ee260603fooEv();
static  VTBL_ENTRY vtc_ee26060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26060[0]),
  (VTBL_ENTRY)&_ZN6dd60603barEv,
  (VTBL_ENTRY)&_ZN7ee260603fooEv,
};
extern VTBL_ENTRY _ZTI7ee26060[];
extern  VTBL_ENTRY _ZTV7ee26060[];
Class_Descriptor cd_ee26060 = {  "ee26060", // class name
  bases_ee26060, 4,
  &(vtc_ee26060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26060),4, //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  ee36060  : virtual dd6060 {
  int e;
  virtual void  foo(); // _ZN7ee360603fooEv
  ~ee36060(); // tgen
  ee36060(); // tgen
};
//SIG(1 ee36060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee36060 ::foo(){vfunc_called(this, "_ZN7ee360603fooEv");}
ee36060 ::~ee36060(){ note_dtor("ee36060", this);} // tgen
ee36060 ::ee36060(){ note_ctor("ee36060", this);} // tgen

static void Test_ee36060()
{
  extern Class_Descriptor cd_ee36060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36060, buf);
    ee36060 *dp, &lv = *(dp=new (buf) ee36060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(24,12), "ee36060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), ABISELECT(16,8), "ee36060");
    check_base_class_offset(lv, (cc060*)(dd6060*), ABISELECT(16,8), "ee36060");
    check_base_class_offset(lv, (dd6060*), ABISELECT(16,8), "ee36060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36060.e");
    test_class_info(&lv, &cd_ee36060);
    dp->~ee36060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36060(Test_ee36060, "ee36060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36060C1Ev();
extern void _ZN7ee36060D1Ev();
Name_Map name_map_ee36060[] = {
  NSPAIR(_ZN7ee36060C1Ev),
  NSPAIR(_ZN7ee36060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee36060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36060[];
extern void _ZN7ee360603fooEv();
extern void _ZN6dd60603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee360603fooEv,_ZTv0_n16_N7ee360603fooEv)();
extern void ABISELECT(_ZThn16_N7ee360603fooEv,_ZThn8_N7ee360603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36060[0]),
  (VTBL_ENTRY)&_ZN7ee360603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36060[0]),
  (VTBL_ENTRY)&_ZN6dd60603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee360603fooEv,_ZTv0_n16_N7ee360603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36060[];
static  VTT_ENTRY vtt_ee36060[] = {
  {&(_ZTV7ee36060[3]),  3,10},
  {&(_ZTV7ee36060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36060[];
extern  VTBL_ENTRY _ZTV7ee36060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36060[];
static VTBL_ENTRY alt_thunk_names34[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee360603fooEv,_ZTv0_n16_N7ee360603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee360603fooEv,_ZThn8_N7ee360603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36060 = {  "ee36060", // class name
  bases_ee36060, 4,
  &(vtc_ee36060[0]), // expected_vtbl_contents
  &(vtt_ee36060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36060),2, //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  ee46060  : dd6060 {
  int e;
  virtual void  bar(); // _ZN7ee460603barEv
  ~ee46060(); // tgen
  ee46060(); // tgen
};
//SIG(1 ee46060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee46060 ::bar(){vfunc_called(this, "_ZN7ee460603barEv");}
ee46060 ::~ee46060(){ note_dtor("ee46060", this);} // tgen
ee46060 ::ee46060(){ note_ctor("ee46060", this);} // tgen

static void Test_ee46060()
{
  extern Class_Descriptor cd_ee46060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46060, buf);
    ee46060 *dp, &lv = *(dp=new (buf) ee46060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(8,4), "ee46060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), 0, "ee46060");
    check_base_class_offset(lv, (cc060*)(dd6060*), 0, "ee46060");
    check_base_class_offset(lv, (dd6060*), 0, "ee46060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46060.e");
    test_class_info(&lv, &cd_ee46060);
    dp->~ee46060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46060(Test_ee46060, "ee46060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46060C1Ev();
extern void _ZN7ee46060D1Ev();
Name_Map name_map_ee46060[] = {
  NSPAIR(_ZN7ee46060C1Ev),
  NSPAIR(_ZN7ee46060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee46060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee46060[];
extern void _ZN7ee460603barEv();
extern void _ZN6dd60603fooEv();
static  VTBL_ENTRY vtc_ee46060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46060[0]),
  (VTBL_ENTRY)&_ZN7ee460603barEv,
  (VTBL_ENTRY)&_ZN6dd60603fooEv,
};
extern VTBL_ENTRY _ZTI7ee46060[];
extern  VTBL_ENTRY _ZTV7ee46060[];
Class_Descriptor cd_ee46060 = {  "ee46060", // class name
  bases_ee46060, 4,
  &(vtc_ee46060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46060),4, //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  ee56060  : virtual dd6060 {
  int e;
  virtual void  bar(); // _ZN7ee560603barEv
  ~ee56060(); // tgen
  ee56060(); // tgen
};
//SIG(1 ee56060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee56060 ::bar(){vfunc_called(this, "_ZN7ee560603barEv");}
ee56060 ::~ee56060(){ note_dtor("ee56060", this);} // tgen
ee56060 ::ee56060(){ note_ctor("ee56060", this);} // tgen

static void Test_ee56060()
{
  extern Class_Descriptor cd_ee56060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56060, buf);
    ee56060 *dp, &lv = *(dp=new (buf) ee56060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(24,12), "ee56060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), ABISELECT(16,8), "ee56060");
    check_base_class_offset(lv, (cc060*)(dd6060*), ABISELECT(16,8), "ee56060");
    check_base_class_offset(lv, (dd6060*), ABISELECT(16,8), "ee56060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56060.e");
    test_class_info(&lv, &cd_ee56060);
    dp->~ee56060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56060(Test_ee56060, "ee56060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56060C1Ev();
extern void _ZN7ee56060D1Ev();
Name_Map name_map_ee56060[] = {
  NSPAIR(_ZN7ee56060C1Ev),
  NSPAIR(_ZN7ee56060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee56060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56060[];
extern void _ZN7ee560603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee560603barEv,_ZTv0_n12_N7ee560603barEv)();
extern void ABISELECT(_ZThn16_N7ee560603barEv,_ZThn8_N7ee560603barEv)() __attribute__((weak));
extern void _ZN6dd60603fooEv();
static  VTBL_ENTRY vtc_ee56060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56060[0]),
  (VTBL_ENTRY)&_ZN7ee560603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee560603barEv,_ZTv0_n12_N7ee560603barEv),
  (VTBL_ENTRY)&_ZN6dd60603fooEv,
};
extern VTBL_ENTRY _ZTV7ee56060[];
static  VTT_ENTRY vtt_ee56060[] = {
  {&(_ZTV7ee56060[3]),  3,10},
  {&(_ZTV7ee56060[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56060[];
extern  VTBL_ENTRY _ZTV7ee56060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56060[];
static VTBL_ENTRY alt_thunk_names35[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee560603barEv,_ZTv0_n12_N7ee560603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee560603barEv,_ZThn8_N7ee560603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56060 = {  "ee56060", // class name
  bases_ee56060, 4,
  &(vtc_ee56060[0]), // expected_vtbl_contents
  &(vtt_ee56060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56060),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names35,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66060  : dd6060 {
  int e;
  virtual void  foo(); // _ZN7ee660603fooEv
  virtual void  bar(); // _ZN7ee660603barEv
  ~ee66060(); // tgen
  ee66060(); // tgen
};
//SIG(1 ee66060) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66060 ::foo(){vfunc_called(this, "_ZN7ee660603fooEv");}
void  ee66060 ::bar(){vfunc_called(this, "_ZN7ee660603barEv");}
ee66060 ::~ee66060(){ note_dtor("ee66060", this);} // tgen
ee66060 ::ee66060(){ note_ctor("ee66060", this);} // tgen

static void Test_ee66060()
{
  extern Class_Descriptor cd_ee66060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66060, buf);
    ee66060 *dp, &lv = *(dp=new (buf) ee66060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(8,4), "ee66060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), 0, "ee66060");
    check_base_class_offset(lv, (cc060*)(dd6060*), 0, "ee66060");
    check_base_class_offset(lv, (dd6060*), 0, "ee66060");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66060.e");
    test_class_info(&lv, &cd_ee66060);
    dp->~ee66060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66060(Test_ee66060, "ee66060", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66060C1Ev();
extern void _ZN7ee66060D1Ev();
Name_Map name_map_ee66060[] = {
  NSPAIR(_ZN7ee66060C1Ev),
  NSPAIR(_ZN7ee66060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee66060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee66060[];
extern void _ZN7ee660603barEv();
extern void _ZN7ee660603fooEv();
static  VTBL_ENTRY vtc_ee66060[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66060[0]),
  (VTBL_ENTRY)&_ZN7ee660603barEv,
  (VTBL_ENTRY)&_ZN7ee660603fooEv,
};
extern VTBL_ENTRY _ZTI7ee66060[];
extern  VTBL_ENTRY _ZTV7ee66060[];
Class_Descriptor cd_ee66060 = {  "ee66060", // class name
  bases_ee66060, 4,
  &(vtc_ee66060[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66060),4, //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  ee76060  : virtual dd6060 {
  int e;
  virtual void  foo(); // _ZN7ee760603fooEv
  virtual void  bar(); // _ZN7ee760603barEv
  ~ee76060(); // tgen
  ee76060(); // tgen
};
//SIG(1 ee76060) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76060 ::foo(){vfunc_called(this, "_ZN7ee760603fooEv");}
void  ee76060 ::bar(){vfunc_called(this, "_ZN7ee760603barEv");}
ee76060 ::~ee76060(){ note_dtor("ee76060", this);} // tgen
ee76060 ::ee76060(){ note_ctor("ee76060", this);} // tgen

static void Test_ee76060()
{
  extern Class_Descriptor cd_ee76060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76060, buf);
    ee76060 *dp, &lv = *(dp=new (buf) ee76060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*)(dd6060*), ABISELECT(24,12), "ee76060");
    check_base_class_offset(lv, (bb60*)(cc060*)(dd6060*), ABISELECT(16,8), "ee76060");
    check_base_class_offset(lv, (cc060*)(dd6060*), ABISELECT(16,8), "ee76060");
    check_base_class_offset(lv, (dd6060*), ABISELECT(16,8), "ee76060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76060.e");
    test_class_info(&lv, &cd_ee76060);
    dp->~ee76060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76060(Test_ee76060, "ee76060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76060C1Ev();
extern void _ZN7ee76060D1Ev();
Name_Map name_map_ee76060[] = {
  NSPAIR(_ZN7ee76060C1Ev),
  NSPAIR(_ZN7ee76060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd6060;
extern VTBL_ENTRY _ZTI6dd6060[];
extern  VTBL_ENTRY _ZTV6dd6060[];
static Base_Class bases_ee76060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc060,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6060,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76060[];
extern void _ZN7ee760603fooEv();
extern void _ZN7ee760603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee760603barEv,_ZTv0_n12_N7ee760603barEv)();
extern void ABISELECT(_ZThn16_N7ee760603barEv,_ZThn8_N7ee760603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee760603fooEv,_ZTv0_n16_N7ee760603fooEv)();
extern void ABISELECT(_ZThn16_N7ee760603fooEv,_ZThn8_N7ee760603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76060[0]),
  (VTBL_ENTRY)&_ZN7ee760603fooEv,
  (VTBL_ENTRY)&_ZN7ee760603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee760603barEv,_ZTv0_n12_N7ee760603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee760603fooEv,_ZTv0_n16_N7ee760603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76060[];
static  VTT_ENTRY vtt_ee76060[] = {
  {&(_ZTV7ee76060[3]),  3,11},
  {&(_ZTV7ee76060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76060[];
extern  VTBL_ENTRY _ZTV7ee76060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76060[];
static VTBL_ENTRY alt_thunk_names36[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee760603fooEv,_ZTv0_n16_N7ee760603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee760603fooEv,_ZThn8_N7ee760603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee760603barEv,_ZTv0_n12_N7ee760603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee760603barEv,_ZThn8_N7ee760603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76060 = {  "ee76060", // class name
  bases_ee76060, 4,
  &(vtc_ee76060[0]), // expected_vtbl_contents
  &(vtt_ee76060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76060),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names36,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7060  : virtual cc060 {
  int d;
  virtual void  bar(); // _ZN6dd70603barEv
  virtual void  foo(); // _ZN6dd70603fooEv
  ~dd7060(); // tgen
  dd7060(); // tgen
};
//SIG(-1 dd7060) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd7060 ::bar(){vfunc_called(this, "_ZN6dd70603barEv");}
void  dd7060 ::foo(){vfunc_called(this, "_ZN6dd70603fooEv");}
dd7060 ::~dd7060(){ note_dtor("dd7060", this);} // tgen
dd7060 ::dd7060(){ note_ctor("dd7060", this);} // tgen

static void Test_dd7060()
{
  extern Class_Descriptor cd_dd7060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7060, buf);
    dd7060 *dp, &lv = *(dp=new (buf) dd7060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,12), "dd7060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,8), "dd7060");
    check_base_class_offset(lv, (cc060*), ABISELECT(16,8), "dd7060");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7060.d");
    test_class_info(&lv, &cd_dd7060);
    dp->~dd7060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7060(Test_dd7060, "dd7060", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7060C1Ev();
extern void _ZN6dd7060D1Ev();
Name_Map name_map_dd7060[] = {
  NSPAIR(_ZN6dd7060C1Ev),
  NSPAIR(_ZN6dd7060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
static Base_Class bases_dd7060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7060[];
static  VTT_ENTRY vtt_dd7060[] = {
  {&(_ZTV6dd7060[3]),  3,11},
  {&(_ZTV6dd7060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static VTBL_ENTRY alt_thunk_names37[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7060 = {  "dd7060", // class name
  bases_dd7060, 3,
  &(vtc_dd7060[0]), // expected_vtbl_contents
  &(vtt_dd7060[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7060),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names37,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07060  : dd7060 {
  int e;
  ~ee07060(); // tgen
  ee07060(); // tgen
};
//SIG(1 ee07060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee07060 ::~ee07060(){ note_dtor("ee07060", this);} // tgen
ee07060 ::ee07060(){ note_ctor("ee07060", this);} // tgen

static void Test_ee07060()
{
  extern Class_Descriptor cd_ee07060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07060, buf);
    ee07060 *dp, &lv = *(dp=new (buf) ee07060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee07060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee07060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(16,12), "ee07060");
    check_base_class_offset(lv, (dd7060*), 0, "ee07060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07060.e");
    test_class_info(&lv, &cd_ee07060);
    dp->~ee07060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07060(Test_ee07060, "ee07060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07060C1Ev();
extern void _ZN7ee07060D1Ev();
Name_Map name_map_ee07060[] = {
  NSPAIR(_ZN7ee07060C1Ev),
  NSPAIR(_ZN7ee07060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee07060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee07060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee07060[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee07060[] = {
  {&(_ZTV7ee07060[3]),  3,11},
  {&(_tg__ZTV6dd7060__7ee07060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee07060[4]),  4,6},
  {&(_ZTV7ee07060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07060[];
extern  VTBL_ENTRY _ZTV7ee07060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07060[];
static VTBL_ENTRY alt_thunk_names38[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07060 = {  "ee07060", // class name
  bases_ee07060, 4,
  &(vtc_ee07060[0]), // expected_vtbl_contents
  &(vtt_ee07060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07060),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names38,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17060  : virtual dd7060 {
  int e;
  ~ee17060(); // tgen
  ee17060(); // tgen
};
//SIG(1 ee17060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee17060 ::~ee17060(){ note_dtor("ee17060", this);} // tgen
ee17060 ::ee17060(){ note_ctor("ee17060", this);} // tgen

static void Test_ee17060()
{
  extern Class_Descriptor cd_ee17060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17060, buf);
    ee17060 *dp, &lv = *(dp=new (buf) ee17060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee17060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee17060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(32,16), "ee17060");
    check_base_class_offset(lv, (dd7060*), ABISELECT(16,8), "ee17060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17060.e");
    test_class_info(&lv, &cd_ee17060);
    dp->~ee17060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17060(Test_ee17060, "ee17060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17060C1Ev();
extern void _ZN7ee17060D1Ev();
Name_Map name_map_ee17060[] = {
  NSPAIR(_ZN7ee17060C1Ev),
  NSPAIR(_ZN7ee17060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee17060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17060[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee17060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee17060[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee17060[] = {
  {&(_ZTV7ee17060[4]),  4,17},
  {&(_ZTV7ee17060[9]),  9,17},
  {&(_ZTV7ee17060[15]),  15,17},
  {&(_tg__ZTV6dd7060__7ee17060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee17060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17060[];
extern  VTBL_ENTRY _ZTV7ee17060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17060[];
static VTBL_ENTRY alt_thunk_names39[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17060 = {  "ee17060", // class name
  bases_ee17060, 4,
  &(vtc_ee17060[0]), // expected_vtbl_contents
  &(vtt_ee17060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17060),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names39,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27060  : dd7060 {
  int e;
  virtual void  foo(); // _ZN7ee270603fooEv
  ~ee27060(); // tgen
  ee27060(); // tgen
};
//SIG(1 ee27060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee27060 ::foo(){vfunc_called(this, "_ZN7ee270603fooEv");}
ee27060 ::~ee27060(){ note_dtor("ee27060", this);} // tgen
ee27060 ::ee27060(){ note_ctor("ee27060", this);} // tgen

static void Test_ee27060()
{
  extern Class_Descriptor cd_ee27060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27060, buf);
    ee27060 *dp, &lv = *(dp=new (buf) ee27060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee27060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee27060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(16,12), "ee27060");
    check_base_class_offset(lv, (dd7060*), 0, "ee27060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27060.e");
    test_class_info(&lv, &cd_ee27060);
    dp->~ee27060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27060(Test_ee27060, "ee27060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27060C1Ev();
extern void _ZN7ee27060D1Ev();
Name_Map name_map_ee27060[] = {
  NSPAIR(_ZN7ee27060C1Ev),
  NSPAIR(_ZN7ee27060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee27060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27060[];
extern void _ZN6dd70603barEv();
extern void _ZN7ee270603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee270603fooEv,_ZTv0_n16_N7ee270603fooEv)();
extern void ABISELECT(_ZThn16_N7ee270603fooEv,_ZThn12_N7ee270603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN7ee270603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee270603fooEv,_ZTv0_n16_N7ee270603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee27060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee27060[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee27060[] = {
  {&(_ZTV7ee27060[3]),  3,11},
  {&(_tg__ZTV6dd7060__7ee27060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee27060[4]),  4,6},
  {&(_ZTV7ee27060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27060[];
extern  VTBL_ENTRY _ZTV7ee27060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27060[];
static VTBL_ENTRY alt_thunk_names40[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee270603fooEv,_ZTv0_n16_N7ee270603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee270603fooEv,_ZThn12_N7ee270603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27060 = {  "ee27060", // class name
  bases_ee27060, 4,
  &(vtc_ee27060[0]), // expected_vtbl_contents
  &(vtt_ee27060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27060),4, //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  ee37060  : virtual dd7060 {
  int e;
  virtual void  foo(); // _ZN7ee370603fooEv
  ~ee37060(); // tgen
  ee37060(); // tgen
};
//SIG(1 ee37060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee37060 ::foo(){vfunc_called(this, "_ZN7ee370603fooEv");}
ee37060 ::~ee37060(){ note_dtor("ee37060", this);} // tgen
ee37060 ::ee37060(){ note_ctor("ee37060", this);} // tgen

static void Test_ee37060()
{
  extern Class_Descriptor cd_ee37060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37060, buf);
    ee37060 *dp, &lv = *(dp=new (buf) ee37060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee37060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee37060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(32,16), "ee37060");
    check_base_class_offset(lv, (dd7060*), ABISELECT(16,8), "ee37060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37060.e");
    test_class_info(&lv, &cd_ee37060);
    dp->~ee37060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37060(Test_ee37060, "ee37060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37060C1Ev();
extern void _ZN7ee37060D1Ev();
Name_Map name_map_ee37060[] = {
  NSPAIR(_ZN7ee37060C1Ev),
  NSPAIR(_ZN7ee37060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee37060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37060[];
extern void _ZN7ee370603fooEv();
extern void _ZN6dd70603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee370603fooEv,_ZTv0_n20_N7ee370603fooEv)();
extern void ABISELECT(_ZThn16_N7ee370603fooEv,_ZThn8_N7ee370603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee370603fooEv,_ZTv0_n16_N7ee370603fooEv)();
extern void ABISELECT(_ZThn32_N7ee370603fooEv,_ZThn16_N7ee370603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37060[0]),
  (VTBL_ENTRY)&_ZN7ee370603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee370603fooEv,_ZTv0_n20_N7ee370603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee370603fooEv,_ZTv0_n16_N7ee370603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee37060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee37060[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee37060[] = {
  {&(_ZTV7ee37060[4]),  4,18},
  {&(_ZTV7ee37060[10]),  10,18},
  {&(_ZTV7ee37060[16]),  16,18},
  {&(_tg__ZTV6dd7060__7ee37060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee37060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37060[];
extern  VTBL_ENTRY _ZTV7ee37060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37060[];
static VTBL_ENTRY alt_thunk_names41[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee370603fooEv,_ZTv0_n16_N7ee370603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee370603fooEv,_ZThn16_N7ee370603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee370603fooEv,_ZTv0_n20_N7ee370603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee370603fooEv,_ZThn8_N7ee370603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37060 = {  "ee37060", // class name
  bases_ee37060, 4,
  &(vtc_ee37060[0]), // expected_vtbl_contents
  &(vtt_ee37060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37060),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37060),5, //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  ee47060  : dd7060 {
  int e;
  virtual void  bar(); // _ZN7ee470603barEv
  ~ee47060(); // tgen
  ee47060(); // tgen
};
//SIG(1 ee47060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee47060 ::bar(){vfunc_called(this, "_ZN7ee470603barEv");}
ee47060 ::~ee47060(){ note_dtor("ee47060", this);} // tgen
ee47060 ::ee47060(){ note_ctor("ee47060", this);} // tgen

static void Test_ee47060()
{
  extern Class_Descriptor cd_ee47060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47060, buf);
    ee47060 *dp, &lv = *(dp=new (buf) ee47060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee47060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee47060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(16,12), "ee47060");
    check_base_class_offset(lv, (dd7060*), 0, "ee47060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47060.e");
    test_class_info(&lv, &cd_ee47060);
    dp->~ee47060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47060(Test_ee47060, "ee47060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47060C1Ev();
extern void _ZN7ee47060D1Ev();
Name_Map name_map_ee47060[] = {
  NSPAIR(_ZN7ee47060C1Ev),
  NSPAIR(_ZN7ee47060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee47060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47060[];
extern void _ZN7ee470603barEv();
extern void _ZN6dd70603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee470603barEv,_ZTv0_n12_N7ee470603barEv)();
extern void ABISELECT(_ZThn16_N7ee470603barEv,_ZThn12_N7ee470603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47060[0]),
  (VTBL_ENTRY)&_ZN7ee470603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee470603barEv,_ZTv0_n12_N7ee470603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee47060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee47060[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee47060[] = {
  {&(_ZTV7ee47060[3]),  3,11},
  {&(_tg__ZTV6dd7060__7ee47060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee47060[4]),  4,6},
  {&(_ZTV7ee47060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47060[];
extern  VTBL_ENTRY _ZTV7ee47060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47060[];
static VTBL_ENTRY alt_thunk_names42[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee470603barEv,_ZTv0_n12_N7ee470603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee470603barEv,_ZThn12_N7ee470603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47060 = {  "ee47060", // class name
  bases_ee47060, 4,
  &(vtc_ee47060[0]), // expected_vtbl_contents
  &(vtt_ee47060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47060),4, //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  ee57060  : virtual dd7060 {
  int e;
  virtual void  bar(); // _ZN7ee570603barEv
  ~ee57060(); // tgen
  ee57060(); // tgen
};
//SIG(1 ee57060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee57060 ::bar(){vfunc_called(this, "_ZN7ee570603barEv");}
ee57060 ::~ee57060(){ note_dtor("ee57060", this);} // tgen
ee57060 ::ee57060(){ note_ctor("ee57060", this);} // tgen

static void Test_ee57060()
{
  extern Class_Descriptor cd_ee57060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57060, buf);
    ee57060 *dp, &lv = *(dp=new (buf) ee57060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee57060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee57060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(32,16), "ee57060");
    check_base_class_offset(lv, (dd7060*), ABISELECT(16,8), "ee57060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57060.e");
    test_class_info(&lv, &cd_ee57060);
    dp->~ee57060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57060(Test_ee57060, "ee57060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57060C1Ev();
extern void _ZN7ee57060D1Ev();
Name_Map name_map_ee57060[] = {
  NSPAIR(_ZN7ee57060C1Ev),
  NSPAIR(_ZN7ee57060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee57060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57060[];
extern void _ZN7ee570603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee570603barEv,_ZTv0_n16_N7ee570603barEv)();
extern void ABISELECT(_ZThn16_N7ee570603barEv,_ZThn8_N7ee570603barEv)() __attribute__((weak));
extern void _ZN6dd70603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee570603barEv,_ZTv0_n12_N7ee570603barEv)();
extern void ABISELECT(_ZThn32_N7ee570603barEv,_ZThn16_N7ee570603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57060[0]),
  (VTBL_ENTRY)&_ZN7ee570603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee570603barEv,_ZTv0_n16_N7ee570603barEv),
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee570603barEv,_ZTv0_n12_N7ee570603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee57060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee57060[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee57060[] = {
  {&(_ZTV7ee57060[4]),  4,18},
  {&(_ZTV7ee57060[10]),  10,18},
  {&(_ZTV7ee57060[16]),  16,18},
  {&(_tg__ZTV6dd7060__7ee57060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee57060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57060[];
extern  VTBL_ENTRY _ZTV7ee57060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57060[];
static VTBL_ENTRY alt_thunk_names43[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee570603barEv,_ZTv0_n12_N7ee570603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee570603barEv,_ZThn16_N7ee570603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee570603barEv,_ZTv0_n16_N7ee570603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee570603barEv,_ZThn8_N7ee570603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57060 = {  "ee57060", // class name
  bases_ee57060, 4,
  &(vtc_ee57060[0]), // expected_vtbl_contents
  &(vtt_ee57060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57060),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57060),5, //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  ee67060  : dd7060 {
  int e;
  virtual void  foo(); // _ZN7ee670603fooEv
  virtual void  bar(); // _ZN7ee670603barEv
  ~ee67060(); // tgen
  ee67060(); // tgen
};
//SIG(1 ee67060) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67060 ::foo(){vfunc_called(this, "_ZN7ee670603fooEv");}
void  ee67060 ::bar(){vfunc_called(this, "_ZN7ee670603barEv");}
ee67060 ::~ee67060(){ note_dtor("ee67060", this);} // tgen
ee67060 ::ee67060(){ note_ctor("ee67060", this);} // tgen

static void Test_ee67060()
{
  extern Class_Descriptor cd_ee67060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67060, buf);
    ee67060 *dp, &lv = *(dp=new (buf) ee67060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(24,16), "ee67060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(16,12), "ee67060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(16,12), "ee67060");
    check_base_class_offset(lv, (dd7060*), 0, "ee67060");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67060.e");
    test_class_info(&lv, &cd_ee67060);
    dp->~ee67060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67060(Test_ee67060, "ee67060", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67060C1Ev();
extern void _ZN7ee67060D1Ev();
Name_Map name_map_ee67060[] = {
  NSPAIR(_ZN7ee67060C1Ev),
  NSPAIR(_ZN7ee67060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee67060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67060[];
extern void _ZN7ee670603barEv();
extern void _ZN7ee670603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee670603barEv,_ZTv0_n12_N7ee670603barEv)();
extern void ABISELECT(_ZThn16_N7ee670603barEv,_ZThn12_N7ee670603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee670603fooEv,_ZTv0_n16_N7ee670603fooEv)();
extern void ABISELECT(_ZThn16_N7ee670603fooEv,_ZThn12_N7ee670603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67060[0]),
  (VTBL_ENTRY)&_ZN7ee670603barEv,
  (VTBL_ENTRY)&_ZN7ee670603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee670603barEv,_ZTv0_n12_N7ee670603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee670603fooEv,_ZTv0_n16_N7ee670603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee67060[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee67060[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee67060[] = {
  {&(_ZTV7ee67060[3]),  3,11},
  {&(_tg__ZTV6dd7060__7ee67060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee67060[4]),  4,6},
  {&(_ZTV7ee67060[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67060[];
extern  VTBL_ENTRY _ZTV7ee67060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67060[];
static VTBL_ENTRY alt_thunk_names44[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn12_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn12_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee670603fooEv,_ZTv0_n16_N7ee670603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee670603fooEv,_ZThn12_N7ee670603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee670603barEv,_ZTv0_n12_N7ee670603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee670603barEv,_ZThn12_N7ee670603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67060 = {  "ee67060", // class name
  bases_ee67060, 4,
  &(vtc_ee67060[0]), // expected_vtbl_contents
  &(vtt_ee67060[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67060),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67060),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67060),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  ee77060  : virtual dd7060 {
  int e;
  virtual void  foo(); // _ZN7ee770603fooEv
  virtual void  bar(); // _ZN7ee770603barEv
  ~ee77060(); // tgen
  ee77060(); // tgen
};
//SIG(1 ee77060) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77060 ::foo(){vfunc_called(this, "_ZN7ee770603fooEv");}
void  ee77060 ::bar(){vfunc_called(this, "_ZN7ee770603barEv");}
ee77060 ::~ee77060(){ note_dtor("ee77060", this);} // tgen
ee77060 ::ee77060(){ note_ctor("ee77060", this);} // tgen

static void Test_ee77060()
{
  extern Class_Descriptor cd_ee77060;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77060, buf);
    ee77060 *dp, &lv = *(dp=new (buf) ee77060());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77060)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77060)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc060*), ABISELECT(40,20), "ee77060");
    check_base_class_offset(lv, (bb60*)(cc060*), ABISELECT(32,16), "ee77060");
    check_base_class_offset(lv, (cc060*)(dd7060*), ABISELECT(32,16), "ee77060");
    check_base_class_offset(lv, (dd7060*), ABISELECT(16,8), "ee77060");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77060.e");
    test_class_info(&lv, &cd_ee77060);
    dp->~ee77060();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77060(Test_ee77060, "ee77060", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77060C1Ev();
extern void _ZN7ee77060D1Ev();
Name_Map name_map_ee77060[] = {
  NSPAIR(_ZN7ee77060C1Ev),
  NSPAIR(_ZN7ee77060D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc060;
extern VTBL_ENTRY _ZTI5cc060[];
extern  VTBL_ENTRY _ZTV5cc060[];
extern Class_Descriptor cd_dd7060;
extern VTBL_ENTRY _ZTI6dd7060[];
extern  VTBL_ENTRY _ZTV6dd7060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7060[];
static Base_Class bases_ee77060[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc060,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7060,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77060[];
extern void _ZN7ee770603fooEv();
extern void _ZN7ee770603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee770603barEv,_ZTv0_n16_N7ee770603barEv)();
extern void ABISELECT(_ZThn16_N7ee770603barEv,_ZThn8_N7ee770603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee770603fooEv,_ZTv0_n20_N7ee770603fooEv)();
extern void ABISELECT(_ZThn16_N7ee770603fooEv,_ZThn8_N7ee770603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee770603barEv,_ZTv0_n12_N7ee770603barEv)();
extern void ABISELECT(_ZThn32_N7ee770603barEv,_ZThn16_N7ee770603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee770603fooEv,_ZTv0_n16_N7ee770603fooEv)();
extern void ABISELECT(_ZThn32_N7ee770603fooEv,_ZThn16_N7ee770603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77060[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77060[0]),
  (VTBL_ENTRY)&_ZN7ee770603fooEv,
  (VTBL_ENTRY)&_ZN7ee770603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee770603barEv,_ZTv0_n16_N7ee770603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee770603fooEv,_ZTv0_n20_N7ee770603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee770603barEv,_ZTv0_n12_N7ee770603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee770603fooEv,_ZTv0_n16_N7ee770603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77060[];
extern void _ZN6dd70603barEv();
extern void _ZN6dd70603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7060__7ee77060[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&_ZN6dd70603barEv,
  (VTBL_ENTRY)&_ZN6dd70603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv)();
extern void ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv)();
extern void ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb605cc060__6dd7060__7ee77060[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7060[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv),
};
static  VTT_ENTRY vtt_ee77060[] = {
  {&(_ZTV7ee77060[4]),  4,19},
  {&(_ZTV7ee77060[11]),  11,19},
  {&(_ZTV7ee77060[17]),  17,19},
  {&(_tg__ZTV6dd7060__7ee77060[3]),  3,5},
  {&(_tg__ZTV4bb605cc060__6dd7060__7ee77060[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77060[];
extern  VTBL_ENTRY _ZTV7ee77060[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77060[];
static VTBL_ENTRY alt_thunk_names45[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70603fooEv,_ZTv0_n16_N6dd70603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603fooEv,_ZThn8_N6dd70603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70603barEv,_ZTv0_n12_N6dd70603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70603barEv,_ZThn8_N6dd70603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee770603fooEv,_ZTv0_n16_N7ee770603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee770603fooEv,_ZThn16_N7ee770603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee770603barEv,_ZTv0_n12_N7ee770603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee770603barEv,_ZThn16_N7ee770603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee770603fooEv,_ZTv0_n20_N7ee770603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee770603fooEv,_ZThn8_N7ee770603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee770603barEv,_ZTv0_n16_N7ee770603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee770603barEv,_ZThn8_N7ee770603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77060 = {  "ee77060", // class name
  bases_ee77060, 4,
  &(vtc_ee77060[0]), // expected_vtbl_contents
  &(vtt_ee77060[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77060),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77060),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77060),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names45,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc160  : virtual bb60 {
  int c;
  ~cc160(); // tgen
  cc160(); // tgen
};
//SIG(-1 cc160) C1{ VBC2{ BC3{ Fi} v1 v2 Fi} Fi}


cc160 ::~cc160(){ note_dtor("cc160", this);} // tgen
cc160 ::cc160(){ note_ctor("cc160", this);} // tgen

static void Test_cc160()
{
  extern Class_Descriptor cd_cc160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc160, buf);
    cc160 *dp, &lv = *(dp=new (buf) cc160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,12), "cc160");
    check_base_class_offset(lv, (bb60*), ABISELECT(16,8), "cc160");
    check_field_offset(lv, c, ABISELECT(8,4), "cc160.c");
    test_class_info(&lv, &cd_cc160);
    dp->~cc160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc160(Test_cc160, "cc160", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc160C1Ev();
extern void _ZN5cc160D1Ev();
Name_Map name_map_cc160[] = {
  NSPAIR(_ZN5cc160C1Ev),
  NSPAIR(_ZN5cc160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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 _ZTI5cc160[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_cc160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV5cc160[];
static  VTT_ENTRY vtt_cc160[] = {
  {&(_ZTV5cc160[3]),  3,9},
  {&(_ZTV5cc160[7]),  7,9},
};
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
Class_Descriptor cd_cc160 = {  "cc160", // class name
  bases_cc160, 2,
  &(vtc_cc160[0]), // expected_vtbl_contents
  &(vtt_cc160[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc160),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc160),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  dd0160  : cc160 {
  int d;
  ~dd0160(); // tgen
  dd0160(); // tgen
};
//SIG(-1 dd0160) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} Fi} Fi}


dd0160 ::~dd0160(){ note_dtor("dd0160", this);} // tgen
dd0160 ::dd0160(){ note_ctor("dd0160", this);} // tgen

static void Test_dd0160()
{
  extern Class_Descriptor cd_dd0160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0160, buf);
    dd0160 *dp, &lv = *(dp=new (buf) dd0160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd0160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(16,12), "dd0160");
    check_base_class_offset(lv, (cc160*), 0, "dd0160");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0160.d");
    test_class_info(&lv, &cd_dd0160);
    dp->~dd0160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0160(Test_dd0160, "dd0160", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0160C1Ev();
extern void _ZN6dd0160D1Ev();
Name_Map name_map_dd0160[] = {
  NSPAIR(_ZN6dd0160C1Ev),
  NSPAIR(_ZN6dd0160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd0160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0160[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd0160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd0160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd0160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd0160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd0160[] = {
  {&(_ZTV6dd0160[3]),  3,9},
  {&(_tg__ZTV5cc160__6dd0160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd0160[4]),  4,6},
  {&(_ZTV6dd0160[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
Class_Descriptor cd_dd0160 = {  "dd0160", // class name
  bases_dd0160, 3,
  &(vtc_dd0160[0]), // expected_vtbl_contents
  &(vtt_dd0160[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0160),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0160),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  ee00160  : dd0160 {
  int e;
  ~ee00160(); // tgen
  ee00160(); // tgen
};
//SIG(1 ee00160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee00160 ::~ee00160(){ note_dtor("ee00160", this);} // tgen
ee00160 ::ee00160(){ note_ctor("ee00160", this);} // tgen

static void Test_ee00160()
{
  extern Class_Descriptor cd_ee00160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00160, buf);
    ee00160 *dp, &lv = *(dp=new (buf) ee00160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee00160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(24,16), "ee00160");
    check_base_class_offset(lv, (cc160*)(dd0160*), 0, "ee00160");
    check_base_class_offset(lv, (dd0160*), 0, "ee00160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00160.e");
    test_class_info(&lv, &cd_ee00160);
    dp->~ee00160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00160(Test_ee00160, "ee00160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00160C1Ev();
extern void _ZN7ee00160D1Ev();
Name_Map name_map_ee00160[] = {
  NSPAIR(_ZN7ee00160C1Ev),
  NSPAIR(_ZN7ee00160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee00160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00160[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee00160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00160[0]),
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee00160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee00160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee00160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee00160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee00160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee00160[] = {
  {&(_ZTV7ee00160[3]),  3,9},
  {&(_tg__ZTV6dd0160__7ee00160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee00160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee00160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee00160[4]),  4,6},
  {&(_ZTV7ee00160[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee00160[];
extern  VTBL_ENTRY _ZTV7ee00160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00160[];
Class_Descriptor cd_ee00160 = {  "ee00160", // class name
  bases_ee00160, 4,
  &(vtc_ee00160[0]), // expected_vtbl_contents
  &(vtt_ee00160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00160),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00160),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  ee10160  : virtual dd0160 {
  int e;
  ~ee10160(); // tgen
  ee10160(); // tgen
};
//SIG(1 ee10160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee10160 ::~ee10160(){ note_dtor("ee10160", this);} // tgen
ee10160 ::ee10160(){ note_ctor("ee10160", this);} // tgen

static void Test_ee10160()
{
  extern Class_Descriptor cd_ee10160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10160, buf);
    ee10160 *dp, &lv = *(dp=new (buf) ee10160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee10160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(32,20), "ee10160");
    check_base_class_offset(lv, (cc160*)(dd0160*), ABISELECT(16,8), "ee10160");
    check_base_class_offset(lv, (dd0160*), ABISELECT(16,8), "ee10160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10160.e");
    test_class_info(&lv, &cd_ee10160);
    dp->~ee10160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10160(Test_ee10160, "ee10160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10160C1Ev();
extern void _ZN7ee10160D1Ev();
Name_Map name_map_ee10160[] = {
  NSPAIR(_ZN7ee10160C1Ev),
  NSPAIR(_ZN7ee10160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee10160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee10160[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee10160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10160[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10160[0]),
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee10160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee10160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee10160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee10160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee10160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee10160[] = {
  {&(_ZTV7ee10160[4]),  4,13},
  {&(_ZTV7ee10160[7]),  7,13},
  {&(_ZTV7ee10160[11]),  11,13},
  {&(_tg__ZTV6dd0160__7ee10160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee10160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee10160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee10160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10160[];
extern  VTBL_ENTRY _ZTV7ee10160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10160[];
Class_Descriptor cd_ee10160 = {  "ee10160", // class name
  bases_ee10160, 4,
  &(vtc_ee10160[0]), // expected_vtbl_contents
  &(vtt_ee10160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10160),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10160),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  ee20160  : dd0160 {
  int e;
  virtual void  foo(); // _ZN7ee201603fooEv
  ~ee20160(); // tgen
  ee20160(); // tgen
};
//SIG(1 ee20160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee20160 ::foo(){vfunc_called(this, "_ZN7ee201603fooEv");}
ee20160 ::~ee20160(){ note_dtor("ee20160", this);} // tgen
ee20160 ::ee20160(){ note_ctor("ee20160", this);} // tgen

static void Test_ee20160()
{
  extern Class_Descriptor cd_ee20160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20160, buf);
    ee20160 *dp, &lv = *(dp=new (buf) ee20160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee20160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(24,16), "ee20160");
    check_base_class_offset(lv, (cc160*)(dd0160*), 0, "ee20160");
    check_base_class_offset(lv, (dd0160*), 0, "ee20160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20160.e");
    test_class_info(&lv, &cd_ee20160);
    dp->~ee20160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20160(Test_ee20160, "ee20160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20160C1Ev();
extern void _ZN7ee20160D1Ev();
Name_Map name_map_ee20160[] = {
  NSPAIR(_ZN7ee20160C1Ev),
  NSPAIR(_ZN7ee20160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee20160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20160[];
extern void _ZN7ee201603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee201603fooEv,_ZTv0_n16_N7ee201603fooEv)();
extern void ABISELECT(_ZThn24_N7ee201603fooEv,_ZThn16_N7ee201603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20160[0]),
  (VTBL_ENTRY)&_ZN7ee201603fooEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee201603fooEv,_ZTv0_n16_N7ee201603fooEv),
};
extern VTBL_ENTRY _ZTV7ee20160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee20160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee20160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee20160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee20160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee20160[] = {
  {&(_ZTV7ee20160[3]),  3,10},
  {&(_tg__ZTV6dd0160__7ee20160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee20160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee20160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee20160[4]),  4,6},
  {&(_ZTV7ee20160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee20160[];
extern  VTBL_ENTRY _ZTV7ee20160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20160[];
static VTBL_ENTRY alt_thunk_names46[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee201603fooEv,_ZTv0_n16_N7ee201603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee201603fooEv,_ZThn16_N7ee201603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20160 = {  "ee20160", // class name
  bases_ee20160, 4,
  &(vtc_ee20160[0]), // expected_vtbl_contents
  &(vtt_ee20160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names46,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30160  : virtual dd0160 {
  int e;
  virtual void  foo(); // _ZN7ee301603fooEv
  ~ee30160(); // tgen
  ee30160(); // tgen
};
//SIG(1 ee30160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee30160 ::foo(){vfunc_called(this, "_ZN7ee301603fooEv");}
ee30160 ::~ee30160(){ note_dtor("ee30160", this);} // tgen
ee30160 ::ee30160(){ note_ctor("ee30160", this);} // tgen

static void Test_ee30160()
{
  extern Class_Descriptor cd_ee30160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30160, buf);
    ee30160 *dp, &lv = *(dp=new (buf) ee30160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee30160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(32,20), "ee30160");
    check_base_class_offset(lv, (cc160*)(dd0160*), ABISELECT(16,8), "ee30160");
    check_base_class_offset(lv, (dd0160*), ABISELECT(16,8), "ee30160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30160.e");
    test_class_info(&lv, &cd_ee30160);
    dp->~ee30160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30160(Test_ee30160, "ee30160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30160C1Ev();
extern void _ZN7ee30160D1Ev();
Name_Map name_map_ee30160[] = {
  NSPAIR(_ZN7ee30160C1Ev),
  NSPAIR(_ZN7ee30160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee30160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee30160[];
extern void _ZN7ee301603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee301603fooEv,_ZTv0_n16_N7ee301603fooEv)();
extern void ABISELECT(_ZThn32_N7ee301603fooEv,_ZThn20_N7ee301603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30160[0]),
  (VTBL_ENTRY)&_ZN7ee301603fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30160[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee301603fooEv,_ZTv0_n16_N7ee301603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee30160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee30160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee30160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee30160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee30160[] = {
  {&(_ZTV7ee30160[4]),  4,14},
  {&(_ZTV7ee30160[8]),  8,14},
  {&(_ZTV7ee30160[12]),  12,14},
  {&(_tg__ZTV6dd0160__7ee30160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee30160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee30160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee30160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30160[];
extern  VTBL_ENTRY _ZTV7ee30160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30160[];
static VTBL_ENTRY alt_thunk_names47[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee301603fooEv,_ZTv0_n16_N7ee301603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee301603fooEv,_ZThn20_N7ee301603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30160 = {  "ee30160", // class name
  bases_ee30160, 4,
  &(vtc_ee30160[0]), // expected_vtbl_contents
  &(vtt_ee30160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names47,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40160  : dd0160 {
  int e;
  virtual void  bar(); // _ZN7ee401603barEv
  ~ee40160(); // tgen
  ee40160(); // tgen
};
//SIG(1 ee40160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee40160 ::bar(){vfunc_called(this, "_ZN7ee401603barEv");}
ee40160 ::~ee40160(){ note_dtor("ee40160", this);} // tgen
ee40160 ::ee40160(){ note_ctor("ee40160", this);} // tgen

static void Test_ee40160()
{
  extern Class_Descriptor cd_ee40160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40160, buf);
    ee40160 *dp, &lv = *(dp=new (buf) ee40160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee40160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(24,16), "ee40160");
    check_base_class_offset(lv, (cc160*)(dd0160*), 0, "ee40160");
    check_base_class_offset(lv, (dd0160*), 0, "ee40160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40160.e");
    test_class_info(&lv, &cd_ee40160);
    dp->~ee40160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40160(Test_ee40160, "ee40160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40160C1Ev();
extern void _ZN7ee40160D1Ev();
Name_Map name_map_ee40160[] = {
  NSPAIR(_ZN7ee40160C1Ev),
  NSPAIR(_ZN7ee40160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee40160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40160[];
extern void _ZN7ee401603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee401603barEv,_ZTv0_n12_N7ee401603barEv)();
extern void ABISELECT(_ZThn24_N7ee401603barEv,_ZThn16_N7ee401603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee40160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40160[0]),
  (VTBL_ENTRY)&_ZN7ee401603barEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee401603barEv,_ZTv0_n12_N7ee401603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee40160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee40160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee40160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee40160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee40160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee40160[] = {
  {&(_ZTV7ee40160[3]),  3,10},
  {&(_tg__ZTV6dd0160__7ee40160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee40160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee40160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee40160[4]),  4,6},
  {&(_ZTV7ee40160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee40160[];
extern  VTBL_ENTRY _ZTV7ee40160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40160[];
static VTBL_ENTRY alt_thunk_names48[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee401603barEv,_ZTv0_n12_N7ee401603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee401603barEv,_ZThn16_N7ee401603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40160 = {  "ee40160", // class name
  bases_ee40160, 4,
  &(vtc_ee40160[0]), // expected_vtbl_contents
  &(vtt_ee40160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names48,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50160  : virtual dd0160 {
  int e;
  virtual void  bar(); // _ZN7ee501603barEv
  ~ee50160(); // tgen
  ee50160(); // tgen
};
//SIG(1 ee50160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee50160 ::bar(){vfunc_called(this, "_ZN7ee501603barEv");}
ee50160 ::~ee50160(){ note_dtor("ee50160", this);} // tgen
ee50160 ::ee50160(){ note_ctor("ee50160", this);} // tgen

static void Test_ee50160()
{
  extern Class_Descriptor cd_ee50160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50160, buf);
    ee50160 *dp, &lv = *(dp=new (buf) ee50160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee50160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(32,20), "ee50160");
    check_base_class_offset(lv, (cc160*)(dd0160*), ABISELECT(16,8), "ee50160");
    check_base_class_offset(lv, (dd0160*), ABISELECT(16,8), "ee50160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50160.e");
    test_class_info(&lv, &cd_ee50160);
    dp->~ee50160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50160(Test_ee50160, "ee50160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50160C1Ev();
extern void _ZN7ee50160D1Ev();
Name_Map name_map_ee50160[] = {
  NSPAIR(_ZN7ee50160C1Ev),
  NSPAIR(_ZN7ee50160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee50160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee50160[];
extern void _ZN7ee501603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee501603barEv,_ZTv0_n12_N7ee501603barEv)();
extern void ABISELECT(_ZThn32_N7ee501603barEv,_ZThn20_N7ee501603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee50160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50160[0]),
  (VTBL_ENTRY)&_ZN7ee501603barEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50160[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee501603barEv,_ZTv0_n12_N7ee501603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee50160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee50160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee50160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee50160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee50160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee50160[] = {
  {&(_ZTV7ee50160[4]),  4,14},
  {&(_ZTV7ee50160[8]),  8,14},
  {&(_ZTV7ee50160[12]),  12,14},
  {&(_tg__ZTV6dd0160__7ee50160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee50160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee50160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee50160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50160[];
extern  VTBL_ENTRY _ZTV7ee50160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50160[];
static VTBL_ENTRY alt_thunk_names49[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee501603barEv,_ZTv0_n12_N7ee501603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee501603barEv,_ZThn20_N7ee501603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50160 = {  "ee50160", // class name
  bases_ee50160, 4,
  &(vtc_ee50160[0]), // expected_vtbl_contents
  &(vtt_ee50160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names49,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60160  : dd0160 {
  int e;
  virtual void  foo(); // _ZN7ee601603fooEv
  virtual void  bar(); // _ZN7ee601603barEv
  ~ee60160(); // tgen
  ee60160(); // tgen
};
//SIG(1 ee60160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee60160 ::foo(){vfunc_called(this, "_ZN7ee601603fooEv");}
void  ee60160 ::bar(){vfunc_called(this, "_ZN7ee601603barEv");}
ee60160 ::~ee60160(){ note_dtor("ee60160", this);} // tgen
ee60160 ::ee60160(){ note_ctor("ee60160", this);} // tgen

static void Test_ee60160()
{
  extern Class_Descriptor cd_ee60160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60160, buf);
    ee60160 *dp, &lv = *(dp=new (buf) ee60160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee60160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(24,16), "ee60160");
    check_base_class_offset(lv, (cc160*)(dd0160*), 0, "ee60160");
    check_base_class_offset(lv, (dd0160*), 0, "ee60160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60160.e");
    test_class_info(&lv, &cd_ee60160);
    dp->~ee60160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60160(Test_ee60160, "ee60160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60160C1Ev();
extern void _ZN7ee60160D1Ev();
Name_Map name_map_ee60160[] = {
  NSPAIR(_ZN7ee60160C1Ev),
  NSPAIR(_ZN7ee60160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee60160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60160[];
extern void _ZN7ee601603fooEv();
extern void _ZN7ee601603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee601603barEv,_ZTv0_n12_N7ee601603barEv)();
extern void ABISELECT(_ZThn24_N7ee601603barEv,_ZThn16_N7ee601603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee601603fooEv,_ZTv0_n16_N7ee601603fooEv)();
extern void ABISELECT(_ZThn24_N7ee601603fooEv,_ZThn16_N7ee601603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60160[0]),
  (VTBL_ENTRY)&_ZN7ee601603fooEv,
  (VTBL_ENTRY)&_ZN7ee601603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee601603barEv,_ZTv0_n12_N7ee601603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee601603fooEv,_ZTv0_n16_N7ee601603fooEv),
};
extern VTBL_ENTRY _ZTV7ee60160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee60160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee60160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee60160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee60160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee60160[] = {
  {&(_ZTV7ee60160[3]),  3,11},
  {&(_tg__ZTV6dd0160__7ee60160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee60160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee60160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee60160[4]),  4,6},
  {&(_ZTV7ee60160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60160[];
extern  VTBL_ENTRY _ZTV7ee60160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60160[];
static VTBL_ENTRY alt_thunk_names50[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee601603fooEv,_ZTv0_n16_N7ee601603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee601603fooEv,_ZThn16_N7ee601603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee601603barEv,_ZTv0_n12_N7ee601603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee601603barEv,_ZThn16_N7ee601603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60160 = {  "ee60160", // class name
  bases_ee60160, 4,
  &(vtc_ee60160[0]), // expected_vtbl_contents
  &(vtt_ee60160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names50,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70160  : virtual dd0160 {
  int e;
  virtual void  foo(); // _ZN7ee701603fooEv
  virtual void  bar(); // _ZN7ee701603barEv
  ~ee70160(); // tgen
  ee70160(); // tgen
};
//SIG(1 ee70160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee70160 ::foo(){vfunc_called(this, "_ZN7ee701603fooEv");}
void  ee70160 ::bar(){vfunc_called(this, "_ZN7ee701603barEv");}
ee70160 ::~ee70160(){ note_dtor("ee70160", this);} // tgen
ee70160 ::ee70160(){ note_ctor("ee70160", this);} // tgen

static void Test_ee70160()
{
  extern Class_Descriptor cd_ee70160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70160, buf);
    ee70160 *dp, &lv = *(dp=new (buf) ee70160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee70160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd0160*), ABISELECT(32,20), "ee70160");
    check_base_class_offset(lv, (cc160*)(dd0160*), ABISELECT(16,8), "ee70160");
    check_base_class_offset(lv, (dd0160*), ABISELECT(16,8), "ee70160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70160.e");
    test_class_info(&lv, &cd_ee70160);
    dp->~ee70160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70160(Test_ee70160, "ee70160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70160C1Ev();
extern void _ZN7ee70160D1Ev();
Name_Map name_map_ee70160[] = {
  NSPAIR(_ZN7ee70160C1Ev),
  NSPAIR(_ZN7ee70160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd0160;
extern VTBL_ENTRY _ZTI6dd0160[];
extern  VTBL_ENTRY _ZTV6dd0160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0160[];
static Base_Class bases_ee70160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0160,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee70160[];
extern void _ZN7ee701603fooEv();
extern void _ZN7ee701603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee701603barEv,_ZTv0_n12_N7ee701603barEv)();
extern void ABISELECT(_ZThn32_N7ee701603barEv,_ZThn20_N7ee701603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee701603fooEv,_ZTv0_n16_N7ee701603fooEv)();
extern void ABISELECT(_ZThn32_N7ee701603fooEv,_ZThn20_N7ee701603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70160[0]),
  (VTBL_ENTRY)&_ZN7ee701603fooEv,
  (VTBL_ENTRY)&_ZN7ee701603barEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee701603barEv,_ZTv0_n12_N7ee701603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee701603fooEv,_ZTv0_n16_N7ee701603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70160[];
static  VTBL_ENTRY _tg__ZTV6dd0160__7ee70160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd0160__7ee70160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd0160__7ee70160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0160__7ee70160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee70160[] = {
  {&(_ZTV7ee70160[4]),  4,15},
  {&(_ZTV7ee70160[9]),  9,15},
  {&(_ZTV7ee70160[13]),  13,15},
  {&(_tg__ZTV6dd0160__7ee70160[3]),  3,3},
  {&(_tg__ZTV5cc1606dd0160__7ee70160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd0160__7ee70160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0160__7ee70160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70160[];
extern  VTBL_ENTRY _ZTV7ee70160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70160[];
static VTBL_ENTRY alt_thunk_names51[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee701603fooEv,_ZTv0_n16_N7ee701603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee701603fooEv,_ZThn20_N7ee701603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee701603barEv,_ZTv0_n12_N7ee701603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee701603barEv,_ZThn20_N7ee701603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70160 = {  "ee70160", // class name
  bases_ee70160, 4,
  &(vtc_ee70160[0]), // expected_vtbl_contents
  &(vtt_ee70160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names51,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1160  : virtual cc160 {
  int d;
  ~dd1160(); // tgen
  dd1160(); // tgen
};
//SIG(-1 dd1160) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} Fi} Fi}


dd1160 ::~dd1160(){ note_dtor("dd1160", this);} // tgen
dd1160 ::dd1160(){ note_ctor("dd1160", this);} // tgen

static void Test_dd1160()
{
  extern Class_Descriptor cd_dd1160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1160, buf);
    dd1160 *dp, &lv = *(dp=new (buf) dd1160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd1160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,16), "dd1160");
    check_base_class_offset(lv, (cc160*), ABISELECT(16,8), "dd1160");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1160.d");
    test_class_info(&lv, &cd_dd1160);
    dp->~dd1160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1160(Test_dd1160, "dd1160", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1160C1Ev();
extern void _ZN6dd1160D1Ev();
Name_Map name_map_dd1160[] = {
  NSPAIR(_ZN6dd1160C1Ev),
  NSPAIR(_ZN6dd1160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd1160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd1160[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd1160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd1160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd1160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd1160[] = {
  {&(_ZTV6dd1160[4]),  4,13},
  {&(_ZTV6dd1160[7]),  7,13},
  {&(_ZTV6dd1160[11]),  11,13},
  {&(_tg__ZTV5cc160__6dd1160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd1160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
Class_Descriptor cd_dd1160 = {  "dd1160", // class name
  bases_dd1160, 3,
  &(vtc_dd1160[0]), // expected_vtbl_contents
  &(vtt_dd1160[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1160),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1160),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  ee01160  : dd1160 {
  int e;
  ~ee01160(); // tgen
  ee01160(); // tgen
};
//SIG(1 ee01160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee01160 ::~ee01160(){ note_dtor("ee01160", this);} // tgen
ee01160 ::ee01160(){ note_ctor("ee01160", this);} // tgen

static void Test_ee01160()
{
  extern Class_Descriptor cd_ee01160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01160, buf);
    ee01160 *dp, &lv = *(dp=new (buf) ee01160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee01160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee01160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(16,12), "ee01160");
    check_base_class_offset(lv, (dd1160*), 0, "ee01160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01160.e");
    test_class_info(&lv, &cd_ee01160);
    dp->~ee01160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01160(Test_ee01160, "ee01160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01160C1Ev();
extern void _ZN7ee01160D1Ev();
Name_Map name_map_ee01160[] = {
  NSPAIR(_ZN7ee01160C1Ev),
  NSPAIR(_ZN7ee01160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee01160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01160[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee01160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01160[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01160[0]),
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee01160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee01160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee01160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee01160[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee01160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee01160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee01160[] = {
  {&(_ZTV7ee01160[4]),  4,13},
  {&(_tg__ZTV6dd1160__7ee01160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee01160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee01160[4]),  4,6},
  {&(_ZTV7ee01160[7]),  7,13},
  {&(_ZTV7ee01160[11]),  11,13},
  {&(_tg__ZTV5cc160__7ee01160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee01160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01160[];
extern  VTBL_ENTRY _ZTV7ee01160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01160[];
Class_Descriptor cd_ee01160 = {  "ee01160", // class name
  bases_ee01160, 4,
  &(vtc_ee01160[0]), // expected_vtbl_contents
  &(vtt_ee01160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01160),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11160  : virtual dd1160 {
  int e;
  ~ee11160(); // tgen
  ee11160(); // tgen
};
//SIG(1 ee11160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} Fi}


ee11160 ::~ee11160(){ note_dtor("ee11160", this);} // tgen
ee11160 ::ee11160(){ note_ctor("ee11160", this);} // tgen

static void Test_ee11160()
{
  extern Class_Descriptor cd_ee11160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11160, buf);
    ee11160 *dp, &lv = *(dp=new (buf) ee11160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee11160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee11160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(32,16), "ee11160");
    check_base_class_offset(lv, (dd1160*), ABISELECT(16,8), "ee11160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11160.e");
    test_class_info(&lv, &cd_ee11160);
    dp->~ee11160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11160(Test_ee11160, "ee11160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11160C1Ev();
extern void _ZN7ee11160D1Ev();
Name_Map name_map_ee11160[] = {
  NSPAIR(_ZN7ee11160C1Ev),
  NSPAIR(_ZN7ee11160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee11160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11160[];
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee11160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11160[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11160[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11160[0]),
  0,
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee11160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee11160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee11160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee11160[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee11160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee11160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee11160[] = {
  {&(_ZTV7ee11160[5]),  5,18},
  {&(_ZTV7ee11160[9]),  9,18},
  {&(_ZTV7ee11160[12]),  12,18},
  {&(_ZTV7ee11160[16]),  16,18},
  {&(_tg__ZTV6dd1160__7ee11160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee11160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee11160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee11160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee11160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11160[];
extern  VTBL_ENTRY _ZTV7ee11160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11160[];
Class_Descriptor cd_ee11160 = {  "ee11160", // class name
  bases_ee11160, 4,
  &(vtc_ee11160[0]), // expected_vtbl_contents
  &(vtt_ee11160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11160),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21160  : dd1160 {
  int e;
  virtual void  foo(); // _ZN7ee211603fooEv
  ~ee21160(); // tgen
  ee21160(); // tgen
};
//SIG(1 ee21160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee21160 ::foo(){vfunc_called(this, "_ZN7ee211603fooEv");}
ee21160 ::~ee21160(){ note_dtor("ee21160", this);} // tgen
ee21160 ::ee21160(){ note_ctor("ee21160", this);} // tgen

static void Test_ee21160()
{
  extern Class_Descriptor cd_ee21160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21160, buf);
    ee21160 *dp, &lv = *(dp=new (buf) ee21160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee21160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee21160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(16,12), "ee21160");
    check_base_class_offset(lv, (dd1160*), 0, "ee21160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21160.e");
    test_class_info(&lv, &cd_ee21160);
    dp->~ee21160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21160(Test_ee21160, "ee21160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21160C1Ev();
extern void _ZN7ee21160D1Ev();
Name_Map name_map_ee21160[] = {
  NSPAIR(_ZN7ee21160C1Ev),
  NSPAIR(_ZN7ee21160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee21160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21160[];
extern void _ZN7ee211603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee211603fooEv,_ZTv0_n16_N7ee211603fooEv)();
extern void ABISELECT(_ZThn32_N7ee211603fooEv,_ZThn20_N7ee211603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21160[0]),
  (VTBL_ENTRY)&_ZN7ee211603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21160[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee211603fooEv,_ZTv0_n16_N7ee211603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee21160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee21160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee21160[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee21160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee21160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee21160[] = {
  {&(_ZTV7ee21160[4]),  4,14},
  {&(_tg__ZTV6dd1160__7ee21160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee21160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee21160[4]),  4,6},
  {&(_ZTV7ee21160[8]),  8,14},
  {&(_ZTV7ee21160[12]),  12,14},
  {&(_tg__ZTV5cc160__7ee21160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee21160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21160[];
extern  VTBL_ENTRY _ZTV7ee21160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21160[];
static VTBL_ENTRY alt_thunk_names52[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee211603fooEv,_ZTv0_n16_N7ee211603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee211603fooEv,_ZThn20_N7ee211603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21160 = {  "ee21160", // class name
  bases_ee21160, 4,
  &(vtc_ee21160[0]), // expected_vtbl_contents
  &(vtt_ee21160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names52,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31160  : virtual dd1160 {
  int e;
  virtual void  foo(); // _ZN7ee311603fooEv
  ~ee31160(); // tgen
  ee31160(); // tgen
};
//SIG(1 ee31160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee31160 ::foo(){vfunc_called(this, "_ZN7ee311603fooEv");}
ee31160 ::~ee31160(){ note_dtor("ee31160", this);} // tgen
ee31160 ::ee31160(){ note_ctor("ee31160", this);} // tgen

static void Test_ee31160()
{
  extern Class_Descriptor cd_ee31160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31160, buf);
    ee31160 *dp, &lv = *(dp=new (buf) ee31160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee31160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee31160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(32,16), "ee31160");
    check_base_class_offset(lv, (dd1160*), ABISELECT(16,8), "ee31160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31160.e");
    test_class_info(&lv, &cd_ee31160);
    dp->~ee31160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31160(Test_ee31160, "ee31160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31160C1Ev();
extern void _ZN7ee31160D1Ev();
Name_Map name_map_ee31160[] = {
  NSPAIR(_ZN7ee31160C1Ev),
  NSPAIR(_ZN7ee31160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee31160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31160[];
extern void _ZN7ee311603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee311603fooEv,_ZTv0_n16_N7ee311603fooEv)();
extern void ABISELECT(_ZThn48_N7ee311603fooEv,_ZThn24_N7ee311603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31160[0]),
  (VTBL_ENTRY)&_ZN7ee311603fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31160[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31160[0]),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee311603fooEv,_ZTv0_n16_N7ee311603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee31160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee31160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee31160[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee31160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee31160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee31160[] = {
  {&(_ZTV7ee31160[5]),  5,19},
  {&(_ZTV7ee31160[10]),  10,19},
  {&(_ZTV7ee31160[13]),  13,19},
  {&(_ZTV7ee31160[17]),  17,19},
  {&(_tg__ZTV6dd1160__7ee31160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee31160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee31160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee31160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee31160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31160[];
extern  VTBL_ENTRY _ZTV7ee31160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31160[];
static VTBL_ENTRY alt_thunk_names53[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee311603fooEv,_ZTv0_n16_N7ee311603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee311603fooEv,_ZThn24_N7ee311603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31160 = {  "ee31160", // class name
  bases_ee31160, 4,
  &(vtc_ee31160[0]), // expected_vtbl_contents
  &(vtt_ee31160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31160),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names53,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41160  : dd1160 {
  int e;
  virtual void  bar(); // _ZN7ee411603barEv
  ~ee41160(); // tgen
  ee41160(); // tgen
};
//SIG(1 ee41160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee41160 ::bar(){vfunc_called(this, "_ZN7ee411603barEv");}
ee41160 ::~ee41160(){ note_dtor("ee41160", this);} // tgen
ee41160 ::ee41160(){ note_ctor("ee41160", this);} // tgen

static void Test_ee41160()
{
  extern Class_Descriptor cd_ee41160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41160, buf);
    ee41160 *dp, &lv = *(dp=new (buf) ee41160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee41160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee41160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(16,12), "ee41160");
    check_base_class_offset(lv, (dd1160*), 0, "ee41160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41160.e");
    test_class_info(&lv, &cd_ee41160);
    dp->~ee41160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41160(Test_ee41160, "ee41160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41160C1Ev();
extern void _ZN7ee41160D1Ev();
Name_Map name_map_ee41160[] = {
  NSPAIR(_ZN7ee41160C1Ev),
  NSPAIR(_ZN7ee41160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee41160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41160[];
extern void _ZN7ee411603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee411603barEv,_ZTv0_n12_N7ee411603barEv)();
extern void ABISELECT(_ZThn32_N7ee411603barEv,_ZThn20_N7ee411603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee41160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41160[0]),
  (VTBL_ENTRY)&_ZN7ee411603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41160[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee411603barEv,_ZTv0_n12_N7ee411603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee41160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee41160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee41160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee41160[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee41160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee41160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee41160[] = {
  {&(_ZTV7ee41160[4]),  4,14},
  {&(_tg__ZTV6dd1160__7ee41160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee41160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee41160[4]),  4,6},
  {&(_ZTV7ee41160[8]),  8,14},
  {&(_ZTV7ee41160[12]),  12,14},
  {&(_tg__ZTV5cc160__7ee41160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee41160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41160[];
extern  VTBL_ENTRY _ZTV7ee41160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41160[];
static VTBL_ENTRY alt_thunk_names54[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee411603barEv,_ZTv0_n12_N7ee411603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee411603barEv,_ZThn20_N7ee411603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41160 = {  "ee41160", // class name
  bases_ee41160, 4,
  &(vtc_ee41160[0]), // expected_vtbl_contents
  &(vtt_ee41160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names54,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51160  : virtual dd1160 {
  int e;
  virtual void  bar(); // _ZN7ee511603barEv
  ~ee51160(); // tgen
  ee51160(); // tgen
};
//SIG(1 ee51160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee51160 ::bar(){vfunc_called(this, "_ZN7ee511603barEv");}
ee51160 ::~ee51160(){ note_dtor("ee51160", this);} // tgen
ee51160 ::ee51160(){ note_ctor("ee51160", this);} // tgen

static void Test_ee51160()
{
  extern Class_Descriptor cd_ee51160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51160, buf);
    ee51160 *dp, &lv = *(dp=new (buf) ee51160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee51160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee51160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(32,16), "ee51160");
    check_base_class_offset(lv, (dd1160*), ABISELECT(16,8), "ee51160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51160.e");
    test_class_info(&lv, &cd_ee51160);
    dp->~ee51160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51160(Test_ee51160, "ee51160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51160C1Ev();
extern void _ZN7ee51160D1Ev();
Name_Map name_map_ee51160[] = {
  NSPAIR(_ZN7ee51160C1Ev),
  NSPAIR(_ZN7ee51160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee51160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51160[];
extern void _ZN7ee511603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee511603barEv,_ZTv0_n12_N7ee511603barEv)();
extern void ABISELECT(_ZThn48_N7ee511603barEv,_ZThn24_N7ee511603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee51160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51160[0]),
  (VTBL_ENTRY)&_ZN7ee511603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51160[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51160[0]),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee511603barEv,_ZTv0_n12_N7ee511603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee51160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee51160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee51160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee51160[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee51160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee51160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee51160[] = {
  {&(_ZTV7ee51160[5]),  5,19},
  {&(_ZTV7ee51160[10]),  10,19},
  {&(_ZTV7ee51160[13]),  13,19},
  {&(_ZTV7ee51160[17]),  17,19},
  {&(_tg__ZTV6dd1160__7ee51160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee51160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee51160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee51160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee51160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51160[];
extern  VTBL_ENTRY _ZTV7ee51160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51160[];
static VTBL_ENTRY alt_thunk_names55[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee511603barEv,_ZTv0_n12_N7ee511603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee511603barEv,_ZThn24_N7ee511603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51160 = {  "ee51160", // class name
  bases_ee51160, 4,
  &(vtc_ee51160[0]), // expected_vtbl_contents
  &(vtt_ee51160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51160),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names55,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61160  : dd1160 {
  int e;
  virtual void  foo(); // _ZN7ee611603fooEv
  virtual void  bar(); // _ZN7ee611603barEv
  ~ee61160(); // tgen
  ee61160(); // tgen
};
//SIG(1 ee61160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee61160 ::foo(){vfunc_called(this, "_ZN7ee611603fooEv");}
void  ee61160 ::bar(){vfunc_called(this, "_ZN7ee611603barEv");}
ee61160 ::~ee61160(){ note_dtor("ee61160", this);} // tgen
ee61160 ::ee61160(){ note_ctor("ee61160", this);} // tgen

static void Test_ee61160()
{
  extern Class_Descriptor cd_ee61160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61160, buf);
    ee61160 *dp, &lv = *(dp=new (buf) ee61160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee61160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee61160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(16,12), "ee61160");
    check_base_class_offset(lv, (dd1160*), 0, "ee61160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61160.e");
    test_class_info(&lv, &cd_ee61160);
    dp->~ee61160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61160(Test_ee61160, "ee61160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61160C1Ev();
extern void _ZN7ee61160D1Ev();
Name_Map name_map_ee61160[] = {
  NSPAIR(_ZN7ee61160C1Ev),
  NSPAIR(_ZN7ee61160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee61160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61160[];
extern void _ZN7ee611603fooEv();
extern void _ZN7ee611603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee611603barEv,_ZTv0_n12_N7ee611603barEv)();
extern void ABISELECT(_ZThn32_N7ee611603barEv,_ZThn20_N7ee611603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee611603fooEv,_ZTv0_n16_N7ee611603fooEv)();
extern void ABISELECT(_ZThn32_N7ee611603fooEv,_ZThn20_N7ee611603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61160[0]),
  (VTBL_ENTRY)&_ZN7ee611603fooEv,
  (VTBL_ENTRY)&_ZN7ee611603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee611603barEv,_ZTv0_n12_N7ee611603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee611603fooEv,_ZTv0_n16_N7ee611603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee61160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee61160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee61160[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee61160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee61160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee61160[] = {
  {&(_ZTV7ee61160[4]),  4,15},
  {&(_tg__ZTV6dd1160__7ee61160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee61160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee61160[4]),  4,6},
  {&(_ZTV7ee61160[9]),  9,15},
  {&(_ZTV7ee61160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee61160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee61160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61160[];
extern  VTBL_ENTRY _ZTV7ee61160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61160[];
static VTBL_ENTRY alt_thunk_names56[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee611603fooEv,_ZTv0_n16_N7ee611603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee611603fooEv,_ZThn20_N7ee611603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee611603barEv,_ZTv0_n12_N7ee611603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee611603barEv,_ZThn20_N7ee611603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61160 = {  "ee61160", // class name
  bases_ee61160, 4,
  &(vtc_ee61160[0]), // expected_vtbl_contents
  &(vtt_ee61160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names56,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71160  : virtual dd1160 {
  int e;
  virtual void  foo(); // _ZN7ee711603fooEv
  virtual void  bar(); // _ZN7ee711603barEv
  ~ee71160(); // tgen
  ee71160(); // tgen
};
//SIG(1 ee71160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee71160 ::foo(){vfunc_called(this, "_ZN7ee711603fooEv");}
void  ee71160 ::bar(){vfunc_called(this, "_ZN7ee711603barEv");}
ee71160 ::~ee71160(){ note_dtor("ee71160", this);} // tgen
ee71160 ::ee71160(){ note_ctor("ee71160", this);} // tgen

static void Test_ee71160()
{
  extern Class_Descriptor cd_ee71160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71160, buf);
    ee71160 *dp, &lv = *(dp=new (buf) ee71160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee71160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee71160");
    check_base_class_offset(lv, (cc160*)(dd1160*), ABISELECT(32,16), "ee71160");
    check_base_class_offset(lv, (dd1160*), ABISELECT(16,8), "ee71160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71160.e");
    test_class_info(&lv, &cd_ee71160);
    dp->~ee71160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71160(Test_ee71160, "ee71160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71160C1Ev();
extern void _ZN7ee71160D1Ev();
Name_Map name_map_ee71160[] = {
  NSPAIR(_ZN7ee71160C1Ev),
  NSPAIR(_ZN7ee71160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd1160;
extern VTBL_ENTRY _ZTI6dd1160[];
extern  VTBL_ENTRY _ZTV6dd1160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1160[];
static Base_Class bases_ee71160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee71160[];
extern void _ZN7ee711603fooEv();
extern void _ZN7ee711603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee711603barEv,_ZTv0_n12_N7ee711603barEv)();
extern void ABISELECT(_ZThn48_N7ee711603barEv,_ZThn24_N7ee711603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee711603fooEv,_ZTv0_n16_N7ee711603fooEv)();
extern void ABISELECT(_ZThn48_N7ee711603fooEv,_ZThn24_N7ee711603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71160[0]),
  (VTBL_ENTRY)&_ZN7ee711603fooEv,
  (VTBL_ENTRY)&_ZN7ee711603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71160[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71160[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee711603barEv,_ZTv0_n12_N7ee711603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee711603fooEv,_ZTv0_n16_N7ee711603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71160[];
static  VTBL_ENTRY _tg__ZTV6dd1160__7ee71160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd1160__7ee71160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1160__7ee71160[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee71160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee71160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee71160[] = {
  {&(_ZTV7ee71160[5]),  5,20},
  {&(_ZTV7ee71160[11]),  11,20},
  {&(_ZTV7ee71160[14]),  14,20},
  {&(_ZTV7ee71160[18]),  18,20},
  {&(_tg__ZTV6dd1160__7ee71160[4]),  4,4},
  {&(_tg__ZTV5cc160__6dd1160__7ee71160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd1160__7ee71160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee71160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee71160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71160[];
extern  VTBL_ENTRY _ZTV7ee71160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71160[];
static VTBL_ENTRY alt_thunk_names57[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee711603fooEv,_ZTv0_n16_N7ee711603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee711603fooEv,_ZThn24_N7ee711603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee711603barEv,_ZTv0_n12_N7ee711603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee711603barEv,_ZThn24_N7ee711603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71160 = {  "ee71160", // class name
  bases_ee71160, 4,
  &(vtc_ee71160[0]), // expected_vtbl_contents
  &(vtt_ee71160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71160),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names57,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2160  : cc160 {
  int d;
  virtual void  foo(); // _ZN6dd21603fooEv
  ~dd2160(); // tgen
  dd2160(); // tgen
};
//SIG(-1 dd2160) C1{ BC2{ VBC3{ BC4{ Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd2160 ::foo(){vfunc_called(this, "_ZN6dd21603fooEv");}
dd2160 ::~dd2160(){ note_dtor("dd2160", this);} // tgen
dd2160 ::dd2160(){ note_ctor("dd2160", this);} // tgen

static void Test_dd2160()
{
  extern Class_Descriptor cd_dd2160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2160, buf);
    dd2160 *dp, &lv = *(dp=new (buf) dd2160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd2160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(16,12), "dd2160");
    check_base_class_offset(lv, (cc160*), 0, "dd2160");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2160.d");
    test_class_info(&lv, &cd_dd2160);
    dp->~dd2160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2160(Test_dd2160, "dd2160", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2160C1Ev();
extern void _ZN6dd2160D1Ev();
Name_Map name_map_dd2160[] = {
  NSPAIR(_ZN6dd2160C1Ev),
  NSPAIR(_ZN6dd2160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd2160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2160[];
extern void _ZN6dd21603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
extern VTBL_ENTRY _ZTV6dd2160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd2160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd2160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd2160[] = {
  {&(_ZTV6dd2160[3]),  3,10},
  {&(_tg__ZTV5cc160__6dd2160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd2160[4]),  4,6},
  {&(_ZTV6dd2160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static VTBL_ENTRY alt_thunk_names58[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2160 = {  "dd2160", // class name
  bases_dd2160, 3,
  &(vtc_dd2160[0]), // expected_vtbl_contents
  &(vtt_dd2160[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2160),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names58,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02160  : dd2160 {
  int e;
  ~ee02160(); // tgen
  ee02160(); // tgen
};
//SIG(1 ee02160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee02160 ::~ee02160(){ note_dtor("ee02160", this);} // tgen
ee02160 ::ee02160(){ note_ctor("ee02160", this);} // tgen

static void Test_ee02160()
{
  extern Class_Descriptor cd_ee02160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02160, buf);
    ee02160 *dp, &lv = *(dp=new (buf) ee02160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee02160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(24,16), "ee02160");
    check_base_class_offset(lv, (cc160*)(dd2160*), 0, "ee02160");
    check_base_class_offset(lv, (dd2160*), 0, "ee02160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02160.e");
    test_class_info(&lv, &cd_ee02160);
    dp->~ee02160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02160(Test_ee02160, "ee02160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02160C1Ev();
extern void _ZN7ee02160D1Ev();
Name_Map name_map_ee02160[] = {
  NSPAIR(_ZN7ee02160C1Ev),
  NSPAIR(_ZN7ee02160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee02160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02160[];
extern void _ZN6dd21603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
extern VTBL_ENTRY _ZTV7ee02160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee02160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee02160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee02160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee02160[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee02160[] = {
  {&(_ZTV7ee02160[3]),  3,10},
  {&(_tg__ZTV6dd2160__7ee02160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee02160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee02160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee02160[4]),  4,6},
  {&(_ZTV7ee02160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee02160[];
extern  VTBL_ENTRY _ZTV7ee02160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02160[];
static VTBL_ENTRY alt_thunk_names59[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02160 = {  "ee02160", // class name
  bases_ee02160, 4,
  &(vtc_ee02160[0]), // expected_vtbl_contents
  &(vtt_ee02160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02160),6, //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  ee12160  : virtual dd2160 {
  int e;
  ~ee12160(); // tgen
  ee12160(); // tgen
};
//SIG(1 ee12160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee12160 ::~ee12160(){ note_dtor("ee12160", this);} // tgen
ee12160 ::ee12160(){ note_ctor("ee12160", this);} // tgen

static void Test_ee12160()
{
  extern Class_Descriptor cd_ee12160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12160, buf);
    ee12160 *dp, &lv = *(dp=new (buf) ee12160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee12160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(32,20), "ee12160");
    check_base_class_offset(lv, (cc160*)(dd2160*), ABISELECT(16,8), "ee12160");
    check_base_class_offset(lv, (dd2160*), ABISELECT(16,8), "ee12160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12160.e");
    test_class_info(&lv, &cd_ee12160);
    dp->~ee12160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12160(Test_ee12160, "ee12160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12160C1Ev();
extern void _ZN7ee12160D1Ev();
Name_Map name_map_ee12160[] = {
  NSPAIR(_ZN7ee12160C1Ev),
  NSPAIR(_ZN7ee12160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee12160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12160[];
extern void _ZN6dd21603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12160[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
extern VTBL_ENTRY _ZTV7ee12160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee12160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee12160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee12160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee12160[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee12160[] = {
  {&(_ZTV7ee12160[4]),  4,15},
  {&(_ZTV7ee12160[8]),  8,15},
  {&(_ZTV7ee12160[13]),  13,15},
  {&(_tg__ZTV6dd2160__7ee12160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee12160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee12160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee12160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12160[];
extern  VTBL_ENTRY _ZTV7ee12160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12160[];
static VTBL_ENTRY alt_thunk_names60[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12160 = {  "ee12160", // class name
  bases_ee12160, 4,
  &(vtc_ee12160[0]), // expected_vtbl_contents
  &(vtt_ee12160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12160),7, //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  ee22160  : dd2160 {
  int e;
  virtual void  foo(); // _ZN7ee221603fooEv
  ~ee22160(); // tgen
  ee22160(); // tgen
};
//SIG(1 ee22160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee22160 ::foo(){vfunc_called(this, "_ZN7ee221603fooEv");}
ee22160 ::~ee22160(){ note_dtor("ee22160", this);} // tgen
ee22160 ::ee22160(){ note_ctor("ee22160", this);} // tgen

static void Test_ee22160()
{
  extern Class_Descriptor cd_ee22160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22160, buf);
    ee22160 *dp, &lv = *(dp=new (buf) ee22160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee22160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(24,16), "ee22160");
    check_base_class_offset(lv, (cc160*)(dd2160*), 0, "ee22160");
    check_base_class_offset(lv, (dd2160*), 0, "ee22160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22160.e");
    test_class_info(&lv, &cd_ee22160);
    dp->~ee22160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22160(Test_ee22160, "ee22160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22160C1Ev();
extern void _ZN7ee22160D1Ev();
Name_Map name_map_ee22160[] = {
  NSPAIR(_ZN7ee22160C1Ev),
  NSPAIR(_ZN7ee22160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee22160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22160[];
extern void _ZN7ee221603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee221603fooEv,_ZTv0_n16_N7ee221603fooEv)();
extern void ABISELECT(_ZThn24_N7ee221603fooEv,_ZThn16_N7ee221603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22160[0]),
  (VTBL_ENTRY)&_ZN7ee221603fooEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee221603fooEv,_ZTv0_n16_N7ee221603fooEv),
};
extern VTBL_ENTRY _ZTV7ee22160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee22160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee22160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee22160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee22160[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee22160[] = {
  {&(_ZTV7ee22160[3]),  3,10},
  {&(_tg__ZTV6dd2160__7ee22160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee22160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee22160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee22160[4]),  4,6},
  {&(_ZTV7ee22160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee22160[];
extern  VTBL_ENTRY _ZTV7ee22160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22160[];
static VTBL_ENTRY alt_thunk_names61[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee221603fooEv,_ZTv0_n16_N7ee221603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee221603fooEv,_ZThn16_N7ee221603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22160 = {  "ee22160", // class name
  bases_ee22160, 4,
  &(vtc_ee22160[0]), // expected_vtbl_contents
  &(vtt_ee22160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22160),6, //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  ee32160  : virtual dd2160 {
  int e;
  virtual void  foo(); // _ZN7ee321603fooEv
  ~ee32160(); // tgen
  ee32160(); // tgen
};
//SIG(1 ee32160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee32160 ::foo(){vfunc_called(this, "_ZN7ee321603fooEv");}
ee32160 ::~ee32160(){ note_dtor("ee32160", this);} // tgen
ee32160 ::ee32160(){ note_ctor("ee32160", this);} // tgen

static void Test_ee32160()
{
  extern Class_Descriptor cd_ee32160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32160, buf);
    ee32160 *dp, &lv = *(dp=new (buf) ee32160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee32160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(32,20), "ee32160");
    check_base_class_offset(lv, (cc160*)(dd2160*), ABISELECT(16,8), "ee32160");
    check_base_class_offset(lv, (dd2160*), ABISELECT(16,8), "ee32160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32160.e");
    test_class_info(&lv, &cd_ee32160);
    dp->~ee32160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32160(Test_ee32160, "ee32160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32160C1Ev();
extern void _ZN7ee32160D1Ev();
Name_Map name_map_ee32160[] = {
  NSPAIR(_ZN7ee32160C1Ev),
  NSPAIR(_ZN7ee32160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee32160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32160[];
extern void _ZN7ee321603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee321603fooEv,_ZTv0_n16_N7ee321603fooEv)();
extern void ABISELECT(_ZThn16_N7ee321603fooEv,_ZThn8_N7ee321603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee321603fooEv,_ZTv0_n16_N7ee321603fooEv)();
extern void ABISELECT(_ZThn32_N7ee321603fooEv,_ZThn20_N7ee321603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32160[0]),
  (VTBL_ENTRY)&_ZN7ee321603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee321603fooEv,_ZTv0_n16_N7ee321603fooEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee321603fooEv,_ZTv0_n16_N7ee321603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee32160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee32160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee32160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee32160[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee32160[] = {
  {&(_ZTV7ee32160[4]),  4,16},
  {&(_ZTV7ee32160[9]),  9,16},
  {&(_ZTV7ee32160[14]),  14,16},
  {&(_tg__ZTV6dd2160__7ee32160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee32160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee32160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee32160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32160[];
extern  VTBL_ENTRY _ZTV7ee32160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32160[];
static VTBL_ENTRY alt_thunk_names62[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee321603fooEv,_ZTv0_n16_N7ee321603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee321603fooEv,_ZThn20_N7ee321603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee321603fooEv,_ZThn8_N7ee321603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32160 = {  "ee32160", // class name
  bases_ee32160, 4,
  &(vtc_ee32160[0]), // expected_vtbl_contents
  &(vtt_ee32160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32160),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32160),7, //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  ee42160  : dd2160 {
  int e;
  virtual void  bar(); // _ZN7ee421603barEv
  ~ee42160(); // tgen
  ee42160(); // tgen
};
//SIG(1 ee42160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee42160 ::bar(){vfunc_called(this, "_ZN7ee421603barEv");}
ee42160 ::~ee42160(){ note_dtor("ee42160", this);} // tgen
ee42160 ::ee42160(){ note_ctor("ee42160", this);} // tgen

static void Test_ee42160()
{
  extern Class_Descriptor cd_ee42160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42160, buf);
    ee42160 *dp, &lv = *(dp=new (buf) ee42160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee42160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(24,16), "ee42160");
    check_base_class_offset(lv, (cc160*)(dd2160*), 0, "ee42160");
    check_base_class_offset(lv, (dd2160*), 0, "ee42160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42160.e");
    test_class_info(&lv, &cd_ee42160);
    dp->~ee42160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42160(Test_ee42160, "ee42160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42160C1Ev();
extern void _ZN7ee42160D1Ev();
Name_Map name_map_ee42160[] = {
  NSPAIR(_ZN7ee42160C1Ev),
  NSPAIR(_ZN7ee42160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee42160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42160[];
extern void _ZN6dd21603fooEv();
extern void _ZN7ee421603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee421603barEv,_ZTv0_n12_N7ee421603barEv)();
extern void ABISELECT(_ZThn24_N7ee421603barEv,_ZThn16_N7ee421603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
  (VTBL_ENTRY)&_ZN7ee421603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee421603barEv,_ZTv0_n12_N7ee421603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
extern VTBL_ENTRY _ZTV7ee42160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee42160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee42160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee42160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee42160[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee42160[] = {
  {&(_ZTV7ee42160[3]),  3,11},
  {&(_tg__ZTV6dd2160__7ee42160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee42160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee42160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee42160[4]),  4,6},
  {&(_ZTV7ee42160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42160[];
extern  VTBL_ENTRY _ZTV7ee42160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42160[];
static VTBL_ENTRY alt_thunk_names63[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee421603barEv,_ZTv0_n12_N7ee421603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee421603barEv,_ZThn16_N7ee421603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42160 = {  "ee42160", // class name
  bases_ee42160, 4,
  &(vtc_ee42160[0]), // expected_vtbl_contents
  &(vtt_ee42160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names63,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52160  : virtual dd2160 {
  int e;
  virtual void  bar(); // _ZN7ee521603barEv
  ~ee52160(); // tgen
  ee52160(); // tgen
};
//SIG(1 ee52160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee52160 ::bar(){vfunc_called(this, "_ZN7ee521603barEv");}
ee52160 ::~ee52160(){ note_dtor("ee52160", this);} // tgen
ee52160 ::ee52160(){ note_ctor("ee52160", this);} // tgen

static void Test_ee52160()
{
  extern Class_Descriptor cd_ee52160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52160, buf);
    ee52160 *dp, &lv = *(dp=new (buf) ee52160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee52160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(32,20), "ee52160");
    check_base_class_offset(lv, (cc160*)(dd2160*), ABISELECT(16,8), "ee52160");
    check_base_class_offset(lv, (dd2160*), ABISELECT(16,8), "ee52160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52160.e");
    test_class_info(&lv, &cd_ee52160);
    dp->~ee52160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52160(Test_ee52160, "ee52160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52160C1Ev();
extern void _ZN7ee52160D1Ev();
Name_Map name_map_ee52160[] = {
  NSPAIR(_ZN7ee52160C1Ev),
  NSPAIR(_ZN7ee52160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee52160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52160[];
extern void _ZN7ee521603barEv();
extern void _ZN6dd21603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee521603barEv,_ZTv0_n12_N7ee521603barEv)();
extern void ABISELECT(_ZThn32_N7ee521603barEv,_ZThn20_N7ee521603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52160[0]),
  (VTBL_ENTRY)&_ZN7ee521603barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee521603barEv,_ZTv0_n12_N7ee521603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
extern VTBL_ENTRY _ZTV7ee52160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee52160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee52160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee52160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee52160[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee52160[] = {
  {&(_ZTV7ee52160[4]),  4,16},
  {&(_ZTV7ee52160[9]),  9,16},
  {&(_ZTV7ee52160[14]),  14,16},
  {&(_tg__ZTV6dd2160__7ee52160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee52160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee52160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee52160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52160[];
extern  VTBL_ENTRY _ZTV7ee52160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52160[];
static VTBL_ENTRY alt_thunk_names64[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee521603barEv,_ZTv0_n12_N7ee521603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee521603barEv,_ZThn20_N7ee521603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52160 = {  "ee52160", // class name
  bases_ee52160, 4,
  &(vtc_ee52160[0]), // expected_vtbl_contents
  &(vtt_ee52160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52160),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names64,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62160  : dd2160 {
  int e;
  virtual void  foo(); // _ZN7ee621603fooEv
  virtual void  bar(); // _ZN7ee621603barEv
  ~ee62160(); // tgen
  ee62160(); // tgen
};
//SIG(1 ee62160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee62160 ::foo(){vfunc_called(this, "_ZN7ee621603fooEv");}
void  ee62160 ::bar(){vfunc_called(this, "_ZN7ee621603barEv");}
ee62160 ::~ee62160(){ note_dtor("ee62160", this);} // tgen
ee62160 ::ee62160(){ note_ctor("ee62160", this);} // tgen

static void Test_ee62160()
{
  extern Class_Descriptor cd_ee62160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62160, buf);
    ee62160 *dp, &lv = *(dp=new (buf) ee62160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee62160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(24,16), "ee62160");
    check_base_class_offset(lv, (cc160*)(dd2160*), 0, "ee62160");
    check_base_class_offset(lv, (dd2160*), 0, "ee62160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62160.e");
    test_class_info(&lv, &cd_ee62160);
    dp->~ee62160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62160(Test_ee62160, "ee62160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62160C1Ev();
extern void _ZN7ee62160D1Ev();
Name_Map name_map_ee62160[] = {
  NSPAIR(_ZN7ee62160C1Ev),
  NSPAIR(_ZN7ee62160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee62160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62160[];
extern void _ZN7ee621603fooEv();
extern void _ZN7ee621603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee621603barEv,_ZTv0_n12_N7ee621603barEv)();
extern void ABISELECT(_ZThn24_N7ee621603barEv,_ZThn16_N7ee621603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee621603fooEv,_ZTv0_n16_N7ee621603fooEv)();
extern void ABISELECT(_ZThn24_N7ee621603fooEv,_ZThn16_N7ee621603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62160[0]),
  (VTBL_ENTRY)&_ZN7ee621603fooEv,
  (VTBL_ENTRY)&_ZN7ee621603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee621603barEv,_ZTv0_n12_N7ee621603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee621603fooEv,_ZTv0_n16_N7ee621603fooEv),
};
extern VTBL_ENTRY _ZTV7ee62160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee62160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee62160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee62160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee62160[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee62160[] = {
  {&(_ZTV7ee62160[3]),  3,11},
  {&(_tg__ZTV6dd2160__7ee62160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee62160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee62160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee62160[4]),  4,6},
  {&(_ZTV7ee62160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62160[];
extern  VTBL_ENTRY _ZTV7ee62160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62160[];
static VTBL_ENTRY alt_thunk_names65[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21603fooEv,_ZThn16_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee621603fooEv,_ZTv0_n16_N7ee621603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee621603fooEv,_ZThn16_N7ee621603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee621603barEv,_ZTv0_n12_N7ee621603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee621603barEv,_ZThn16_N7ee621603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62160 = {  "ee62160", // class name
  bases_ee62160, 4,
  &(vtc_ee62160[0]), // expected_vtbl_contents
  &(vtt_ee62160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names65,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72160  : virtual dd2160 {
  int e;
  virtual void  foo(); // _ZN7ee721603fooEv
  virtual void  bar(); // _ZN7ee721603barEv
  ~ee72160(); // tgen
  ee72160(); // tgen
};
//SIG(1 ee72160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee72160 ::foo(){vfunc_called(this, "_ZN7ee721603fooEv");}
void  ee72160 ::bar(){vfunc_called(this, "_ZN7ee721603barEv");}
ee72160 ::~ee72160(){ note_dtor("ee72160", this);} // tgen
ee72160 ::ee72160(){ note_ctor("ee72160", this);} // tgen

static void Test_ee72160()
{
  extern Class_Descriptor cd_ee72160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72160, buf);
    ee72160 *dp, &lv = *(dp=new (buf) ee72160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee72160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd2160*), ABISELECT(32,20), "ee72160");
    check_base_class_offset(lv, (cc160*)(dd2160*), ABISELECT(16,8), "ee72160");
    check_base_class_offset(lv, (dd2160*), ABISELECT(16,8), "ee72160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72160.e");
    test_class_info(&lv, &cd_ee72160);
    dp->~ee72160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72160(Test_ee72160, "ee72160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72160C1Ev();
extern void _ZN7ee72160D1Ev();
Name_Map name_map_ee72160[] = {
  NSPAIR(_ZN7ee72160C1Ev),
  NSPAIR(_ZN7ee72160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd2160;
extern VTBL_ENTRY _ZTI6dd2160[];
extern  VTBL_ENTRY _ZTV6dd2160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2160[];
static Base_Class bases_ee72160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72160[];
extern void _ZN7ee721603fooEv();
extern void _ZN7ee721603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee721603fooEv,_ZTv0_n16_N7ee721603fooEv)();
extern void ABISELECT(_ZThn16_N7ee721603fooEv,_ZThn8_N7ee721603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee721603barEv,_ZTv0_n12_N7ee721603barEv)();
extern void ABISELECT(_ZThn32_N7ee721603barEv,_ZThn20_N7ee721603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee721603fooEv,_ZTv0_n16_N7ee721603fooEv)();
extern void ABISELECT(_ZThn32_N7ee721603fooEv,_ZThn20_N7ee721603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72160[0]),
  (VTBL_ENTRY)&_ZN7ee721603fooEv,
  (VTBL_ENTRY)&_ZN7ee721603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee721603fooEv,_ZTv0_n16_N7ee721603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee721603barEv,_ZTv0_n12_N7ee721603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee721603fooEv,_ZTv0_n16_N7ee721603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72160[];
extern void _ZN6dd21603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2160__7ee72160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN6dd21603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd2160__7ee72160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd2160__7ee72160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv)();
extern void ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2160__7ee72160[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv),
};
static  VTT_ENTRY vtt_ee72160[] = {
  {&(_ZTV7ee72160[4]),  4,17},
  {&(_ZTV7ee72160[10]),  10,17},
  {&(_ZTV7ee72160[15]),  15,17},
  {&(_tg__ZTV6dd2160__7ee72160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd2160__7ee72160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd2160__7ee72160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2160__7ee72160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72160[];
extern  VTBL_ENTRY _ZTV7ee72160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72160[];
static VTBL_ENTRY alt_thunk_names66[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd21603fooEv,_ZTv0_n16_N6dd21603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21603fooEv,_ZThn12_N6dd21603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee721603barEv,_ZTv0_n12_N7ee721603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee721603barEv,_ZThn20_N7ee721603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee721603fooEv,_ZTv0_n16_N7ee721603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee721603fooEv,_ZThn20_N7ee721603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee721603fooEv,_ZThn8_N7ee721603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72160 = {  "ee72160", // class name
  bases_ee72160, 4,
  &(vtc_ee72160[0]), // expected_vtbl_contents
  &(vtt_ee72160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72160),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names66,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3160  : virtual cc160 {
  int d;
  virtual void  foo(); // _ZN6dd31603fooEv
  ~dd3160(); // tgen
  dd3160(); // tgen
};
//SIG(-1 dd3160) C1{ VBC2{ VBC3{ BC4{ Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd3160 ::foo(){vfunc_called(this, "_ZN6dd31603fooEv");}
dd3160 ::~dd3160(){ note_dtor("dd3160", this);} // tgen
dd3160 ::dd3160(){ note_ctor("dd3160", this);} // tgen

static void Test_dd3160()
{
  extern Class_Descriptor cd_dd3160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3160, buf);
    dd3160 *dp, &lv = *(dp=new (buf) dd3160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd3160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,16), "dd3160");
    check_base_class_offset(lv, (cc160*), ABISELECT(16,8), "dd3160");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3160.d");
    test_class_info(&lv, &cd_dd3160);
    dp->~dd3160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3160(Test_dd3160, "dd3160", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3160C1Ev();
extern void _ZN6dd3160D1Ev();
Name_Map name_map_dd3160[] = {
  NSPAIR(_ZN6dd3160C1Ev),
  NSPAIR(_ZN6dd3160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd3160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd3160[];
extern void _ZN6dd31603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd3160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd3160[] = {
  {&(_ZTV6dd3160[4]),  4,14},
  {&(_ZTV6dd3160[8]),  8,14},
  {&(_ZTV6dd3160[12]),  12,14},
  {&(_tg__ZTV5cc160__6dd3160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd3160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static VTBL_ENTRY alt_thunk_names67[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3160 = {  "dd3160", // class name
  bases_dd3160, 3,
  &(vtc_dd3160[0]), // expected_vtbl_contents
  &(vtt_dd3160[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3160),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names67,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03160  : dd3160 {
  int e;
  ~ee03160(); // tgen
  ee03160(); // tgen
};
//SIG(1 ee03160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee03160 ::~ee03160(){ note_dtor("ee03160", this);} // tgen
ee03160 ::ee03160(){ note_ctor("ee03160", this);} // tgen

static void Test_ee03160()
{
  extern Class_Descriptor cd_ee03160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03160, buf);
    ee03160 *dp, &lv = *(dp=new (buf) ee03160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee03160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee03160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(16,12), "ee03160");
    check_base_class_offset(lv, (dd3160*), 0, "ee03160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03160.e");
    test_class_info(&lv, &cd_ee03160);
    dp->~ee03160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03160(Test_ee03160, "ee03160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03160C1Ev();
extern void _ZN7ee03160D1Ev();
Name_Map name_map_ee03160[] = {
  NSPAIR(_ZN7ee03160C1Ev),
  NSPAIR(_ZN7ee03160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee03160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03160[];
extern void _ZN6dd31603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03160[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee03160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee03160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee03160[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee03160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee03160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee03160[] = {
  {&(_ZTV7ee03160[4]),  4,14},
  {&(_tg__ZTV6dd3160__7ee03160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee03160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee03160[4]),  4,6},
  {&(_ZTV7ee03160[8]),  8,14},
  {&(_ZTV7ee03160[12]),  12,14},
  {&(_tg__ZTV5cc160__7ee03160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee03160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03160[];
extern  VTBL_ENTRY _ZTV7ee03160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03160[];
static VTBL_ENTRY alt_thunk_names68[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03160 = {  "ee03160", // class name
  bases_ee03160, 4,
  &(vtc_ee03160[0]), // expected_vtbl_contents
  &(vtt_ee03160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names68,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13160  : virtual dd3160 {
  int e;
  ~ee13160(); // tgen
  ee13160(); // tgen
};
//SIG(1 ee13160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee13160 ::~ee13160(){ note_dtor("ee13160", this);} // tgen
ee13160 ::ee13160(){ note_ctor("ee13160", this);} // tgen

static void Test_ee13160()
{
  extern Class_Descriptor cd_ee13160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13160, buf);
    ee13160 *dp, &lv = *(dp=new (buf) ee13160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee13160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee13160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(32,16), "ee13160");
    check_base_class_offset(lv, (dd3160*), ABISELECT(16,8), "ee13160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13160.e");
    test_class_info(&lv, &cd_ee13160);
    dp->~ee13160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13160(Test_ee13160, "ee13160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13160C1Ev();
extern void _ZN7ee13160D1Ev();
Name_Map name_map_ee13160[] = {
  NSPAIR(_ZN7ee13160C1Ev),
  NSPAIR(_ZN7ee13160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee13160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13160[];
extern void _ZN6dd31603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13160[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13160[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee13160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee13160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee13160[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee13160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee13160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee13160[] = {
  {&(_ZTV7ee13160[5]),  5,20},
  {&(_ZTV7ee13160[10]),  10,20},
  {&(_ZTV7ee13160[14]),  14,20},
  {&(_ZTV7ee13160[18]),  18,20},
  {&(_tg__ZTV6dd3160__7ee13160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee13160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee13160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee13160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee13160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13160[];
extern  VTBL_ENTRY _ZTV7ee13160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13160[];
static VTBL_ENTRY alt_thunk_names69[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13160 = {  "ee13160", // class name
  bases_ee13160, 4,
  &(vtc_ee13160[0]), // expected_vtbl_contents
  &(vtt_ee13160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13160),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names69,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23160  : dd3160 {
  int e;
  virtual void  foo(); // _ZN7ee231603fooEv
  ~ee23160(); // tgen
  ee23160(); // tgen
};
//SIG(1 ee23160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee23160 ::foo(){vfunc_called(this, "_ZN7ee231603fooEv");}
ee23160 ::~ee23160(){ note_dtor("ee23160", this);} // tgen
ee23160 ::ee23160(){ note_ctor("ee23160", this);} // tgen

static void Test_ee23160()
{
  extern Class_Descriptor cd_ee23160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23160, buf);
    ee23160 *dp, &lv = *(dp=new (buf) ee23160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee23160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee23160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(16,12), "ee23160");
    check_base_class_offset(lv, (dd3160*), 0, "ee23160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23160.e");
    test_class_info(&lv, &cd_ee23160);
    dp->~ee23160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23160(Test_ee23160, "ee23160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23160C1Ev();
extern void _ZN7ee23160D1Ev();
Name_Map name_map_ee23160[] = {
  NSPAIR(_ZN7ee23160C1Ev),
  NSPAIR(_ZN7ee23160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee23160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23160[];
extern void _ZN7ee231603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee231603fooEv,_ZTv0_n16_N7ee231603fooEv)();
extern void ABISELECT(_ZThn32_N7ee231603fooEv,_ZThn20_N7ee231603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23160[0]),
  (VTBL_ENTRY)&_ZN7ee231603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23160[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee231603fooEv,_ZTv0_n16_N7ee231603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee23160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee23160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee23160[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee23160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee23160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee23160[] = {
  {&(_ZTV7ee23160[4]),  4,14},
  {&(_tg__ZTV6dd3160__7ee23160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee23160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee23160[4]),  4,6},
  {&(_ZTV7ee23160[8]),  8,14},
  {&(_ZTV7ee23160[12]),  12,14},
  {&(_tg__ZTV5cc160__7ee23160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee23160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23160[];
extern  VTBL_ENTRY _ZTV7ee23160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23160[];
static VTBL_ENTRY alt_thunk_names70[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee231603fooEv,_ZTv0_n16_N7ee231603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee231603fooEv,_ZThn20_N7ee231603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23160 = {  "ee23160", // class name
  bases_ee23160, 4,
  &(vtc_ee23160[0]), // expected_vtbl_contents
  &(vtt_ee23160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names70,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33160  : virtual dd3160 {
  int e;
  virtual void  foo(); // _ZN7ee331603fooEv
  ~ee33160(); // tgen
  ee33160(); // tgen
};
//SIG(1 ee33160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee33160 ::foo(){vfunc_called(this, "_ZN7ee331603fooEv");}
ee33160 ::~ee33160(){ note_dtor("ee33160", this);} // tgen
ee33160 ::ee33160(){ note_ctor("ee33160", this);} // tgen

static void Test_ee33160()
{
  extern Class_Descriptor cd_ee33160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33160, buf);
    ee33160 *dp, &lv = *(dp=new (buf) ee33160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee33160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee33160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(32,16), "ee33160");
    check_base_class_offset(lv, (dd3160*), ABISELECT(16,8), "ee33160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33160.e");
    test_class_info(&lv, &cd_ee33160);
    dp->~ee33160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33160(Test_ee33160, "ee33160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33160C1Ev();
extern void _ZN7ee33160D1Ev();
Name_Map name_map_ee33160[] = {
  NSPAIR(_ZN7ee33160C1Ev),
  NSPAIR(_ZN7ee33160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee33160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33160[];
extern void _ZN7ee331603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee331603fooEv,_ZTv0_n20_N7ee331603fooEv)();
extern void ABISELECT(_ZThn16_N7ee331603fooEv,_ZThn8_N7ee331603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee331603fooEv,_ZTv0_n16_N7ee331603fooEv)();
extern void ABISELECT(_ZThn48_N7ee331603fooEv,_ZThn24_N7ee331603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33160[0]),
  (VTBL_ENTRY)&_ZN7ee331603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee331603fooEv,_ZTv0_n20_N7ee331603fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33160[0]),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee331603fooEv,_ZTv0_n16_N7ee331603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee33160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee33160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee33160[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee33160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee33160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee33160[] = {
  {&(_ZTV7ee33160[5]),  5,21},
  {&(_ZTV7ee33160[11]),  11,21},
  {&(_ZTV7ee33160[15]),  15,21},
  {&(_ZTV7ee33160[19]),  19,21},
  {&(_tg__ZTV6dd3160__7ee33160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee33160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee33160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee33160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee33160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33160[];
extern  VTBL_ENTRY _ZTV7ee33160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33160[];
static VTBL_ENTRY alt_thunk_names71[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee331603fooEv,_ZTv0_n16_N7ee331603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee331603fooEv,_ZThn24_N7ee331603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee331603fooEv,_ZTv0_n20_N7ee331603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee331603fooEv,_ZThn8_N7ee331603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33160 = {  "ee33160", // class name
  bases_ee33160, 4,
  &(vtc_ee33160[0]), // expected_vtbl_contents
  &(vtt_ee33160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33160),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names71,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43160  : dd3160 {
  int e;
  virtual void  bar(); // _ZN7ee431603barEv
  ~ee43160(); // tgen
  ee43160(); // tgen
};
//SIG(1 ee43160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee43160 ::bar(){vfunc_called(this, "_ZN7ee431603barEv");}
ee43160 ::~ee43160(){ note_dtor("ee43160", this);} // tgen
ee43160 ::ee43160(){ note_ctor("ee43160", this);} // tgen

static void Test_ee43160()
{
  extern Class_Descriptor cd_ee43160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43160, buf);
    ee43160 *dp, &lv = *(dp=new (buf) ee43160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee43160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee43160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(16,12), "ee43160");
    check_base_class_offset(lv, (dd3160*), 0, "ee43160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43160.e");
    test_class_info(&lv, &cd_ee43160);
    dp->~ee43160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43160(Test_ee43160, "ee43160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43160C1Ev();
extern void _ZN7ee43160D1Ev();
Name_Map name_map_ee43160[] = {
  NSPAIR(_ZN7ee43160C1Ev),
  NSPAIR(_ZN7ee43160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee43160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43160[];
extern void _ZN6dd31603fooEv();
extern void _ZN7ee431603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee431603barEv,_ZTv0_n12_N7ee431603barEv)();
extern void ABISELECT(_ZThn32_N7ee431603barEv,_ZThn20_N7ee431603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
  (VTBL_ENTRY)&_ZN7ee431603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee431603barEv,_ZTv0_n12_N7ee431603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee43160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee43160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee43160[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee43160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee43160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee43160[] = {
  {&(_ZTV7ee43160[4]),  4,15},
  {&(_tg__ZTV6dd3160__7ee43160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee43160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee43160[4]),  4,6},
  {&(_ZTV7ee43160[9]),  9,15},
  {&(_ZTV7ee43160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee43160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee43160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43160[];
extern  VTBL_ENTRY _ZTV7ee43160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43160[];
static VTBL_ENTRY alt_thunk_names72[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee431603barEv,_ZTv0_n12_N7ee431603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee431603barEv,_ZThn20_N7ee431603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43160 = {  "ee43160", // class name
  bases_ee43160, 4,
  &(vtc_ee43160[0]), // expected_vtbl_contents
  &(vtt_ee43160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names72,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53160  : virtual dd3160 {
  int e;
  virtual void  bar(); // _ZN7ee531603barEv
  ~ee53160(); // tgen
  ee53160(); // tgen
};
//SIG(1 ee53160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee53160 ::bar(){vfunc_called(this, "_ZN7ee531603barEv");}
ee53160 ::~ee53160(){ note_dtor("ee53160", this);} // tgen
ee53160 ::ee53160(){ note_ctor("ee53160", this);} // tgen

static void Test_ee53160()
{
  extern Class_Descriptor cd_ee53160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53160, buf);
    ee53160 *dp, &lv = *(dp=new (buf) ee53160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee53160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee53160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(32,16), "ee53160");
    check_base_class_offset(lv, (dd3160*), ABISELECT(16,8), "ee53160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53160.e");
    test_class_info(&lv, &cd_ee53160);
    dp->~ee53160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53160(Test_ee53160, "ee53160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53160C1Ev();
extern void _ZN7ee53160D1Ev();
Name_Map name_map_ee53160[] = {
  NSPAIR(_ZN7ee53160C1Ev),
  NSPAIR(_ZN7ee53160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee53160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53160[];
extern void _ZN7ee531603barEv();
extern void _ZN6dd31603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee531603barEv,_ZTv0_n12_N7ee531603barEv)();
extern void ABISELECT(_ZThn48_N7ee531603barEv,_ZThn24_N7ee531603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53160[0]),
  (VTBL_ENTRY)&_ZN7ee531603barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53160[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee531603barEv,_ZTv0_n12_N7ee531603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee53160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee53160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee53160[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee53160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee53160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee53160[] = {
  {&(_ZTV7ee53160[5]),  5,21},
  {&(_ZTV7ee53160[11]),  11,21},
  {&(_ZTV7ee53160[15]),  15,21},
  {&(_ZTV7ee53160[19]),  19,21},
  {&(_tg__ZTV6dd3160__7ee53160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee53160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee53160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee53160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee53160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53160[];
extern  VTBL_ENTRY _ZTV7ee53160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53160[];
static VTBL_ENTRY alt_thunk_names73[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee531603barEv,_ZTv0_n12_N7ee531603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee531603barEv,_ZThn24_N7ee531603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53160 = {  "ee53160", // class name
  bases_ee53160, 4,
  &(vtc_ee53160[0]), // expected_vtbl_contents
  &(vtt_ee53160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53160),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names73,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63160  : dd3160 {
  int e;
  virtual void  foo(); // _ZN7ee631603fooEv
  virtual void  bar(); // _ZN7ee631603barEv
  ~ee63160(); // tgen
  ee63160(); // tgen
};
//SIG(1 ee63160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee63160 ::foo(){vfunc_called(this, "_ZN7ee631603fooEv");}
void  ee63160 ::bar(){vfunc_called(this, "_ZN7ee631603barEv");}
ee63160 ::~ee63160(){ note_dtor("ee63160", this);} // tgen
ee63160 ::ee63160(){ note_ctor("ee63160", this);} // tgen

static void Test_ee63160()
{
  extern Class_Descriptor cd_ee63160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63160, buf);
    ee63160 *dp, &lv = *(dp=new (buf) ee63160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee63160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee63160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(16,12), "ee63160");
    check_base_class_offset(lv, (dd3160*), 0, "ee63160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63160.e");
    test_class_info(&lv, &cd_ee63160);
    dp->~ee63160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63160(Test_ee63160, "ee63160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63160C1Ev();
extern void _ZN7ee63160D1Ev();
Name_Map name_map_ee63160[] = {
  NSPAIR(_ZN7ee63160C1Ev),
  NSPAIR(_ZN7ee63160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee63160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63160[];
extern void _ZN7ee631603fooEv();
extern void _ZN7ee631603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee631603barEv,_ZTv0_n12_N7ee631603barEv)();
extern void ABISELECT(_ZThn32_N7ee631603barEv,_ZThn20_N7ee631603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee631603fooEv,_ZTv0_n16_N7ee631603fooEv)();
extern void ABISELECT(_ZThn32_N7ee631603fooEv,_ZThn20_N7ee631603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63160[0]),
  (VTBL_ENTRY)&_ZN7ee631603fooEv,
  (VTBL_ENTRY)&_ZN7ee631603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee631603barEv,_ZTv0_n12_N7ee631603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee631603fooEv,_ZTv0_n16_N7ee631603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee63160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee63160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee63160[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee63160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee63160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee63160[] = {
  {&(_ZTV7ee63160[4]),  4,15},
  {&(_tg__ZTV6dd3160__7ee63160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee63160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee63160[4]),  4,6},
  {&(_ZTV7ee63160[9]),  9,15},
  {&(_ZTV7ee63160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee63160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee63160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63160[];
extern  VTBL_ENTRY _ZTV7ee63160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63160[];
static VTBL_ENTRY alt_thunk_names74[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn20_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee631603fooEv,_ZTv0_n16_N7ee631603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee631603fooEv,_ZThn20_N7ee631603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee631603barEv,_ZTv0_n12_N7ee631603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee631603barEv,_ZThn20_N7ee631603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63160 = {  "ee63160", // class name
  bases_ee63160, 4,
  &(vtc_ee63160[0]), // expected_vtbl_contents
  &(vtt_ee63160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names74,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73160  : virtual dd3160 {
  int e;
  virtual void  foo(); // _ZN7ee731603fooEv
  virtual void  bar(); // _ZN7ee731603barEv
  ~ee73160(); // tgen
  ee73160(); // tgen
};
//SIG(1 ee73160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee73160 ::foo(){vfunc_called(this, "_ZN7ee731603fooEv");}
void  ee73160 ::bar(){vfunc_called(this, "_ZN7ee731603barEv");}
ee73160 ::~ee73160(){ note_dtor("ee73160", this);} // tgen
ee73160 ::ee73160(){ note_ctor("ee73160", this);} // tgen

static void Test_ee73160()
{
  extern Class_Descriptor cd_ee73160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73160, buf);
    ee73160 *dp, &lv = *(dp=new (buf) ee73160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee73160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee73160");
    check_base_class_offset(lv, (cc160*)(dd3160*), ABISELECT(32,16), "ee73160");
    check_base_class_offset(lv, (dd3160*), ABISELECT(16,8), "ee73160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73160.e");
    test_class_info(&lv, &cd_ee73160);
    dp->~ee73160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73160(Test_ee73160, "ee73160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73160C1Ev();
extern void _ZN7ee73160D1Ev();
Name_Map name_map_ee73160[] = {
  NSPAIR(_ZN7ee73160C1Ev),
  NSPAIR(_ZN7ee73160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd3160;
extern VTBL_ENTRY _ZTI6dd3160[];
extern  VTBL_ENTRY _ZTV6dd3160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3160[];
static Base_Class bases_ee73160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73160[];
extern void _ZN7ee731603fooEv();
extern void _ZN7ee731603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee731603fooEv,_ZTv0_n20_N7ee731603fooEv)();
extern void ABISELECT(_ZThn16_N7ee731603fooEv,_ZThn8_N7ee731603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee731603barEv,_ZTv0_n12_N7ee731603barEv)();
extern void ABISELECT(_ZThn48_N7ee731603barEv,_ZThn24_N7ee731603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee731603fooEv,_ZTv0_n16_N7ee731603fooEv)();
extern void ABISELECT(_ZThn48_N7ee731603fooEv,_ZThn24_N7ee731603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73160[0]),
  (VTBL_ENTRY)&_ZN7ee731603fooEv,
  (VTBL_ENTRY)&_ZN7ee731603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee731603fooEv,_ZTv0_n20_N7ee731603fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73160[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee731603barEv,_ZTv0_n12_N7ee731603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee731603fooEv,_ZTv0_n16_N7ee731603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73160[];
extern void _ZN6dd31603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3160__7ee73160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN6dd31603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd3160__7ee73160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv)();
extern void ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3160__7ee73160[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee73160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee73160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee73160[] = {
  {&(_ZTV7ee73160[5]),  5,22},
  {&(_ZTV7ee73160[12]),  12,22},
  {&(_ZTV7ee73160[16]),  16,22},
  {&(_ZTV7ee73160[20]),  20,22},
  {&(_tg__ZTV6dd3160__7ee73160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd3160__7ee73160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd3160__7ee73160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee73160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee73160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73160[];
extern  VTBL_ENTRY _ZTV7ee73160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73160[];
static VTBL_ENTRY alt_thunk_names75[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd31603fooEv,_ZTv0_n16_N6dd31603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31603fooEv,_ZThn16_N6dd31603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee731603fooEv,_ZTv0_n16_N7ee731603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee731603fooEv,_ZThn24_N7ee731603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee731603barEv,_ZTv0_n12_N7ee731603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee731603barEv,_ZThn24_N7ee731603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee731603fooEv,_ZTv0_n20_N7ee731603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee731603fooEv,_ZThn8_N7ee731603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73160 = {  "ee73160", // class name
  bases_ee73160, 4,
  &(vtc_ee73160[0]), // expected_vtbl_contents
  &(vtt_ee73160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73160),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names75,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4160  : cc160 {
  int d;
  virtual void  bar(); // _ZN6dd41603barEv
  ~dd4160(); // tgen
  dd4160(); // tgen
};
//SIG(-1 dd4160) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd4160 ::bar(){vfunc_called(this, "_ZN6dd41603barEv");}
dd4160 ::~dd4160(){ note_dtor("dd4160", this);} // tgen
dd4160 ::dd4160(){ note_ctor("dd4160", this);} // tgen

static void Test_dd4160()
{
  extern Class_Descriptor cd_dd4160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4160, buf);
    dd4160 *dp, &lv = *(dp=new (buf) dd4160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd4160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(16,12), "dd4160");
    check_base_class_offset(lv, (cc160*), 0, "dd4160");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4160.d");
    test_class_info(&lv, &cd_dd4160);
    dp->~dd4160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4160(Test_dd4160, "dd4160", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4160C1Ev();
extern void _ZN6dd4160D1Ev();
Name_Map name_map_dd4160[] = {
  NSPAIR(_ZN6dd4160C1Ev),
  NSPAIR(_ZN6dd4160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd4160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4160[];
extern void _ZN6dd41603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd4160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd4160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd4160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd4160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd4160[] = {
  {&(_ZTV6dd4160[3]),  3,10},
  {&(_tg__ZTV5cc160__6dd4160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd4160[4]),  4,6},
  {&(_ZTV6dd4160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static VTBL_ENTRY alt_thunk_names76[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4160 = {  "dd4160", // class name
  bases_dd4160, 3,
  &(vtc_dd4160[0]), // expected_vtbl_contents
  &(vtt_dd4160[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4160),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names76,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04160  : dd4160 {
  int e;
  ~ee04160(); // tgen
  ee04160(); // tgen
};
//SIG(1 ee04160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee04160 ::~ee04160(){ note_dtor("ee04160", this);} // tgen
ee04160 ::ee04160(){ note_ctor("ee04160", this);} // tgen

static void Test_ee04160()
{
  extern Class_Descriptor cd_ee04160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04160, buf);
    ee04160 *dp, &lv = *(dp=new (buf) ee04160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee04160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(24,16), "ee04160");
    check_base_class_offset(lv, (cc160*)(dd4160*), 0, "ee04160");
    check_base_class_offset(lv, (dd4160*), 0, "ee04160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04160.e");
    test_class_info(&lv, &cd_ee04160);
    dp->~ee04160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04160(Test_ee04160, "ee04160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04160C1Ev();
extern void _ZN7ee04160D1Ev();
Name_Map name_map_ee04160[] = {
  NSPAIR(_ZN7ee04160C1Ev),
  NSPAIR(_ZN7ee04160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee04160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04160[];
extern void _ZN6dd41603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee04160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee04160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee04160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee04160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee04160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee04160[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee04160[] = {
  {&(_ZTV7ee04160[3]),  3,10},
  {&(_tg__ZTV6dd4160__7ee04160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee04160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee04160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee04160[4]),  4,6},
  {&(_ZTV7ee04160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee04160[];
extern  VTBL_ENTRY _ZTV7ee04160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04160[];
static VTBL_ENTRY alt_thunk_names77[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04160 = {  "ee04160", // class name
  bases_ee04160, 4,
  &(vtc_ee04160[0]), // expected_vtbl_contents
  &(vtt_ee04160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04160),6, //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  ee14160  : virtual dd4160 {
  int e;
  ~ee14160(); // tgen
  ee14160(); // tgen
};
//SIG(1 ee14160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee14160 ::~ee14160(){ note_dtor("ee14160", this);} // tgen
ee14160 ::ee14160(){ note_ctor("ee14160", this);} // tgen

static void Test_ee14160()
{
  extern Class_Descriptor cd_ee14160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14160, buf);
    ee14160 *dp, &lv = *(dp=new (buf) ee14160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee14160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(32,20), "ee14160");
    check_base_class_offset(lv, (cc160*)(dd4160*), ABISELECT(16,8), "ee14160");
    check_base_class_offset(lv, (dd4160*), ABISELECT(16,8), "ee14160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14160.e");
    test_class_info(&lv, &cd_ee14160);
    dp->~ee14160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14160(Test_ee14160, "ee14160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14160C1Ev();
extern void _ZN7ee14160D1Ev();
Name_Map name_map_ee14160[] = {
  NSPAIR(_ZN7ee14160C1Ev),
  NSPAIR(_ZN7ee14160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee14160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14160[];
extern void _ZN6dd41603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee14160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14160[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee14160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee14160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee14160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee14160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee14160[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee14160[] = {
  {&(_ZTV7ee14160[4]),  4,15},
  {&(_ZTV7ee14160[8]),  8,15},
  {&(_ZTV7ee14160[13]),  13,15},
  {&(_tg__ZTV6dd4160__7ee14160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee14160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee14160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee14160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14160[];
extern  VTBL_ENTRY _ZTV7ee14160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14160[];
static VTBL_ENTRY alt_thunk_names78[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14160 = {  "ee14160", // class name
  bases_ee14160, 4,
  &(vtc_ee14160[0]), // expected_vtbl_contents
  &(vtt_ee14160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14160),7, //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  ee24160  : dd4160 {
  int e;
  virtual void  foo(); // _ZN7ee241603fooEv
  ~ee24160(); // tgen
  ee24160(); // tgen
};
//SIG(1 ee24160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee24160 ::foo(){vfunc_called(this, "_ZN7ee241603fooEv");}
ee24160 ::~ee24160(){ note_dtor("ee24160", this);} // tgen
ee24160 ::ee24160(){ note_ctor("ee24160", this);} // tgen

static void Test_ee24160()
{
  extern Class_Descriptor cd_ee24160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24160, buf);
    ee24160 *dp, &lv = *(dp=new (buf) ee24160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee24160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(24,16), "ee24160");
    check_base_class_offset(lv, (cc160*)(dd4160*), 0, "ee24160");
    check_base_class_offset(lv, (dd4160*), 0, "ee24160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24160.e");
    test_class_info(&lv, &cd_ee24160);
    dp->~ee24160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24160(Test_ee24160, "ee24160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24160C1Ev();
extern void _ZN7ee24160D1Ev();
Name_Map name_map_ee24160[] = {
  NSPAIR(_ZN7ee24160C1Ev),
  NSPAIR(_ZN7ee24160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee24160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24160[];
extern void _ZN6dd41603barEv();
extern void _ZN7ee241603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee241603fooEv,_ZTv0_n16_N7ee241603fooEv)();
extern void ABISELECT(_ZThn24_N7ee241603fooEv,_ZThn16_N7ee241603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
  (VTBL_ENTRY)&_ZN7ee241603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee241603fooEv,_ZTv0_n16_N7ee241603fooEv),
};
extern VTBL_ENTRY _ZTV7ee24160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee24160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee24160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee24160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee24160[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee24160[] = {
  {&(_ZTV7ee24160[3]),  3,11},
  {&(_tg__ZTV6dd4160__7ee24160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee24160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee24160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee24160[4]),  4,6},
  {&(_ZTV7ee24160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24160[];
extern  VTBL_ENTRY _ZTV7ee24160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24160[];
static VTBL_ENTRY alt_thunk_names79[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee241603fooEv,_ZTv0_n16_N7ee241603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee241603fooEv,_ZThn16_N7ee241603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24160 = {  "ee24160", // class name
  bases_ee24160, 4,
  &(vtc_ee24160[0]), // expected_vtbl_contents
  &(vtt_ee24160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24160),6, //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  ee34160  : virtual dd4160 {
  int e;
  virtual void  foo(); // _ZN7ee341603fooEv
  ~ee34160(); // tgen
  ee34160(); // tgen
};
//SIG(1 ee34160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee34160 ::foo(){vfunc_called(this, "_ZN7ee341603fooEv");}
ee34160 ::~ee34160(){ note_dtor("ee34160", this);} // tgen
ee34160 ::ee34160(){ note_ctor("ee34160", this);} // tgen

static void Test_ee34160()
{
  extern Class_Descriptor cd_ee34160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34160, buf);
    ee34160 *dp, &lv = *(dp=new (buf) ee34160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee34160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(32,20), "ee34160");
    check_base_class_offset(lv, (cc160*)(dd4160*), ABISELECT(16,8), "ee34160");
    check_base_class_offset(lv, (dd4160*), ABISELECT(16,8), "ee34160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34160.e");
    test_class_info(&lv, &cd_ee34160);
    dp->~ee34160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34160(Test_ee34160, "ee34160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34160C1Ev();
extern void _ZN7ee34160D1Ev();
Name_Map name_map_ee34160[] = {
  NSPAIR(_ZN7ee34160C1Ev),
  NSPAIR(_ZN7ee34160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee34160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34160[];
extern void _ZN7ee341603fooEv();
extern void _ZN6dd41603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee341603fooEv,_ZTv0_n16_N7ee341603fooEv)();
extern void ABISELECT(_ZThn32_N7ee341603fooEv,_ZThn20_N7ee341603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34160[0]),
  (VTBL_ENTRY)&_ZN7ee341603fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee341603fooEv,_ZTv0_n16_N7ee341603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee34160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee34160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee34160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee34160[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee34160[] = {
  {&(_ZTV7ee34160[4]),  4,16},
  {&(_ZTV7ee34160[9]),  9,16},
  {&(_ZTV7ee34160[14]),  14,16},
  {&(_tg__ZTV6dd4160__7ee34160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee34160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee34160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee34160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34160[];
extern  VTBL_ENTRY _ZTV7ee34160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34160[];
static VTBL_ENTRY alt_thunk_names80[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee341603fooEv,_ZTv0_n16_N7ee341603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee341603fooEv,_ZThn20_N7ee341603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34160 = {  "ee34160", // class name
  bases_ee34160, 4,
  &(vtc_ee34160[0]), // expected_vtbl_contents
  &(vtt_ee34160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34160),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34160),7, //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  ee44160  : dd4160 {
  int e;
  virtual void  bar(); // _ZN7ee441603barEv
  ~ee44160(); // tgen
  ee44160(); // tgen
};
//SIG(1 ee44160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee44160 ::bar(){vfunc_called(this, "_ZN7ee441603barEv");}
ee44160 ::~ee44160(){ note_dtor("ee44160", this);} // tgen
ee44160 ::ee44160(){ note_ctor("ee44160", this);} // tgen

static void Test_ee44160()
{
  extern Class_Descriptor cd_ee44160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44160, buf);
    ee44160 *dp, &lv = *(dp=new (buf) ee44160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee44160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(24,16), "ee44160");
    check_base_class_offset(lv, (cc160*)(dd4160*), 0, "ee44160");
    check_base_class_offset(lv, (dd4160*), 0, "ee44160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44160.e");
    test_class_info(&lv, &cd_ee44160);
    dp->~ee44160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44160(Test_ee44160, "ee44160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44160C1Ev();
extern void _ZN7ee44160D1Ev();
Name_Map name_map_ee44160[] = {
  NSPAIR(_ZN7ee44160C1Ev),
  NSPAIR(_ZN7ee44160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee44160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44160[];
extern void _ZN7ee441603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee441603barEv,_ZTv0_n12_N7ee441603barEv)();
extern void ABISELECT(_ZThn24_N7ee441603barEv,_ZThn16_N7ee441603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee44160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44160[0]),
  (VTBL_ENTRY)&_ZN7ee441603barEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee441603barEv,_ZTv0_n12_N7ee441603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee44160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee44160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee44160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee44160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee44160[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee44160[] = {
  {&(_ZTV7ee44160[3]),  3,10},
  {&(_tg__ZTV6dd4160__7ee44160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee44160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee44160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee44160[4]),  4,6},
  {&(_ZTV7ee44160[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee44160[];
extern  VTBL_ENTRY _ZTV7ee44160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44160[];
static VTBL_ENTRY alt_thunk_names81[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee441603barEv,_ZTv0_n12_N7ee441603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee441603barEv,_ZThn16_N7ee441603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44160 = {  "ee44160", // class name
  bases_ee44160, 4,
  &(vtc_ee44160[0]), // expected_vtbl_contents
  &(vtt_ee44160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44160),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names81,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54160  : virtual dd4160 {
  int e;
  virtual void  bar(); // _ZN7ee541603barEv
  ~ee54160(); // tgen
  ee54160(); // tgen
};
//SIG(1 ee54160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee54160 ::bar(){vfunc_called(this, "_ZN7ee541603barEv");}
ee54160 ::~ee54160(){ note_dtor("ee54160", this);} // tgen
ee54160 ::ee54160(){ note_ctor("ee54160", this);} // tgen

static void Test_ee54160()
{
  extern Class_Descriptor cd_ee54160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54160, buf);
    ee54160 *dp, &lv = *(dp=new (buf) ee54160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee54160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(32,20), "ee54160");
    check_base_class_offset(lv, (cc160*)(dd4160*), ABISELECT(16,8), "ee54160");
    check_base_class_offset(lv, (dd4160*), ABISELECT(16,8), "ee54160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54160.e");
    test_class_info(&lv, &cd_ee54160);
    dp->~ee54160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54160(Test_ee54160, "ee54160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54160C1Ev();
extern void _ZN7ee54160D1Ev();
Name_Map name_map_ee54160[] = {
  NSPAIR(_ZN7ee54160C1Ev),
  NSPAIR(_ZN7ee54160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee54160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54160[];
extern void _ZN7ee541603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee541603barEv,_ZTv0_n16_N7ee541603barEv)();
extern void ABISELECT(_ZThn16_N7ee541603barEv,_ZThn8_N7ee541603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee541603barEv,_ZTv0_n12_N7ee541603barEv)();
extern void ABISELECT(_ZThn32_N7ee541603barEv,_ZThn20_N7ee541603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee54160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54160[0]),
  (VTBL_ENTRY)&_ZN7ee541603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee541603barEv,_ZTv0_n16_N7ee541603barEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee541603barEv,_ZTv0_n12_N7ee541603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee54160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee54160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee54160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee54160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee54160[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee54160[] = {
  {&(_ZTV7ee54160[4]),  4,16},
  {&(_ZTV7ee54160[9]),  9,16},
  {&(_ZTV7ee54160[14]),  14,16},
  {&(_tg__ZTV6dd4160__7ee54160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee54160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee54160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee54160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54160[];
extern  VTBL_ENTRY _ZTV7ee54160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54160[];
static VTBL_ENTRY alt_thunk_names82[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee541603barEv,_ZTv0_n12_N7ee541603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee541603barEv,_ZThn20_N7ee541603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee541603barEv,_ZTv0_n16_N7ee541603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee541603barEv,_ZThn8_N7ee541603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54160 = {  "ee54160", // class name
  bases_ee54160, 4,
  &(vtc_ee54160[0]), // expected_vtbl_contents
  &(vtt_ee54160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54160),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names82,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64160  : dd4160 {
  int e;
  virtual void  foo(); // _ZN7ee641603fooEv
  virtual void  bar(); // _ZN7ee641603barEv
  ~ee64160(); // tgen
  ee64160(); // tgen
};
//SIG(1 ee64160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee64160 ::foo(){vfunc_called(this, "_ZN7ee641603fooEv");}
void  ee64160 ::bar(){vfunc_called(this, "_ZN7ee641603barEv");}
ee64160 ::~ee64160(){ note_dtor("ee64160", this);} // tgen
ee64160 ::ee64160(){ note_ctor("ee64160", this);} // tgen

static void Test_ee64160()
{
  extern Class_Descriptor cd_ee64160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64160, buf);
    ee64160 *dp, &lv = *(dp=new (buf) ee64160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee64160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(24,16), "ee64160");
    check_base_class_offset(lv, (cc160*)(dd4160*), 0, "ee64160");
    check_base_class_offset(lv, (dd4160*), 0, "ee64160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64160.e");
    test_class_info(&lv, &cd_ee64160);
    dp->~ee64160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64160(Test_ee64160, "ee64160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64160C1Ev();
extern void _ZN7ee64160D1Ev();
Name_Map name_map_ee64160[] = {
  NSPAIR(_ZN7ee64160C1Ev),
  NSPAIR(_ZN7ee64160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee64160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64160[];
extern void _ZN7ee641603barEv();
extern void _ZN7ee641603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee641603barEv,_ZTv0_n12_N7ee641603barEv)();
extern void ABISELECT(_ZThn24_N7ee641603barEv,_ZThn16_N7ee641603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee641603fooEv,_ZTv0_n16_N7ee641603fooEv)();
extern void ABISELECT(_ZThn24_N7ee641603fooEv,_ZThn16_N7ee641603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64160[0]),
  (VTBL_ENTRY)&_ZN7ee641603barEv,
  (VTBL_ENTRY)&_ZN7ee641603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee641603barEv,_ZTv0_n12_N7ee641603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee641603fooEv,_ZTv0_n16_N7ee641603fooEv),
};
extern VTBL_ENTRY _ZTV7ee64160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee64160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee64160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee64160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee64160[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee64160[] = {
  {&(_ZTV7ee64160[3]),  3,11},
  {&(_tg__ZTV6dd4160__7ee64160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee64160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee64160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee64160[4]),  4,6},
  {&(_ZTV7ee64160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64160[];
extern  VTBL_ENTRY _ZTV7ee64160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64160[];
static VTBL_ENTRY alt_thunk_names83[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41603barEv,_ZThn16_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee641603fooEv,_ZTv0_n16_N7ee641603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee641603fooEv,_ZThn16_N7ee641603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee641603barEv,_ZTv0_n12_N7ee641603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee641603barEv,_ZThn16_N7ee641603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64160 = {  "ee64160", // class name
  bases_ee64160, 4,
  &(vtc_ee64160[0]), // expected_vtbl_contents
  &(vtt_ee64160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names83,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74160  : virtual dd4160 {
  int e;
  virtual void  foo(); // _ZN7ee741603fooEv
  virtual void  bar(); // _ZN7ee741603barEv
  ~ee74160(); // tgen
  ee74160(); // tgen
};
//SIG(1 ee74160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee74160 ::foo(){vfunc_called(this, "_ZN7ee741603fooEv");}
void  ee74160 ::bar(){vfunc_called(this, "_ZN7ee741603barEv");}
ee74160 ::~ee74160(){ note_dtor("ee74160", this);} // tgen
ee74160 ::ee74160(){ note_ctor("ee74160", this);} // tgen

static void Test_ee74160()
{
  extern Class_Descriptor cd_ee74160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74160, buf);
    ee74160 *dp, &lv = *(dp=new (buf) ee74160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee74160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd4160*), ABISELECT(32,20), "ee74160");
    check_base_class_offset(lv, (cc160*)(dd4160*), ABISELECT(16,8), "ee74160");
    check_base_class_offset(lv, (dd4160*), ABISELECT(16,8), "ee74160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74160.e");
    test_class_info(&lv, &cd_ee74160);
    dp->~ee74160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74160(Test_ee74160, "ee74160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74160C1Ev();
extern void _ZN7ee74160D1Ev();
Name_Map name_map_ee74160[] = {
  NSPAIR(_ZN7ee74160C1Ev),
  NSPAIR(_ZN7ee74160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd4160;
extern VTBL_ENTRY _ZTI6dd4160[];
extern  VTBL_ENTRY _ZTV6dd4160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4160[];
static Base_Class bases_ee74160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74160[];
extern void _ZN7ee741603fooEv();
extern void _ZN7ee741603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee741603barEv,_ZTv0_n16_N7ee741603barEv)();
extern void ABISELECT(_ZThn16_N7ee741603barEv,_ZThn8_N7ee741603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee741603barEv,_ZTv0_n12_N7ee741603barEv)();
extern void ABISELECT(_ZThn32_N7ee741603barEv,_ZThn20_N7ee741603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee741603fooEv,_ZTv0_n16_N7ee741603fooEv)();
extern void ABISELECT(_ZThn32_N7ee741603fooEv,_ZThn20_N7ee741603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74160[0]),
  (VTBL_ENTRY)&_ZN7ee741603fooEv,
  (VTBL_ENTRY)&_ZN7ee741603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee741603barEv,_ZTv0_n16_N7ee741603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee741603barEv,_ZTv0_n12_N7ee741603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee741603fooEv,_ZTv0_n16_N7ee741603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74160[];
extern void _ZN6dd41603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4160__7ee74160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&_ZN6dd41603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd4160__7ee74160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd4160__7ee74160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv)();
extern void ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4160__7ee74160[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee74160[] = {
  {&(_ZTV7ee74160[4]),  4,17},
  {&(_ZTV7ee74160[10]),  10,17},
  {&(_ZTV7ee74160[15]),  15,17},
  {&(_tg__ZTV6dd4160__7ee74160[3]),  3,4},
  {&(_tg__ZTV5cc1606dd4160__7ee74160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd4160__7ee74160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4160__7ee74160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74160[];
extern  VTBL_ENTRY _ZTV7ee74160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74160[];
static VTBL_ENTRY alt_thunk_names84[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd41603barEv,_ZTv0_n12_N6dd41603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41603barEv,_ZThn12_N6dd41603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee741603fooEv,_ZTv0_n16_N7ee741603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee741603fooEv,_ZThn20_N7ee741603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee741603barEv,_ZTv0_n12_N7ee741603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee741603barEv,_ZThn20_N7ee741603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee741603barEv,_ZTv0_n16_N7ee741603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee741603barEv,_ZThn8_N7ee741603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74160 = {  "ee74160", // class name
  bases_ee74160, 4,
  &(vtc_ee74160[0]), // expected_vtbl_contents
  &(vtt_ee74160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74160),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names84,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5160  : virtual cc160 {
  int d;
  virtual void  bar(); // _ZN6dd51603barEv
  ~dd5160(); // tgen
  dd5160(); // tgen
};
//SIG(-1 dd5160) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd5160 ::bar(){vfunc_called(this, "_ZN6dd51603barEv");}
dd5160 ::~dd5160(){ note_dtor("dd5160", this);} // tgen
dd5160 ::dd5160(){ note_ctor("dd5160", this);} // tgen

static void Test_dd5160()
{
  extern Class_Descriptor cd_dd5160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5160, buf);
    dd5160 *dp, &lv = *(dp=new (buf) dd5160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd5160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,16), "dd5160");
    check_base_class_offset(lv, (cc160*), ABISELECT(16,8), "dd5160");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5160.d");
    test_class_info(&lv, &cd_dd5160);
    dp->~dd5160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5160(Test_dd5160, "dd5160", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5160C1Ev();
extern void _ZN6dd5160D1Ev();
Name_Map name_map_dd5160[] = {
  NSPAIR(_ZN6dd5160C1Ev),
  NSPAIR(_ZN6dd5160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd5160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd5160[];
extern void _ZN6dd51603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd5160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd5160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd5160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd5160[] = {
  {&(_ZTV6dd5160[4]),  4,14},
  {&(_ZTV6dd5160[8]),  8,14},
  {&(_ZTV6dd5160[12]),  12,14},
  {&(_tg__ZTV5cc160__6dd5160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd5160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static VTBL_ENTRY alt_thunk_names85[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5160 = {  "dd5160", // class name
  bases_dd5160, 3,
  &(vtc_dd5160[0]), // expected_vtbl_contents
  &(vtt_dd5160[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5160),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names85,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05160  : dd5160 {
  int e;
  ~ee05160(); // tgen
  ee05160(); // tgen
};
//SIG(1 ee05160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee05160 ::~ee05160(){ note_dtor("ee05160", this);} // tgen
ee05160 ::ee05160(){ note_ctor("ee05160", this);} // tgen

static void Test_ee05160()
{
  extern Class_Descriptor cd_ee05160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05160, buf);
    ee05160 *dp, &lv = *(dp=new (buf) ee05160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee05160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee05160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(16,12), "ee05160");
    check_base_class_offset(lv, (dd5160*), 0, "ee05160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05160.e");
    test_class_info(&lv, &cd_ee05160);
    dp->~ee05160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05160(Test_ee05160, "ee05160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05160C1Ev();
extern void _ZN7ee05160D1Ev();
Name_Map name_map_ee05160[] = {
  NSPAIR(_ZN7ee05160C1Ev),
  NSPAIR(_ZN7ee05160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee05160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05160[];
extern void _ZN6dd51603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee05160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05160[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee05160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee05160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee05160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee05160[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee05160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee05160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee05160[] = {
  {&(_ZTV7ee05160[4]),  4,14},
  {&(_tg__ZTV6dd5160__7ee05160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee05160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee05160[4]),  4,6},
  {&(_ZTV7ee05160[8]),  8,14},
  {&(_ZTV7ee05160[12]),  12,14},
  {&(_tg__ZTV5cc160__7ee05160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee05160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05160[];
extern  VTBL_ENTRY _ZTV7ee05160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05160[];
static VTBL_ENTRY alt_thunk_names86[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05160 = {  "ee05160", // class name
  bases_ee05160, 4,
  &(vtc_ee05160[0]), // expected_vtbl_contents
  &(vtt_ee05160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names86,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15160  : virtual dd5160 {
  int e;
  ~ee15160(); // tgen
  ee15160(); // tgen
};
//SIG(1 ee15160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee15160 ::~ee15160(){ note_dtor("ee15160", this);} // tgen
ee15160 ::ee15160(){ note_ctor("ee15160", this);} // tgen

static void Test_ee15160()
{
  extern Class_Descriptor cd_ee15160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15160, buf);
    ee15160 *dp, &lv = *(dp=new (buf) ee15160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee15160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee15160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(32,16), "ee15160");
    check_base_class_offset(lv, (dd5160*), ABISELECT(16,8), "ee15160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15160.e");
    test_class_info(&lv, &cd_ee15160);
    dp->~ee15160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15160(Test_ee15160, "ee15160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15160C1Ev();
extern void _ZN7ee15160D1Ev();
Name_Map name_map_ee15160[] = {
  NSPAIR(_ZN7ee15160C1Ev),
  NSPAIR(_ZN7ee15160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee15160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15160[];
extern void _ZN6dd51603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee15160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15160[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15160[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee15160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee15160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee15160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee15160[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee15160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee15160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee15160[] = {
  {&(_ZTV7ee15160[5]),  5,20},
  {&(_ZTV7ee15160[10]),  10,20},
  {&(_ZTV7ee15160[14]),  14,20},
  {&(_ZTV7ee15160[18]),  18,20},
  {&(_tg__ZTV6dd5160__7ee15160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee15160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee15160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee15160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee15160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15160[];
extern  VTBL_ENTRY _ZTV7ee15160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15160[];
static VTBL_ENTRY alt_thunk_names87[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15160 = {  "ee15160", // class name
  bases_ee15160, 4,
  &(vtc_ee15160[0]), // expected_vtbl_contents
  &(vtt_ee15160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15160),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names87,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25160  : dd5160 {
  int e;
  virtual void  foo(); // _ZN7ee251603fooEv
  ~ee25160(); // tgen
  ee25160(); // tgen
};
//SIG(1 ee25160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee25160 ::foo(){vfunc_called(this, "_ZN7ee251603fooEv");}
ee25160 ::~ee25160(){ note_dtor("ee25160", this);} // tgen
ee25160 ::ee25160(){ note_ctor("ee25160", this);} // tgen

static void Test_ee25160()
{
  extern Class_Descriptor cd_ee25160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25160, buf);
    ee25160 *dp, &lv = *(dp=new (buf) ee25160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee25160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee25160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(16,12), "ee25160");
    check_base_class_offset(lv, (dd5160*), 0, "ee25160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25160.e");
    test_class_info(&lv, &cd_ee25160);
    dp->~ee25160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25160(Test_ee25160, "ee25160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25160C1Ev();
extern void _ZN7ee25160D1Ev();
Name_Map name_map_ee25160[] = {
  NSPAIR(_ZN7ee25160C1Ev),
  NSPAIR(_ZN7ee25160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee25160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25160[];
extern void _ZN6dd51603barEv();
extern void _ZN7ee251603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee251603fooEv,_ZTv0_n16_N7ee251603fooEv)();
extern void ABISELECT(_ZThn32_N7ee251603fooEv,_ZThn20_N7ee251603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
  (VTBL_ENTRY)&_ZN7ee251603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee251603fooEv,_ZTv0_n16_N7ee251603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee25160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee25160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee25160[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee25160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee25160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee25160[] = {
  {&(_ZTV7ee25160[4]),  4,15},
  {&(_tg__ZTV6dd5160__7ee25160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee25160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee25160[4]),  4,6},
  {&(_ZTV7ee25160[9]),  9,15},
  {&(_ZTV7ee25160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee25160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee25160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25160[];
extern  VTBL_ENTRY _ZTV7ee25160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25160[];
static VTBL_ENTRY alt_thunk_names88[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee251603fooEv,_ZTv0_n16_N7ee251603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee251603fooEv,_ZThn20_N7ee251603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25160 = {  "ee25160", // class name
  bases_ee25160, 4,
  &(vtc_ee25160[0]), // expected_vtbl_contents
  &(vtt_ee25160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names88,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35160  : virtual dd5160 {
  int e;
  virtual void  foo(); // _ZN7ee351603fooEv
  ~ee35160(); // tgen
  ee35160(); // tgen
};
//SIG(1 ee35160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee35160 ::foo(){vfunc_called(this, "_ZN7ee351603fooEv");}
ee35160 ::~ee35160(){ note_dtor("ee35160", this);} // tgen
ee35160 ::ee35160(){ note_ctor("ee35160", this);} // tgen

static void Test_ee35160()
{
  extern Class_Descriptor cd_ee35160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35160, buf);
    ee35160 *dp, &lv = *(dp=new (buf) ee35160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee35160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee35160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(32,16), "ee35160");
    check_base_class_offset(lv, (dd5160*), ABISELECT(16,8), "ee35160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35160.e");
    test_class_info(&lv, &cd_ee35160);
    dp->~ee35160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35160(Test_ee35160, "ee35160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35160C1Ev();
extern void _ZN7ee35160D1Ev();
Name_Map name_map_ee35160[] = {
  NSPAIR(_ZN7ee35160C1Ev),
  NSPAIR(_ZN7ee35160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee35160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35160[];
extern void _ZN7ee351603fooEv();
extern void _ZN6dd51603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee351603fooEv,_ZTv0_n16_N7ee351603fooEv)();
extern void ABISELECT(_ZThn48_N7ee351603fooEv,_ZThn24_N7ee351603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35160[0]),
  (VTBL_ENTRY)&_ZN7ee351603fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35160[0]),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee351603fooEv,_ZTv0_n16_N7ee351603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee35160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee35160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee35160[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee35160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee35160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee35160[] = {
  {&(_ZTV7ee35160[5]),  5,21},
  {&(_ZTV7ee35160[11]),  11,21},
  {&(_ZTV7ee35160[15]),  15,21},
  {&(_ZTV7ee35160[19]),  19,21},
  {&(_tg__ZTV6dd5160__7ee35160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee35160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee35160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee35160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee35160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35160[];
extern  VTBL_ENTRY _ZTV7ee35160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35160[];
static VTBL_ENTRY alt_thunk_names89[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee351603fooEv,_ZTv0_n16_N7ee351603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee351603fooEv,_ZThn24_N7ee351603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35160 = {  "ee35160", // class name
  bases_ee35160, 4,
  &(vtc_ee35160[0]), // expected_vtbl_contents
  &(vtt_ee35160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35160),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names89,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45160  : dd5160 {
  int e;
  virtual void  bar(); // _ZN7ee451603barEv
  ~ee45160(); // tgen
  ee45160(); // tgen
};
//SIG(1 ee45160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee45160 ::bar(){vfunc_called(this, "_ZN7ee451603barEv");}
ee45160 ::~ee45160(){ note_dtor("ee45160", this);} // tgen
ee45160 ::ee45160(){ note_ctor("ee45160", this);} // tgen

static void Test_ee45160()
{
  extern Class_Descriptor cd_ee45160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45160, buf);
    ee45160 *dp, &lv = *(dp=new (buf) ee45160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee45160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee45160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(16,12), "ee45160");
    check_base_class_offset(lv, (dd5160*), 0, "ee45160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45160.e");
    test_class_info(&lv, &cd_ee45160);
    dp->~ee45160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45160(Test_ee45160, "ee45160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45160C1Ev();
extern void _ZN7ee45160D1Ev();
Name_Map name_map_ee45160[] = {
  NSPAIR(_ZN7ee45160C1Ev),
  NSPAIR(_ZN7ee45160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee45160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45160[];
extern void _ZN7ee451603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee451603barEv,_ZTv0_n12_N7ee451603barEv)();
extern void ABISELECT(_ZThn32_N7ee451603barEv,_ZThn20_N7ee451603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee45160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45160[0]),
  (VTBL_ENTRY)&_ZN7ee451603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45160[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee451603barEv,_ZTv0_n12_N7ee451603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee45160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee45160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee45160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee45160[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee45160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee45160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee45160[] = {
  {&(_ZTV7ee45160[4]),  4,14},
  {&(_tg__ZTV6dd5160__7ee45160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee45160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee45160[4]),  4,6},
  {&(_ZTV7ee45160[8]),  8,14},
  {&(_ZTV7ee45160[12]),  12,14},
  {&(_tg__ZTV5cc160__7ee45160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee45160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45160[];
extern  VTBL_ENTRY _ZTV7ee45160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45160[];
static VTBL_ENTRY alt_thunk_names90[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee451603barEv,_ZTv0_n12_N7ee451603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee451603barEv,_ZThn20_N7ee451603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45160 = {  "ee45160", // class name
  bases_ee45160, 4,
  &(vtc_ee45160[0]), // expected_vtbl_contents
  &(vtt_ee45160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45160),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names90,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55160  : virtual dd5160 {
  int e;
  virtual void  bar(); // _ZN7ee551603barEv
  ~ee55160(); // tgen
  ee55160(); // tgen
};
//SIG(1 ee55160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee55160 ::bar(){vfunc_called(this, "_ZN7ee551603barEv");}
ee55160 ::~ee55160(){ note_dtor("ee55160", this);} // tgen
ee55160 ::ee55160(){ note_ctor("ee55160", this);} // tgen

static void Test_ee55160()
{
  extern Class_Descriptor cd_ee55160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55160, buf);
    ee55160 *dp, &lv = *(dp=new (buf) ee55160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee55160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee55160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(32,16), "ee55160");
    check_base_class_offset(lv, (dd5160*), ABISELECT(16,8), "ee55160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55160.e");
    test_class_info(&lv, &cd_ee55160);
    dp->~ee55160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55160(Test_ee55160, "ee55160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55160C1Ev();
extern void _ZN7ee55160D1Ev();
Name_Map name_map_ee55160[] = {
  NSPAIR(_ZN7ee55160C1Ev),
  NSPAIR(_ZN7ee55160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee55160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55160[];
extern void _ZN7ee551603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee551603barEv,_ZTv0_n20_N7ee551603barEv)();
extern void ABISELECT(_ZThn16_N7ee551603barEv,_ZThn8_N7ee551603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee551603barEv,_ZTv0_n12_N7ee551603barEv)();
extern void ABISELECT(_ZThn48_N7ee551603barEv,_ZThn24_N7ee551603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee55160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55160[0]),
  (VTBL_ENTRY)&_ZN7ee551603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee551603barEv,_ZTv0_n20_N7ee551603barEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55160[0]),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee551603barEv,_ZTv0_n12_N7ee551603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee55160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee55160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee55160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee55160[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee55160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee55160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee55160[] = {
  {&(_ZTV7ee55160[5]),  5,21},
  {&(_ZTV7ee55160[11]),  11,21},
  {&(_ZTV7ee55160[15]),  15,21},
  {&(_ZTV7ee55160[19]),  19,21},
  {&(_tg__ZTV6dd5160__7ee55160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee55160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee55160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee55160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee55160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55160[];
extern  VTBL_ENTRY _ZTV7ee55160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55160[];
static VTBL_ENTRY alt_thunk_names91[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee551603barEv,_ZTv0_n12_N7ee551603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee551603barEv,_ZThn24_N7ee551603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee551603barEv,_ZTv0_n20_N7ee551603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee551603barEv,_ZThn8_N7ee551603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55160 = {  "ee55160", // class name
  bases_ee55160, 4,
  &(vtc_ee55160[0]), // expected_vtbl_contents
  &(vtt_ee55160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55160),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names91,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65160  : dd5160 {
  int e;
  virtual void  foo(); // _ZN7ee651603fooEv
  virtual void  bar(); // _ZN7ee651603barEv
  ~ee65160(); // tgen
  ee65160(); // tgen
};
//SIG(1 ee65160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee65160 ::foo(){vfunc_called(this, "_ZN7ee651603fooEv");}
void  ee65160 ::bar(){vfunc_called(this, "_ZN7ee651603barEv");}
ee65160 ::~ee65160(){ note_dtor("ee65160", this);} // tgen
ee65160 ::ee65160(){ note_ctor("ee65160", this);} // tgen

static void Test_ee65160()
{
  extern Class_Descriptor cd_ee65160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65160, buf);
    ee65160 *dp, &lv = *(dp=new (buf) ee65160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee65160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee65160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(16,12), "ee65160");
    check_base_class_offset(lv, (dd5160*), 0, "ee65160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65160.e");
    test_class_info(&lv, &cd_ee65160);
    dp->~ee65160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65160(Test_ee65160, "ee65160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65160C1Ev();
extern void _ZN7ee65160D1Ev();
Name_Map name_map_ee65160[] = {
  NSPAIR(_ZN7ee65160C1Ev),
  NSPAIR(_ZN7ee65160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee65160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65160[];
extern void _ZN7ee651603barEv();
extern void _ZN7ee651603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee651603barEv,_ZTv0_n12_N7ee651603barEv)();
extern void ABISELECT(_ZThn32_N7ee651603barEv,_ZThn20_N7ee651603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee651603fooEv,_ZTv0_n16_N7ee651603fooEv)();
extern void ABISELECT(_ZThn32_N7ee651603fooEv,_ZThn20_N7ee651603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65160[0]),
  (VTBL_ENTRY)&_ZN7ee651603barEv,
  (VTBL_ENTRY)&_ZN7ee651603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee651603barEv,_ZTv0_n12_N7ee651603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee651603fooEv,_ZTv0_n16_N7ee651603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee65160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee65160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee65160[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee65160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee65160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee65160[] = {
  {&(_ZTV7ee65160[4]),  4,15},
  {&(_tg__ZTV6dd5160__7ee65160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee65160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee65160[4]),  4,6},
  {&(_ZTV7ee65160[9]),  9,15},
  {&(_ZTV7ee65160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee65160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee65160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65160[];
extern  VTBL_ENTRY _ZTV7ee65160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65160[];
static VTBL_ENTRY alt_thunk_names92[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn20_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee651603fooEv,_ZTv0_n16_N7ee651603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee651603fooEv,_ZThn20_N7ee651603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee651603barEv,_ZTv0_n12_N7ee651603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee651603barEv,_ZThn20_N7ee651603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65160 = {  "ee65160", // class name
  bases_ee65160, 4,
  &(vtc_ee65160[0]), // expected_vtbl_contents
  &(vtt_ee65160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names92,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75160  : virtual dd5160 {
  int e;
  virtual void  foo(); // _ZN7ee751603fooEv
  virtual void  bar(); // _ZN7ee751603barEv
  ~ee75160(); // tgen
  ee75160(); // tgen
};
//SIG(1 ee75160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee75160 ::foo(){vfunc_called(this, "_ZN7ee751603fooEv");}
void  ee75160 ::bar(){vfunc_called(this, "_ZN7ee751603barEv");}
ee75160 ::~ee75160(){ note_dtor("ee75160", this);} // tgen
ee75160 ::ee75160(){ note_ctor("ee75160", this);} // tgen

static void Test_ee75160()
{
  extern Class_Descriptor cd_ee75160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75160, buf);
    ee75160 *dp, &lv = *(dp=new (buf) ee75160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee75160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee75160");
    check_base_class_offset(lv, (cc160*)(dd5160*), ABISELECT(32,16), "ee75160");
    check_base_class_offset(lv, (dd5160*), ABISELECT(16,8), "ee75160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75160.e");
    test_class_info(&lv, &cd_ee75160);
    dp->~ee75160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75160(Test_ee75160, "ee75160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75160C1Ev();
extern void _ZN7ee75160D1Ev();
Name_Map name_map_ee75160[] = {
  NSPAIR(_ZN7ee75160C1Ev),
  NSPAIR(_ZN7ee75160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd5160;
extern VTBL_ENTRY _ZTI6dd5160[];
extern  VTBL_ENTRY _ZTV6dd5160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5160[];
static Base_Class bases_ee75160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75160[];
extern void _ZN7ee751603fooEv();
extern void _ZN7ee751603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee751603barEv,_ZTv0_n20_N7ee751603barEv)();
extern void ABISELECT(_ZThn16_N7ee751603barEv,_ZThn8_N7ee751603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee751603barEv,_ZTv0_n12_N7ee751603barEv)();
extern void ABISELECT(_ZThn48_N7ee751603barEv,_ZThn24_N7ee751603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee751603fooEv,_ZTv0_n16_N7ee751603fooEv)();
extern void ABISELECT(_ZThn48_N7ee751603fooEv,_ZThn24_N7ee751603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75160[0]),
  (VTBL_ENTRY)&_ZN7ee751603fooEv,
  (VTBL_ENTRY)&_ZN7ee751603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee751603barEv,_ZTv0_n20_N7ee751603barEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75160[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee751603barEv,_ZTv0_n12_N7ee751603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee751603fooEv,_ZTv0_n16_N7ee751603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75160[];
extern void _ZN6dd51603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5160__7ee75160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&_ZN6dd51603barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd5160__7ee75160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv)();
extern void ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5160__7ee75160[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee75160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee75160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee75160[] = {
  {&(_ZTV7ee75160[5]),  5,22},
  {&(_ZTV7ee75160[12]),  12,22},
  {&(_ZTV7ee75160[16]),  16,22},
  {&(_ZTV7ee75160[20]),  20,22},
  {&(_tg__ZTV6dd5160__7ee75160[4]),  4,5},
  {&(_tg__ZTV5cc160__6dd5160__7ee75160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd5160__7ee75160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee75160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee75160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75160[];
extern  VTBL_ENTRY _ZTV7ee75160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75160[];
static VTBL_ENTRY alt_thunk_names93[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd51603barEv,_ZTv0_n12_N6dd51603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51603barEv,_ZThn16_N6dd51603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee751603fooEv,_ZTv0_n16_N7ee751603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee751603fooEv,_ZThn24_N7ee751603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee751603barEv,_ZTv0_n12_N7ee751603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee751603barEv,_ZThn24_N7ee751603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee751603barEv,_ZTv0_n20_N7ee751603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee751603barEv,_ZThn8_N7ee751603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75160 = {  "ee75160", // class name
  bases_ee75160, 4,
  &(vtc_ee75160[0]), // expected_vtbl_contents
  &(vtt_ee75160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75160),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names93,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6160  : cc160 {
  int d;
  virtual void  bar(); // _ZN6dd61603barEv
  virtual void  foo(); // _ZN6dd61603fooEv
  ~dd6160(); // tgen
  dd6160(); // tgen
};
//SIG(-1 dd6160) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd6160 ::bar(){vfunc_called(this, "_ZN6dd61603barEv");}
void  dd6160 ::foo(){vfunc_called(this, "_ZN6dd61603fooEv");}
dd6160 ::~dd6160(){ note_dtor("dd6160", this);} // tgen
dd6160 ::dd6160(){ note_ctor("dd6160", this);} // tgen

static void Test_dd6160()
{
  extern Class_Descriptor cd_dd6160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6160, buf);
    dd6160 *dp, &lv = *(dp=new (buf) dd6160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd6160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(16,12), "dd6160");
    check_base_class_offset(lv, (cc160*), 0, "dd6160");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6160.d");
    test_class_info(&lv, &cd_dd6160);
    dp->~dd6160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6160(Test_dd6160, "dd6160", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6160C1Ev();
extern void _ZN6dd6160D1Ev();
Name_Map name_map_dd6160[] = {
  NSPAIR(_ZN6dd6160C1Ev),
  NSPAIR(_ZN6dd6160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd6160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
extern VTBL_ENTRY _ZTV6dd6160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd6160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd6160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd6160[] = {
  {&(_ZTV6dd6160[3]),  3,11},
  {&(_tg__ZTV5cc160__6dd6160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd6160[4]),  4,6},
  {&(_ZTV6dd6160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static VTBL_ENTRY alt_thunk_names94[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6160 = {  "dd6160", // class name
  bases_dd6160, 3,
  &(vtc_dd6160[0]), // expected_vtbl_contents
  &(vtt_dd6160[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6160),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names94,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06160  : dd6160 {
  int e;
  ~ee06160(); // tgen
  ee06160(); // tgen
};
//SIG(1 ee06160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee06160 ::~ee06160(){ note_dtor("ee06160", this);} // tgen
ee06160 ::ee06160(){ note_ctor("ee06160", this);} // tgen

static void Test_ee06160()
{
  extern Class_Descriptor cd_ee06160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06160, buf);
    ee06160 *dp, &lv = *(dp=new (buf) ee06160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee06160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(24,16), "ee06160");
    check_base_class_offset(lv, (cc160*)(dd6160*), 0, "ee06160");
    check_base_class_offset(lv, (dd6160*), 0, "ee06160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06160.e");
    test_class_info(&lv, &cd_ee06160);
    dp->~ee06160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06160(Test_ee06160, "ee06160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06160C1Ev();
extern void _ZN7ee06160D1Ev();
Name_Map name_map_ee06160[] = {
  NSPAIR(_ZN7ee06160C1Ev),
  NSPAIR(_ZN7ee06160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee06160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
extern VTBL_ENTRY _ZTV7ee06160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee06160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee06160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee06160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee06160[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee06160[] = {
  {&(_ZTV7ee06160[3]),  3,11},
  {&(_tg__ZTV6dd6160__7ee06160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee06160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee06160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee06160[4]),  4,6},
  {&(_ZTV7ee06160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06160[];
extern  VTBL_ENTRY _ZTV7ee06160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06160[];
static VTBL_ENTRY alt_thunk_names95[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06160 = {  "ee06160", // class name
  bases_ee06160, 4,
  &(vtc_ee06160[0]), // expected_vtbl_contents
  &(vtt_ee06160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06160),6, //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  ee16160  : virtual dd6160 {
  int e;
  ~ee16160(); // tgen
  ee16160(); // tgen
};
//SIG(1 ee16160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee16160 ::~ee16160(){ note_dtor("ee16160", this);} // tgen
ee16160 ::ee16160(){ note_ctor("ee16160", this);} // tgen

static void Test_ee16160()
{
  extern Class_Descriptor cd_ee16160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16160, buf);
    ee16160 *dp, &lv = *(dp=new (buf) ee16160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee16160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(32,20), "ee16160");
    check_base_class_offset(lv, (cc160*)(dd6160*), ABISELECT(16,8), "ee16160");
    check_base_class_offset(lv, (dd6160*), ABISELECT(16,8), "ee16160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16160.e");
    test_class_info(&lv, &cd_ee16160);
    dp->~ee16160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16160(Test_ee16160, "ee16160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16160C1Ev();
extern void _ZN7ee16160D1Ev();
Name_Map name_map_ee16160[] = {
  NSPAIR(_ZN7ee16160C1Ev),
  NSPAIR(_ZN7ee16160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee16160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16160[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
extern VTBL_ENTRY _ZTV7ee16160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee16160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee16160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee16160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee16160[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee16160[] = {
  {&(_ZTV7ee16160[4]),  4,17},
  {&(_ZTV7ee16160[9]),  9,17},
  {&(_ZTV7ee16160[15]),  15,17},
  {&(_tg__ZTV6dd6160__7ee16160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee16160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee16160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee16160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16160[];
extern  VTBL_ENTRY _ZTV7ee16160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16160[];
static VTBL_ENTRY alt_thunk_names96[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16160 = {  "ee16160", // class name
  bases_ee16160, 4,
  &(vtc_ee16160[0]), // expected_vtbl_contents
  &(vtt_ee16160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16160),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16160),7, //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  ee26160  : dd6160 {
  int e;
  virtual void  foo(); // _ZN7ee261603fooEv
  ~ee26160(); // tgen
  ee26160(); // tgen
};
//SIG(1 ee26160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee26160 ::foo(){vfunc_called(this, "_ZN7ee261603fooEv");}
ee26160 ::~ee26160(){ note_dtor("ee26160", this);} // tgen
ee26160 ::ee26160(){ note_ctor("ee26160", this);} // tgen

static void Test_ee26160()
{
  extern Class_Descriptor cd_ee26160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26160, buf);
    ee26160 *dp, &lv = *(dp=new (buf) ee26160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee26160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(24,16), "ee26160");
    check_base_class_offset(lv, (cc160*)(dd6160*), 0, "ee26160");
    check_base_class_offset(lv, (dd6160*), 0, "ee26160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26160.e");
    test_class_info(&lv, &cd_ee26160);
    dp->~ee26160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26160(Test_ee26160, "ee26160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26160C1Ev();
extern void _ZN7ee26160D1Ev();
Name_Map name_map_ee26160[] = {
  NSPAIR(_ZN7ee26160C1Ev),
  NSPAIR(_ZN7ee26160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee26160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26160[];
extern void _ZN6dd61603barEv();
extern void _ZN7ee261603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee261603fooEv,_ZTv0_n16_N7ee261603fooEv)();
extern void ABISELECT(_ZThn24_N7ee261603fooEv,_ZThn16_N7ee261603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN7ee261603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee261603fooEv,_ZTv0_n16_N7ee261603fooEv),
};
extern VTBL_ENTRY _ZTV7ee26160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee26160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee26160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee26160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee26160[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee26160[] = {
  {&(_ZTV7ee26160[3]),  3,11},
  {&(_tg__ZTV6dd6160__7ee26160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee26160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee26160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee26160[4]),  4,6},
  {&(_ZTV7ee26160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26160[];
extern  VTBL_ENTRY _ZTV7ee26160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26160[];
static VTBL_ENTRY alt_thunk_names97[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee261603fooEv,_ZTv0_n16_N7ee261603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee261603fooEv,_ZThn16_N7ee261603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26160 = {  "ee26160", // class name
  bases_ee26160, 4,
  &(vtc_ee26160[0]), // expected_vtbl_contents
  &(vtt_ee26160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26160),6, //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  ee36160  : virtual dd6160 {
  int e;
  virtual void  foo(); // _ZN7ee361603fooEv
  ~ee36160(); // tgen
  ee36160(); // tgen
};
//SIG(1 ee36160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee36160 ::foo(){vfunc_called(this, "_ZN7ee361603fooEv");}
ee36160 ::~ee36160(){ note_dtor("ee36160", this);} // tgen
ee36160 ::ee36160(){ note_ctor("ee36160", this);} // tgen

static void Test_ee36160()
{
  extern Class_Descriptor cd_ee36160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36160, buf);
    ee36160 *dp, &lv = *(dp=new (buf) ee36160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee36160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(32,20), "ee36160");
    check_base_class_offset(lv, (cc160*)(dd6160*), ABISELECT(16,8), "ee36160");
    check_base_class_offset(lv, (dd6160*), ABISELECT(16,8), "ee36160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36160.e");
    test_class_info(&lv, &cd_ee36160);
    dp->~ee36160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36160(Test_ee36160, "ee36160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36160C1Ev();
extern void _ZN7ee36160D1Ev();
Name_Map name_map_ee36160[] = {
  NSPAIR(_ZN7ee36160C1Ev),
  NSPAIR(_ZN7ee36160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee36160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36160[];
extern void _ZN7ee361603fooEv();
extern void _ZN6dd61603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee361603fooEv,_ZTv0_n20_N7ee361603fooEv)();
extern void ABISELECT(_ZThn16_N7ee361603fooEv,_ZThn8_N7ee361603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee361603fooEv,_ZTv0_n16_N7ee361603fooEv)();
extern void ABISELECT(_ZThn32_N7ee361603fooEv,_ZThn20_N7ee361603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36160[0]),
  (VTBL_ENTRY)&_ZN7ee361603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee361603fooEv,_ZTv0_n20_N7ee361603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee361603fooEv,_ZTv0_n16_N7ee361603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee36160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee36160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee36160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee36160[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee36160[] = {
  {&(_ZTV7ee36160[4]),  4,18},
  {&(_ZTV7ee36160[10]),  10,18},
  {&(_ZTV7ee36160[16]),  16,18},
  {&(_tg__ZTV6dd6160__7ee36160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee36160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee36160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee36160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36160[];
extern  VTBL_ENTRY _ZTV7ee36160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36160[];
static VTBL_ENTRY alt_thunk_names98[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee361603fooEv,_ZTv0_n16_N7ee361603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee361603fooEv,_ZThn20_N7ee361603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee361603fooEv,_ZTv0_n20_N7ee361603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee361603fooEv,_ZThn8_N7ee361603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36160 = {  "ee36160", // class name
  bases_ee36160, 4,
  &(vtc_ee36160[0]), // expected_vtbl_contents
  &(vtt_ee36160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36160),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names98,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46160  : dd6160 {
  int e;
  virtual void  bar(); // _ZN7ee461603barEv
  ~ee46160(); // tgen
  ee46160(); // tgen
};
//SIG(1 ee46160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee46160 ::bar(){vfunc_called(this, "_ZN7ee461603barEv");}
ee46160 ::~ee46160(){ note_dtor("ee46160", this);} // tgen
ee46160 ::ee46160(){ note_ctor("ee46160", this);} // tgen

static void Test_ee46160()
{
  extern Class_Descriptor cd_ee46160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46160, buf);
    ee46160 *dp, &lv = *(dp=new (buf) ee46160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee46160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(24,16), "ee46160");
    check_base_class_offset(lv, (cc160*)(dd6160*), 0, "ee46160");
    check_base_class_offset(lv, (dd6160*), 0, "ee46160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46160.e");
    test_class_info(&lv, &cd_ee46160);
    dp->~ee46160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46160(Test_ee46160, "ee46160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46160C1Ev();
extern void _ZN7ee46160D1Ev();
Name_Map name_map_ee46160[] = {
  NSPAIR(_ZN7ee46160C1Ev),
  NSPAIR(_ZN7ee46160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee46160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46160[];
extern void _ZN7ee461603barEv();
extern void _ZN6dd61603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee461603barEv,_ZTv0_n12_N7ee461603barEv)();
extern void ABISELECT(_ZThn24_N7ee461603barEv,_ZThn16_N7ee461603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46160[0]),
  (VTBL_ENTRY)&_ZN7ee461603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee461603barEv,_ZTv0_n12_N7ee461603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
extern VTBL_ENTRY _ZTV7ee46160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee46160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee46160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee46160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee46160[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee46160[] = {
  {&(_ZTV7ee46160[3]),  3,11},
  {&(_tg__ZTV6dd6160__7ee46160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee46160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee46160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee46160[4]),  4,6},
  {&(_ZTV7ee46160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46160[];
extern  VTBL_ENTRY _ZTV7ee46160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46160[];
static VTBL_ENTRY alt_thunk_names99[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee461603barEv,_ZTv0_n12_N7ee461603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee461603barEv,_ZThn16_N7ee461603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46160 = {  "ee46160", // class name
  bases_ee46160, 4,
  &(vtc_ee46160[0]), // expected_vtbl_contents
  &(vtt_ee46160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names99,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56160  : virtual dd6160 {
  int e;
  virtual void  bar(); // _ZN7ee561603barEv
  ~ee56160(); // tgen
  ee56160(); // tgen
};
//SIG(1 ee56160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee56160 ::bar(){vfunc_called(this, "_ZN7ee561603barEv");}
ee56160 ::~ee56160(){ note_dtor("ee56160", this);} // tgen
ee56160 ::ee56160(){ note_ctor("ee56160", this);} // tgen

static void Test_ee56160()
{
  extern Class_Descriptor cd_ee56160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56160, buf);
    ee56160 *dp, &lv = *(dp=new (buf) ee56160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee56160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(32,20), "ee56160");
    check_base_class_offset(lv, (cc160*)(dd6160*), ABISELECT(16,8), "ee56160");
    check_base_class_offset(lv, (dd6160*), ABISELECT(16,8), "ee56160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56160.e");
    test_class_info(&lv, &cd_ee56160);
    dp->~ee56160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56160(Test_ee56160, "ee56160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56160C1Ev();
extern void _ZN7ee56160D1Ev();
Name_Map name_map_ee56160[] = {
  NSPAIR(_ZN7ee56160C1Ev),
  NSPAIR(_ZN7ee56160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee56160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56160[];
extern void _ZN7ee561603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee561603barEv,_ZTv0_n16_N7ee561603barEv)();
extern void ABISELECT(_ZThn16_N7ee561603barEv,_ZThn8_N7ee561603barEv)() __attribute__((weak));
extern void _ZN6dd61603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee561603barEv,_ZTv0_n12_N7ee561603barEv)();
extern void ABISELECT(_ZThn32_N7ee561603barEv,_ZThn20_N7ee561603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56160[0]),
  (VTBL_ENTRY)&_ZN7ee561603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee561603barEv,_ZTv0_n16_N7ee561603barEv),
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee561603barEv,_ZTv0_n12_N7ee561603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
extern VTBL_ENTRY _ZTV7ee56160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee56160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee56160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee56160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee56160[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee56160[] = {
  {&(_ZTV7ee56160[4]),  4,18},
  {&(_ZTV7ee56160[10]),  10,18},
  {&(_ZTV7ee56160[16]),  16,18},
  {&(_tg__ZTV6dd6160__7ee56160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee56160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee56160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee56160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56160[];
extern  VTBL_ENTRY _ZTV7ee56160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56160[];
static VTBL_ENTRY alt_thunk_names100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee561603barEv,_ZTv0_n12_N7ee561603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee561603barEv,_ZThn20_N7ee561603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee561603barEv,_ZTv0_n16_N7ee561603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee561603barEv,_ZThn8_N7ee561603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56160 = {  "ee56160", // class name
  bases_ee56160, 4,
  &(vtc_ee56160[0]), // expected_vtbl_contents
  &(vtt_ee56160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56160),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names100,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66160  : dd6160 {
  int e;
  virtual void  foo(); // _ZN7ee661603fooEv
  virtual void  bar(); // _ZN7ee661603barEv
  ~ee66160(); // tgen
  ee66160(); // tgen
};
//SIG(1 ee66160) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66160 ::foo(){vfunc_called(this, "_ZN7ee661603fooEv");}
void  ee66160 ::bar(){vfunc_called(this, "_ZN7ee661603barEv");}
ee66160 ::~ee66160(){ note_dtor("ee66160", this);} // tgen
ee66160 ::ee66160(){ note_ctor("ee66160", this);} // tgen

static void Test_ee66160()
{
  extern Class_Descriptor cd_ee66160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66160, buf);
    ee66160 *dp, &lv = *(dp=new (buf) ee66160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee66160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(24,16), "ee66160");
    check_base_class_offset(lv, (cc160*)(dd6160*), 0, "ee66160");
    check_base_class_offset(lv, (dd6160*), 0, "ee66160");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66160.e");
    test_class_info(&lv, &cd_ee66160);
    dp->~ee66160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66160(Test_ee66160, "ee66160", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66160C1Ev();
extern void _ZN7ee66160D1Ev();
Name_Map name_map_ee66160[] = {
  NSPAIR(_ZN7ee66160C1Ev),
  NSPAIR(_ZN7ee66160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee66160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66160[];
extern void _ZN7ee661603barEv();
extern void _ZN7ee661603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee661603barEv,_ZTv0_n12_N7ee661603barEv)();
extern void ABISELECT(_ZThn24_N7ee661603barEv,_ZThn16_N7ee661603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee661603fooEv,_ZTv0_n16_N7ee661603fooEv)();
extern void ABISELECT(_ZThn24_N7ee661603fooEv,_ZThn16_N7ee661603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66160[0]),
  (VTBL_ENTRY)&_ZN7ee661603barEv,
  (VTBL_ENTRY)&_ZN7ee661603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee661603barEv,_ZTv0_n12_N7ee661603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee661603fooEv,_ZTv0_n16_N7ee661603fooEv),
};
extern VTBL_ENTRY _ZTV7ee66160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee66160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee66160[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee66160[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee66160[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee66160[] = {
  {&(_ZTV7ee66160[3]),  3,11},
  {&(_tg__ZTV6dd6160__7ee66160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee66160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee66160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee66160[4]),  4,6},
  {&(_ZTV7ee66160[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66160[];
extern  VTBL_ENTRY _ZTV7ee66160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66160[];
static VTBL_ENTRY alt_thunk_names101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603fooEv,_ZThn16_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61603barEv,_ZThn16_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee661603fooEv,_ZTv0_n16_N7ee661603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee661603fooEv,_ZThn16_N7ee661603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee661603barEv,_ZTv0_n12_N7ee661603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee661603barEv,_ZThn16_N7ee661603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66160 = {  "ee66160", // class name
  bases_ee66160, 4,
  &(vtc_ee66160[0]), // expected_vtbl_contents
  &(vtt_ee66160[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66160),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66160),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names101,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76160  : virtual dd6160 {
  int e;
  virtual void  foo(); // _ZN7ee761603fooEv
  virtual void  bar(); // _ZN7ee761603barEv
  ~ee76160(); // tgen
  ee76160(); // tgen
};
//SIG(1 ee76160) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76160 ::foo(){vfunc_called(this, "_ZN7ee761603fooEv");}
void  ee76160 ::bar(){vfunc_called(this, "_ZN7ee761603barEv");}
ee76160 ::~ee76160(){ note_dtor("ee76160", this);} // tgen
ee76160 ::ee76160(){ note_ctor("ee76160", this);} // tgen

static void Test_ee76160()
{
  extern Class_Descriptor cd_ee76160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76160, buf);
    ee76160 *dp, &lv = *(dp=new (buf) ee76160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee76160");
    check_base_class_offset(lv, (bb60*)(cc160*)(dd6160*), ABISELECT(32,20), "ee76160");
    check_base_class_offset(lv, (cc160*)(dd6160*), ABISELECT(16,8), "ee76160");
    check_base_class_offset(lv, (dd6160*), ABISELECT(16,8), "ee76160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76160.e");
    test_class_info(&lv, &cd_ee76160);
    dp->~ee76160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76160(Test_ee76160, "ee76160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76160C1Ev();
extern void _ZN7ee76160D1Ev();
Name_Map name_map_ee76160[] = {
  NSPAIR(_ZN7ee76160C1Ev),
  NSPAIR(_ZN7ee76160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd6160;
extern VTBL_ENTRY _ZTI6dd6160[];
extern  VTBL_ENTRY _ZTV6dd6160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6160[];
static Base_Class bases_ee76160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76160[];
extern void _ZN7ee761603fooEv();
extern void _ZN7ee761603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee761603barEv,_ZTv0_n16_N7ee761603barEv)();
extern void ABISELECT(_ZThn16_N7ee761603barEv,_ZThn8_N7ee761603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee761603fooEv,_ZTv0_n20_N7ee761603fooEv)();
extern void ABISELECT(_ZThn16_N7ee761603fooEv,_ZThn8_N7ee761603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee761603barEv,_ZTv0_n12_N7ee761603barEv)();
extern void ABISELECT(_ZThn32_N7ee761603barEv,_ZThn20_N7ee761603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee761603fooEv,_ZTv0_n16_N7ee761603fooEv)();
extern void ABISELECT(_ZThn32_N7ee761603fooEv,_ZThn20_N7ee761603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76160[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76160[0]),
  (VTBL_ENTRY)&_ZN7ee761603fooEv,
  (VTBL_ENTRY)&_ZN7ee761603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee761603barEv,_ZTv0_n16_N7ee761603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee761603fooEv,_ZTv0_n20_N7ee761603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee761603barEv,_ZTv0_n12_N7ee761603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee761603fooEv,_ZTv0_n16_N7ee761603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76160[];
extern void _ZN6dd61603barEv();
extern void _ZN6dd61603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6160__7ee76160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&_ZN6dd61603barEv,
  (VTBL_ENTRY)&_ZN6dd61603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1606dd6160__7ee76160[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc1606dd6160__7ee76160[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv)();
extern void ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv)();
extern void ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6160__7ee76160[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv),
};
static  VTT_ENTRY vtt_ee76160[] = {
  {&(_ZTV7ee76160[4]),  4,19},
  {&(_ZTV7ee76160[11]),  11,19},
  {&(_ZTV7ee76160[17]),  17,19},
  {&(_tg__ZTV6dd6160__7ee76160[3]),  3,5},
  {&(_tg__ZTV5cc1606dd6160__7ee76160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc1606dd6160__7ee76160[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6160__7ee76160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76160[];
extern  VTBL_ENTRY _ZTV7ee76160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76160[];
static VTBL_ENTRY alt_thunk_names102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61603fooEv,_ZTv0_n16_N6dd61603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603fooEv,_ZThn12_N6dd61603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61603barEv,_ZTv0_n12_N6dd61603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61603barEv,_ZThn12_N6dd61603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee761603fooEv,_ZTv0_n16_N7ee761603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee761603fooEv,_ZThn20_N7ee761603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee761603barEv,_ZTv0_n12_N7ee761603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee761603barEv,_ZThn20_N7ee761603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee761603fooEv,_ZTv0_n20_N7ee761603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee761603fooEv,_ZThn8_N7ee761603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee761603barEv,_ZTv0_n16_N7ee761603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee761603barEv,_ZThn8_N7ee761603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76160 = {  "ee76160", // class name
  bases_ee76160, 4,
  &(vtc_ee76160[0]), // expected_vtbl_contents
  &(vtt_ee76160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76160),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76160),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names102,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7160  : virtual cc160 {
  int d;
  virtual void  bar(); // _ZN6dd71603barEv
  virtual void  foo(); // _ZN6dd71603fooEv
  ~dd7160(); // tgen
  dd7160(); // tgen
};
//SIG(-1 dd7160) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd7160 ::bar(){vfunc_called(this, "_ZN6dd71603barEv");}
void  dd7160 ::foo(){vfunc_called(this, "_ZN6dd71603fooEv");}
dd7160 ::~dd7160(){ note_dtor("dd7160", this);} // tgen
dd7160 ::dd7160(){ note_ctor("dd7160", this);} // tgen

static void Test_dd7160()
{
  extern Class_Descriptor cd_dd7160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7160, buf);
    dd7160 *dp, &lv = *(dp=new (buf) dd7160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd7160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,16), "dd7160");
    check_base_class_offset(lv, (cc160*), ABISELECT(16,8), "dd7160");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7160.d");
    test_class_info(&lv, &cd_dd7160);
    dp->~dd7160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7160(Test_dd7160, "dd7160", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7160C1Ev();
extern void _ZN6dd7160D1Ev();
Name_Map name_map_dd7160[] = {
  NSPAIR(_ZN6dd7160C1Ev),
  NSPAIR(_ZN6dd7160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
static Base_Class bases_dd7160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7160[];
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__6dd7160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd7160[] = {
  {&(_ZTV6dd7160[4]),  4,15},
  {&(_ZTV6dd7160[9]),  9,15},
  {&(_ZTV6dd7160[13]),  13,15},
  {&(_tg__ZTV5cc160__6dd7160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__6dd7160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static VTBL_ENTRY alt_thunk_names103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7160 = {  "dd7160", // class name
  bases_dd7160, 3,
  &(vtc_dd7160[0]), // expected_vtbl_contents
  &(vtt_dd7160[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7160),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names103,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07160  : dd7160 {
  int e;
  ~ee07160(); // tgen
  ee07160(); // tgen
};
//SIG(1 ee07160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee07160 ::~ee07160(){ note_dtor("ee07160", this);} // tgen
ee07160 ::ee07160(){ note_ctor("ee07160", this);} // tgen

static void Test_ee07160()
{
  extern Class_Descriptor cd_ee07160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07160, buf);
    ee07160 *dp, &lv = *(dp=new (buf) ee07160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee07160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee07160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(16,12), "ee07160");
    check_base_class_offset(lv, (dd7160*), 0, "ee07160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07160.e");
    test_class_info(&lv, &cd_ee07160);
    dp->~ee07160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07160(Test_ee07160, "ee07160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07160C1Ev();
extern void _ZN7ee07160D1Ev();
Name_Map name_map_ee07160[] = {
  NSPAIR(_ZN7ee07160C1Ev),
  NSPAIR(_ZN7ee07160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee07160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee07160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee07160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee07160[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee07160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee07160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee07160[] = {
  {&(_ZTV7ee07160[4]),  4,15},
  {&(_tg__ZTV6dd7160__7ee07160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee07160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee07160[4]),  4,6},
  {&(_ZTV7ee07160[9]),  9,15},
  {&(_ZTV7ee07160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee07160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee07160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07160[];
extern  VTBL_ENTRY _ZTV7ee07160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07160[];
static VTBL_ENTRY alt_thunk_names104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07160 = {  "ee07160", // class name
  bases_ee07160, 4,
  &(vtc_ee07160[0]), // expected_vtbl_contents
  &(vtt_ee07160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07160),8, //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  ee17160  : virtual dd7160 {
  int e;
  ~ee17160(); // tgen
  ee17160(); // tgen
};
//SIG(1 ee17160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee17160 ::~ee17160(){ note_dtor("ee17160", this);} // tgen
ee17160 ::ee17160(){ note_ctor("ee17160", this);} // tgen

static void Test_ee17160()
{
  extern Class_Descriptor cd_ee17160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17160, buf);
    ee17160 *dp, &lv = *(dp=new (buf) ee17160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee17160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee17160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(32,16), "ee17160");
    check_base_class_offset(lv, (dd7160*), ABISELECT(16,8), "ee17160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17160.e");
    test_class_info(&lv, &cd_ee17160);
    dp->~ee17160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17160(Test_ee17160, "ee17160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17160C1Ev();
extern void _ZN7ee17160D1Ev();
Name_Map name_map_ee17160[] = {
  NSPAIR(_ZN7ee17160C1Ev),
  NSPAIR(_ZN7ee17160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee17160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17160[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17160[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee17160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee17160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee17160[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee17160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee17160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee17160[] = {
  {&(_ZTV7ee17160[5]),  5,22},
  {&(_ZTV7ee17160[11]),  11,22},
  {&(_ZTV7ee17160[16]),  16,22},
  {&(_ZTV7ee17160[20]),  20,22},
  {&(_tg__ZTV6dd7160__7ee17160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee17160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee17160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee17160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee17160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17160[];
extern  VTBL_ENTRY _ZTV7ee17160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17160[];
static VTBL_ENTRY alt_thunk_names105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17160 = {  "ee17160", // class name
  bases_ee17160, 4,
  &(vtc_ee17160[0]), // expected_vtbl_contents
  &(vtt_ee17160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17160),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17160),9, //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  ee27160  : dd7160 {
  int e;
  virtual void  foo(); // _ZN7ee271603fooEv
  ~ee27160(); // tgen
  ee27160(); // tgen
};
//SIG(1 ee27160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee27160 ::foo(){vfunc_called(this, "_ZN7ee271603fooEv");}
ee27160 ::~ee27160(){ note_dtor("ee27160", this);} // tgen
ee27160 ::ee27160(){ note_ctor("ee27160", this);} // tgen

static void Test_ee27160()
{
  extern Class_Descriptor cd_ee27160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27160, buf);
    ee27160 *dp, &lv = *(dp=new (buf) ee27160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee27160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee27160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(16,12), "ee27160");
    check_base_class_offset(lv, (dd7160*), 0, "ee27160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27160.e");
    test_class_info(&lv, &cd_ee27160);
    dp->~ee27160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27160(Test_ee27160, "ee27160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27160C1Ev();
extern void _ZN7ee27160D1Ev();
Name_Map name_map_ee27160[] = {
  NSPAIR(_ZN7ee27160C1Ev),
  NSPAIR(_ZN7ee27160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee27160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27160[];
extern void _ZN6dd71603barEv();
extern void _ZN7ee271603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee271603fooEv,_ZTv0_n16_N7ee271603fooEv)();
extern void ABISELECT(_ZThn32_N7ee271603fooEv,_ZThn20_N7ee271603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN7ee271603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee271603fooEv,_ZTv0_n16_N7ee271603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee27160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee27160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee27160[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee27160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee27160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee27160[] = {
  {&(_ZTV7ee27160[4]),  4,15},
  {&(_tg__ZTV6dd7160__7ee27160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee27160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee27160[4]),  4,6},
  {&(_ZTV7ee27160[9]),  9,15},
  {&(_ZTV7ee27160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee27160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee27160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27160[];
extern  VTBL_ENTRY _ZTV7ee27160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27160[];
static VTBL_ENTRY alt_thunk_names106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee271603fooEv,_ZTv0_n16_N7ee271603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee271603fooEv,_ZThn20_N7ee271603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27160 = {  "ee27160", // class name
  bases_ee27160, 4,
  &(vtc_ee27160[0]), // expected_vtbl_contents
  &(vtt_ee27160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27160),8, //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  ee37160  : virtual dd7160 {
  int e;
  virtual void  foo(); // _ZN7ee371603fooEv
  ~ee37160(); // tgen
  ee37160(); // tgen
};
//SIG(1 ee37160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee37160 ::foo(){vfunc_called(this, "_ZN7ee371603fooEv");}
ee37160 ::~ee37160(){ note_dtor("ee37160", this);} // tgen
ee37160 ::ee37160(){ note_ctor("ee37160", this);} // tgen

static void Test_ee37160()
{
  extern Class_Descriptor cd_ee37160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37160, buf);
    ee37160 *dp, &lv = *(dp=new (buf) ee37160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee37160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee37160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(32,16), "ee37160");
    check_base_class_offset(lv, (dd7160*), ABISELECT(16,8), "ee37160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37160.e");
    test_class_info(&lv, &cd_ee37160);
    dp->~ee37160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37160(Test_ee37160, "ee37160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37160C1Ev();
extern void _ZN7ee37160D1Ev();
Name_Map name_map_ee37160[] = {
  NSPAIR(_ZN7ee37160C1Ev),
  NSPAIR(_ZN7ee37160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee37160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37160[];
extern void _ZN7ee371603fooEv();
extern void _ZN6dd71603barEv();
extern void ABISELECT(_ZTv0_n48_N7ee371603fooEv,_ZTv0_n24_N7ee371603fooEv)();
extern void ABISELECT(_ZThn16_N7ee371603fooEv,_ZThn8_N7ee371603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee371603fooEv,_ZTv0_n16_N7ee371603fooEv)();
extern void ABISELECT(_ZThn48_N7ee371603fooEv,_ZThn24_N7ee371603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37160[0]),
  (VTBL_ENTRY)&_ZN7ee371603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee371603fooEv,_ZTv0_n24_N7ee371603fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37160[0]),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee371603fooEv,_ZTv0_n16_N7ee371603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee37160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee37160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee37160[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee37160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee37160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee37160[] = {
  {&(_ZTV7ee37160[5]),  5,23},
  {&(_ZTV7ee37160[12]),  12,23},
  {&(_ZTV7ee37160[17]),  17,23},
  {&(_ZTV7ee37160[21]),  21,23},
  {&(_tg__ZTV6dd7160__7ee37160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee37160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee37160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee37160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee37160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37160[];
extern  VTBL_ENTRY _ZTV7ee37160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37160[];
static VTBL_ENTRY alt_thunk_names107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee371603fooEv,_ZTv0_n16_N7ee371603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee371603fooEv,_ZThn24_N7ee371603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee371603fooEv,_ZTv0_n24_N7ee371603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee371603fooEv,_ZThn8_N7ee371603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37160 = {  "ee37160", // class name
  bases_ee37160, 4,
  &(vtc_ee37160[0]), // expected_vtbl_contents
  &(vtt_ee37160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37160),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37160),9, //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  ee47160  : dd7160 {
  int e;
  virtual void  bar(); // _ZN7ee471603barEv
  ~ee47160(); // tgen
  ee47160(); // tgen
};
//SIG(1 ee47160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee47160 ::bar(){vfunc_called(this, "_ZN7ee471603barEv");}
ee47160 ::~ee47160(){ note_dtor("ee47160", this);} // tgen
ee47160 ::ee47160(){ note_ctor("ee47160", this);} // tgen

static void Test_ee47160()
{
  extern Class_Descriptor cd_ee47160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47160, buf);
    ee47160 *dp, &lv = *(dp=new (buf) ee47160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee47160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee47160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(16,12), "ee47160");
    check_base_class_offset(lv, (dd7160*), 0, "ee47160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47160.e");
    test_class_info(&lv, &cd_ee47160);
    dp->~ee47160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47160(Test_ee47160, "ee47160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47160C1Ev();
extern void _ZN7ee47160D1Ev();
Name_Map name_map_ee47160[] = {
  NSPAIR(_ZN7ee47160C1Ev),
  NSPAIR(_ZN7ee47160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee47160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47160[];
extern void _ZN7ee471603barEv();
extern void _ZN6dd71603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee471603barEv,_ZTv0_n12_N7ee471603barEv)();
extern void ABISELECT(_ZThn32_N7ee471603barEv,_ZThn20_N7ee471603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47160[0]),
  (VTBL_ENTRY)&_ZN7ee471603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee471603barEv,_ZTv0_n12_N7ee471603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee47160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee47160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee47160[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee47160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee47160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee47160[] = {
  {&(_ZTV7ee47160[4]),  4,15},
  {&(_tg__ZTV6dd7160__7ee47160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee47160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee47160[4]),  4,6},
  {&(_ZTV7ee47160[9]),  9,15},
  {&(_ZTV7ee47160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee47160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee47160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47160[];
extern  VTBL_ENTRY _ZTV7ee47160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47160[];
static VTBL_ENTRY alt_thunk_names108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee471603barEv,_ZTv0_n12_N7ee471603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee471603barEv,_ZThn20_N7ee471603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47160 = {  "ee47160", // class name
  bases_ee47160, 4,
  &(vtc_ee47160[0]), // expected_vtbl_contents
  &(vtt_ee47160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names108,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57160  : virtual dd7160 {
  int e;
  virtual void  bar(); // _ZN7ee571603barEv
  ~ee57160(); // tgen
  ee57160(); // tgen
};
//SIG(1 ee57160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee57160 ::bar(){vfunc_called(this, "_ZN7ee571603barEv");}
ee57160 ::~ee57160(){ note_dtor("ee57160", this);} // tgen
ee57160 ::ee57160(){ note_ctor("ee57160", this);} // tgen

static void Test_ee57160()
{
  extern Class_Descriptor cd_ee57160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57160, buf);
    ee57160 *dp, &lv = *(dp=new (buf) ee57160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee57160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee57160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(32,16), "ee57160");
    check_base_class_offset(lv, (dd7160*), ABISELECT(16,8), "ee57160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57160.e");
    test_class_info(&lv, &cd_ee57160);
    dp->~ee57160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57160(Test_ee57160, "ee57160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57160C1Ev();
extern void _ZN7ee57160D1Ev();
Name_Map name_map_ee57160[] = {
  NSPAIR(_ZN7ee57160C1Ev),
  NSPAIR(_ZN7ee57160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee57160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57160[];
extern void _ZN7ee571603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee571603barEv,_ZTv0_n20_N7ee571603barEv)();
extern void ABISELECT(_ZThn16_N7ee571603barEv,_ZThn8_N7ee571603barEv)() __attribute__((weak));
extern void _ZN6dd71603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee571603barEv,_ZTv0_n12_N7ee571603barEv)();
extern void ABISELECT(_ZThn48_N7ee571603barEv,_ZThn24_N7ee571603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57160[0]),
  (VTBL_ENTRY)&_ZN7ee571603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee571603barEv,_ZTv0_n20_N7ee571603barEv),
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57160[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee571603barEv,_ZTv0_n12_N7ee571603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee57160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee57160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee57160[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee57160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee57160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee57160[] = {
  {&(_ZTV7ee57160[5]),  5,23},
  {&(_ZTV7ee57160[12]),  12,23},
  {&(_ZTV7ee57160[17]),  17,23},
  {&(_ZTV7ee57160[21]),  21,23},
  {&(_tg__ZTV6dd7160__7ee57160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee57160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee57160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee57160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee57160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57160[];
extern  VTBL_ENTRY _ZTV7ee57160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57160[];
static VTBL_ENTRY alt_thunk_names109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee571603barEv,_ZTv0_n12_N7ee571603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee571603barEv,_ZThn24_N7ee571603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee571603barEv,_ZTv0_n20_N7ee571603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee571603barEv,_ZThn8_N7ee571603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57160 = {  "ee57160", // class name
  bases_ee57160, 4,
  &(vtc_ee57160[0]), // expected_vtbl_contents
  &(vtt_ee57160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57160),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names109,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67160  : dd7160 {
  int e;
  virtual void  foo(); // _ZN7ee671603fooEv
  virtual void  bar(); // _ZN7ee671603barEv
  ~ee67160(); // tgen
  ee67160(); // tgen
};
//SIG(1 ee67160) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67160 ::foo(){vfunc_called(this, "_ZN7ee671603fooEv");}
void  ee67160 ::bar(){vfunc_called(this, "_ZN7ee671603barEv");}
ee67160 ::~ee67160(){ note_dtor("ee67160", this);} // tgen
ee67160 ::ee67160(){ note_ctor("ee67160", this);} // tgen

static void Test_ee67160()
{
  extern Class_Descriptor cd_ee67160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67160, buf);
    ee67160 *dp, &lv = *(dp=new (buf) ee67160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee67160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(32,20), "ee67160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(16,12), "ee67160");
    check_base_class_offset(lv, (dd7160*), 0, "ee67160");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67160.e");
    test_class_info(&lv, &cd_ee67160);
    dp->~ee67160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67160(Test_ee67160, "ee67160", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67160C1Ev();
extern void _ZN7ee67160D1Ev();
Name_Map name_map_ee67160[] = {
  NSPAIR(_ZN7ee67160C1Ev),
  NSPAIR(_ZN7ee67160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee67160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67160[];
extern void _ZN7ee671603barEv();
extern void _ZN7ee671603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee671603barEv,_ZTv0_n12_N7ee671603barEv)();
extern void ABISELECT(_ZThn32_N7ee671603barEv,_ZThn20_N7ee671603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee671603fooEv,_ZTv0_n16_N7ee671603fooEv)();
extern void ABISELECT(_ZThn32_N7ee671603fooEv,_ZThn20_N7ee671603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67160[0]),
  (VTBL_ENTRY)&_ZN7ee671603barEv,
  (VTBL_ENTRY)&_ZN7ee671603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67160[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee671603barEv,_ZTv0_n12_N7ee671603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee671603fooEv,_ZTv0_n16_N7ee671603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee67160[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee67160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee67160[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee67160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee67160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee67160[] = {
  {&(_ZTV7ee67160[4]),  4,15},
  {&(_tg__ZTV6dd7160__7ee67160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee67160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee67160[4]),  4,6},
  {&(_ZTV7ee67160[9]),  9,15},
  {&(_ZTV7ee67160[13]),  13,15},
  {&(_tg__ZTV5cc160__7ee67160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee67160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67160[];
extern  VTBL_ENTRY _ZTV7ee67160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67160[];
static VTBL_ENTRY alt_thunk_names110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn20_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn20_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee671603fooEv,_ZTv0_n16_N7ee671603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee671603fooEv,_ZThn20_N7ee671603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee671603barEv,_ZTv0_n12_N7ee671603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee671603barEv,_ZThn20_N7ee671603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67160 = {  "ee67160", // class name
  bases_ee67160, 4,
  &(vtc_ee67160[0]), // expected_vtbl_contents
  &(vtt_ee67160[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67160),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67160),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67160),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names110,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77160  : virtual dd7160 {
  int e;
  virtual void  foo(); // _ZN7ee771603fooEv
  virtual void  bar(); // _ZN7ee771603barEv
  ~ee77160(); // tgen
  ee77160(); // tgen
};
//SIG(1 ee77160) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77160 ::foo(){vfunc_called(this, "_ZN7ee771603fooEv");}
void  ee77160 ::bar(){vfunc_called(this, "_ZN7ee771603barEv");}
ee77160 ::~ee77160(){ note_dtor("ee77160", this);} // tgen
ee77160 ::ee77160(){ note_ctor("ee77160", this);} // tgen

static void Test_ee77160()
{
  extern Class_Descriptor cd_ee77160;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77160, buf);
    ee77160 *dp, &lv = *(dp=new (buf) ee77160());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77160)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77160)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee77160");
    check_base_class_offset(lv, (bb60*)(cc160*), ABISELECT(48,24), "ee77160");
    check_base_class_offset(lv, (cc160*)(dd7160*), ABISELECT(32,16), "ee77160");
    check_base_class_offset(lv, (dd7160*), ABISELECT(16,8), "ee77160");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77160.e");
    test_class_info(&lv, &cd_ee77160);
    dp->~ee77160();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77160(Test_ee77160, "ee77160", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77160C1Ev();
extern void _ZN7ee77160D1Ev();
Name_Map name_map_ee77160[] = {
  NSPAIR(_ZN7ee77160C1Ev),
  NSPAIR(_ZN7ee77160D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc160;
extern VTBL_ENTRY _ZTI5cc160[];
extern  VTBL_ENTRY _ZTV5cc160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc160[];
extern Class_Descriptor cd_dd7160;
extern VTBL_ENTRY _ZTI6dd7160[];
extern  VTBL_ENTRY _ZTV6dd7160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7160[];
static Base_Class bases_ee77160[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc160,    ABISELECT(32,16), //bcp->offset
    15, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7160,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77160[];
extern void _ZN7ee771603fooEv();
extern void _ZN7ee771603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee771603barEv,_ZTv0_n20_N7ee771603barEv)();
extern void ABISELECT(_ZThn16_N7ee771603barEv,_ZThn8_N7ee771603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee771603fooEv,_ZTv0_n24_N7ee771603fooEv)();
extern void ABISELECT(_ZThn16_N7ee771603fooEv,_ZThn8_N7ee771603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee771603barEv,_ZTv0_n12_N7ee771603barEv)();
extern void ABISELECT(_ZThn48_N7ee771603barEv,_ZThn24_N7ee771603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee771603fooEv,_ZTv0_n16_N7ee771603fooEv)();
extern void ABISELECT(_ZThn48_N7ee771603fooEv,_ZThn24_N7ee771603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77160[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77160[0]),
  (VTBL_ENTRY)&_ZN7ee771603fooEv,
  (VTBL_ENTRY)&_ZN7ee771603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee771603barEv,_ZTv0_n20_N7ee771603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee771603fooEv,_ZTv0_n24_N7ee771603fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77160[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee771603barEv,_ZTv0_n12_N7ee771603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee771603fooEv,_ZTv0_n16_N7ee771603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77160[];
extern void _ZN6dd71603barEv();
extern void _ZN6dd71603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7160__7ee77160[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&_ZN6dd71603barEv,
  (VTBL_ENTRY)&_ZN6dd71603fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc160__6dd7160__7ee77160[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv)();
extern void ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv)();
extern void ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7160__7ee77160[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7160[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv),
};
static  VTBL_ENTRY _tg__ZTV5cc160__7ee77160[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc160__7ee77160[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc160[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee77160[] = {
  {&(_ZTV7ee77160[5]),  5,24},
  {&(_ZTV7ee77160[13]),  13,24},
  {&(_ZTV7ee77160[18]),  18,24},
  {&(_ZTV7ee77160[22]),  22,24},
  {&(_tg__ZTV6dd7160__7ee77160[4]),  4,6},
  {&(_tg__ZTV5cc160__6dd7160__7ee77160[3]),  3,3},
  {&(_tg__ZTV4bb60__6dd7160__7ee77160[4]),  4,6},
  {&(_tg__ZTV5cc160__7ee77160[3]),  3,3},
  {&(_tg__ZTV4bb60__5cc160__7ee77160[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77160[];
extern  VTBL_ENTRY _ZTV7ee77160[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77160[];
static VTBL_ENTRY alt_thunk_names111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71603fooEv,_ZTv0_n16_N6dd71603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603fooEv,_ZThn16_N6dd71603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71603barEv,_ZTv0_n12_N6dd71603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71603barEv,_ZThn16_N6dd71603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee771603fooEv,_ZTv0_n16_N7ee771603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee771603fooEv,_ZThn24_N7ee771603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee771603barEv,_ZTv0_n12_N7ee771603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee771603barEv,_ZThn24_N7ee771603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee771603fooEv,_ZTv0_n24_N7ee771603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee771603fooEv,_ZThn8_N7ee771603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee771603barEv,_ZTv0_n20_N7ee771603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee771603barEv,_ZThn8_N7ee771603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77160 = {  "ee77160", // class name
  bases_ee77160, 4,
  &(vtc_ee77160[0]), // expected_vtbl_contents
  &(vtt_ee77160[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77160),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77160),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77160),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names111,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc260  : bb60 {
  int c;
  virtual void  foo(); // _ZN5cc2603fooEv
  ~cc260(); // tgen
  cc260(); // tgen
};
//SIG(-1 cc260) C1{ BC2{ BC3{ Fi} v2 v1 Fi} v1 Fi}


void  cc260 ::foo(){vfunc_called(this, "_ZN5cc2603fooEv");}
cc260 ::~cc260(){ note_dtor("cc260", this);} // tgen
cc260 ::cc260(){ note_ctor("cc260", this);} // tgen

static void Test_cc260()
{
  extern Class_Descriptor cd_cc260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc260, buf);
    cc260 *dp, &lv = *(dp=new (buf) cc260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc260)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(8,4), "cc260");
    check_base_class_offset(lv, (bb60*), 0, "cc260");
    check_field_offset(lv, c, ABISELECT(16,12), "cc260.c");
    test_class_info(&lv, &cd_cc260);
    dp->~cc260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc260(Test_cc260, "cc260", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc260C1Ev();
extern void _ZN5cc260D1Ev();
Name_Map name_map_cc260[] = {
  NSPAIR(_ZN5cc260C1Ev),
  NSPAIR(_ZN5cc260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5cc260[];
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_cc260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
Class_Descriptor cd_cc260 = {  "cc260", // class name
  bases_cc260, 2,
  &(vtc_cc260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc260),4, //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  dd0260  : cc260 {
  int d;
  ~dd0260(); // tgen
  dd0260(); // tgen
};
//SIG(-1 dd0260) C1{ BC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} Fi}


dd0260 ::~dd0260(){ note_dtor("dd0260", this);} // tgen
dd0260 ::dd0260(){ note_ctor("dd0260", this);} // tgen

static void Test_dd0260()
{
  extern Class_Descriptor cd_dd0260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0260, buf);
    dd0260 *dp, &lv = *(dp=new (buf) dd0260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(8,4), "dd0260");
    check_base_class_offset(lv, (bb60*)(cc260*), 0, "dd0260");
    check_base_class_offset(lv, (cc260*), 0, "dd0260");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0260.d");
    test_class_info(&lv, &cd_dd0260);
    dp->~dd0260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0260(Test_dd0260, "dd0260", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0260C1Ev();
extern void _ZN6dd0260D1Ev();
Name_Map name_map_dd0260[] = {
  NSPAIR(_ZN6dd0260C1Ev),
  NSPAIR(_ZN6dd0260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd0260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0260[];
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_dd0260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
Class_Descriptor cd_dd0260 = {  "dd0260", // class name
  bases_dd0260, 3,
  &(vtc_dd0260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0260),4, //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  ee00260  : dd0260 {
  int e;
  ~ee00260(); // tgen
  ee00260(); // tgen
};
//SIG(1 ee00260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee00260 ::~ee00260(){ note_dtor("ee00260", this);} // tgen
ee00260 ::ee00260(){ note_ctor("ee00260", this);} // tgen

static void Test_ee00260()
{
  extern Class_Descriptor cd_ee00260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00260, buf);
    ee00260 *dp, &lv = *(dp=new (buf) ee00260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(8,4), "ee00260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), 0, "ee00260");
    check_base_class_offset(lv, (cc260*)(dd0260*), 0, "ee00260");
    check_base_class_offset(lv, (dd0260*), 0, "ee00260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00260.e");
    test_class_info(&lv, &cd_ee00260);
    dp->~ee00260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00260(Test_ee00260, "ee00260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00260C1Ev();
extern void _ZN7ee00260D1Ev();
Name_Map name_map_ee00260[] = {
  NSPAIR(_ZN7ee00260C1Ev),
  NSPAIR(_ZN7ee00260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee00260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee00260[];
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee00260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTI7ee00260[];
extern  VTBL_ENTRY _ZTV7ee00260[];
Class_Descriptor cd_ee00260 = {  "ee00260", // class name
  bases_ee00260, 4,
  &(vtc_ee00260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00260),4, //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  ee10260  : virtual dd0260 {
  int e;
  ~ee10260(); // tgen
  ee10260(); // tgen
};
//SIG(1 ee10260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee10260 ::~ee10260(){ note_dtor("ee10260", this);} // tgen
ee10260 ::ee10260(){ note_ctor("ee10260", this);} // tgen

static void Test_ee10260()
{
  extern Class_Descriptor cd_ee10260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10260, buf);
    ee10260 *dp, &lv = *(dp=new (buf) ee10260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(24,12), "ee10260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), ABISELECT(16,8), "ee10260");
    check_base_class_offset(lv, (cc260*)(dd0260*), ABISELECT(16,8), "ee10260");
    check_base_class_offset(lv, (dd0260*), ABISELECT(16,8), "ee10260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10260.e");
    test_class_info(&lv, &cd_ee10260);
    dp->~ee10260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10260(Test_ee10260, "ee10260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10260C1Ev();
extern void _ZN7ee10260D1Ev();
Name_Map name_map_ee10260[] = {
  NSPAIR(_ZN7ee10260C1Ev),
  NSPAIR(_ZN7ee10260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee10260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10260[];
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee10260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10260[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee10260[];
static  VTT_ENTRY vtt_ee10260[] = {
  {&(_ZTV7ee10260[3]),  3,9},
  {&(_ZTV7ee10260[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10260[];
extern  VTBL_ENTRY _ZTV7ee10260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10260[];
Class_Descriptor cd_ee10260 = {  "ee10260", // class name
  bases_ee10260, 4,
  &(vtc_ee10260[0]), // expected_vtbl_contents
  &(vtt_ee10260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10260),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10260),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  ee20260  : dd0260 {
  int e;
  virtual void  foo(); // _ZN7ee202603fooEv
  ~ee20260(); // tgen
  ee20260(); // tgen
};
//SIG(1 ee20260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee20260 ::foo(){vfunc_called(this, "_ZN7ee202603fooEv");}
ee20260 ::~ee20260(){ note_dtor("ee20260", this);} // tgen
ee20260 ::ee20260(){ note_ctor("ee20260", this);} // tgen

static void Test_ee20260()
{
  extern Class_Descriptor cd_ee20260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20260, buf);
    ee20260 *dp, &lv = *(dp=new (buf) ee20260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(8,4), "ee20260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), 0, "ee20260");
    check_base_class_offset(lv, (cc260*)(dd0260*), 0, "ee20260");
    check_base_class_offset(lv, (dd0260*), 0, "ee20260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20260.e");
    test_class_info(&lv, &cd_ee20260);
    dp->~ee20260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20260(Test_ee20260, "ee20260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20260C1Ev();
extern void _ZN7ee20260D1Ev();
Name_Map name_map_ee20260[] = {
  NSPAIR(_ZN7ee20260C1Ev),
  NSPAIR(_ZN7ee20260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee20260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee20260[];
extern void _ZN4bb603barEv();
extern void _ZN7ee202603fooEv();
static  VTBL_ENTRY vtc_ee20260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN7ee202603fooEv,
};
extern VTBL_ENTRY _ZTI7ee20260[];
extern  VTBL_ENTRY _ZTV7ee20260[];
Class_Descriptor cd_ee20260 = {  "ee20260", // class name
  bases_ee20260, 4,
  &(vtc_ee20260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20260),4, //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  ee30260  : virtual dd0260 {
  int e;
  virtual void  foo(); // _ZN7ee302603fooEv
  ~ee30260(); // tgen
  ee30260(); // tgen
};
//SIG(1 ee30260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee30260 ::foo(){vfunc_called(this, "_ZN7ee302603fooEv");}
ee30260 ::~ee30260(){ note_dtor("ee30260", this);} // tgen
ee30260 ::ee30260(){ note_ctor("ee30260", this);} // tgen

static void Test_ee30260()
{
  extern Class_Descriptor cd_ee30260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30260, buf);
    ee30260 *dp, &lv = *(dp=new (buf) ee30260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(24,12), "ee30260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), ABISELECT(16,8), "ee30260");
    check_base_class_offset(lv, (cc260*)(dd0260*), ABISELECT(16,8), "ee30260");
    check_base_class_offset(lv, (dd0260*), ABISELECT(16,8), "ee30260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30260.e");
    test_class_info(&lv, &cd_ee30260);
    dp->~ee30260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30260(Test_ee30260, "ee30260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30260C1Ev();
extern void _ZN7ee30260D1Ev();
Name_Map name_map_ee30260[] = {
  NSPAIR(_ZN7ee30260C1Ev),
  NSPAIR(_ZN7ee30260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee30260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30260[];
extern void _ZN7ee302603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee302603fooEv,_ZTv0_n16_N7ee302603fooEv)();
extern void ABISELECT(_ZThn16_N7ee302603fooEv,_ZThn8_N7ee302603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30260[0]),
  (VTBL_ENTRY)&_ZN7ee302603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee302603fooEv,_ZTv0_n16_N7ee302603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30260[];
static  VTT_ENTRY vtt_ee30260[] = {
  {&(_ZTV7ee30260[3]),  3,10},
  {&(_ZTV7ee30260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30260[];
extern  VTBL_ENTRY _ZTV7ee30260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30260[];
static VTBL_ENTRY alt_thunk_names112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee302603fooEv,_ZTv0_n16_N7ee302603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee302603fooEv,_ZThn8_N7ee302603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30260 = {  "ee30260", // class name
  bases_ee30260, 4,
  &(vtc_ee30260[0]), // expected_vtbl_contents
  &(vtt_ee30260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names112,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40260  : dd0260 {
  int e;
  virtual void  bar(); // _ZN7ee402603barEv
  ~ee40260(); // tgen
  ee40260(); // tgen
};
//SIG(1 ee40260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee40260 ::bar(){vfunc_called(this, "_ZN7ee402603barEv");}
ee40260 ::~ee40260(){ note_dtor("ee40260", this);} // tgen
ee40260 ::ee40260(){ note_ctor("ee40260", this);} // tgen

static void Test_ee40260()
{
  extern Class_Descriptor cd_ee40260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40260, buf);
    ee40260 *dp, &lv = *(dp=new (buf) ee40260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(8,4), "ee40260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), 0, "ee40260");
    check_base_class_offset(lv, (cc260*)(dd0260*), 0, "ee40260");
    check_base_class_offset(lv, (dd0260*), 0, "ee40260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40260.e");
    test_class_info(&lv, &cd_ee40260);
    dp->~ee40260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40260(Test_ee40260, "ee40260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40260C1Ev();
extern void _ZN7ee40260D1Ev();
Name_Map name_map_ee40260[] = {
  NSPAIR(_ZN7ee40260C1Ev),
  NSPAIR(_ZN7ee40260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee40260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee40260[];
extern void _ZN7ee402603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee40260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40260[0]),
  (VTBL_ENTRY)&_ZN7ee402603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTI7ee40260[];
extern  VTBL_ENTRY _ZTV7ee40260[];
Class_Descriptor cd_ee40260 = {  "ee40260", // class name
  bases_ee40260, 4,
  &(vtc_ee40260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40260),4, //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  ee50260  : virtual dd0260 {
  int e;
  virtual void  bar(); // _ZN7ee502603barEv
  ~ee50260(); // tgen
  ee50260(); // tgen
};
//SIG(1 ee50260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee50260 ::bar(){vfunc_called(this, "_ZN7ee502603barEv");}
ee50260 ::~ee50260(){ note_dtor("ee50260", this);} // tgen
ee50260 ::ee50260(){ note_ctor("ee50260", this);} // tgen

static void Test_ee50260()
{
  extern Class_Descriptor cd_ee50260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50260, buf);
    ee50260 *dp, &lv = *(dp=new (buf) ee50260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(24,12), "ee50260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), ABISELECT(16,8), "ee50260");
    check_base_class_offset(lv, (cc260*)(dd0260*), ABISELECT(16,8), "ee50260");
    check_base_class_offset(lv, (dd0260*), ABISELECT(16,8), "ee50260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50260.e");
    test_class_info(&lv, &cd_ee50260);
    dp->~ee50260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50260(Test_ee50260, "ee50260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50260C1Ev();
extern void _ZN7ee50260D1Ev();
Name_Map name_map_ee50260[] = {
  NSPAIR(_ZN7ee50260C1Ev),
  NSPAIR(_ZN7ee50260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee50260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50260[];
extern void _ZN7ee502603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee502603barEv,_ZTv0_n12_N7ee502603barEv)();
extern void ABISELECT(_ZThn16_N7ee502603barEv,_ZThn8_N7ee502603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee50260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50260[0]),
  (VTBL_ENTRY)&_ZN7ee502603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee502603barEv,_ZTv0_n12_N7ee502603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee50260[];
static  VTT_ENTRY vtt_ee50260[] = {
  {&(_ZTV7ee50260[3]),  3,10},
  {&(_ZTV7ee50260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50260[];
extern  VTBL_ENTRY _ZTV7ee50260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50260[];
static VTBL_ENTRY alt_thunk_names113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee502603barEv,_ZTv0_n12_N7ee502603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee502603barEv,_ZThn8_N7ee502603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50260 = {  "ee50260", // class name
  bases_ee50260, 4,
  &(vtc_ee50260[0]), // expected_vtbl_contents
  &(vtt_ee50260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names113,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60260  : dd0260 {
  int e;
  virtual void  foo(); // _ZN7ee602603fooEv
  virtual void  bar(); // _ZN7ee602603barEv
  ~ee60260(); // tgen
  ee60260(); // tgen
};
//SIG(1 ee60260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee60260 ::foo(){vfunc_called(this, "_ZN7ee602603fooEv");}
void  ee60260 ::bar(){vfunc_called(this, "_ZN7ee602603barEv");}
ee60260 ::~ee60260(){ note_dtor("ee60260", this);} // tgen
ee60260 ::ee60260(){ note_ctor("ee60260", this);} // tgen

static void Test_ee60260()
{
  extern Class_Descriptor cd_ee60260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60260, buf);
    ee60260 *dp, &lv = *(dp=new (buf) ee60260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(8,4), "ee60260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), 0, "ee60260");
    check_base_class_offset(lv, (cc260*)(dd0260*), 0, "ee60260");
    check_base_class_offset(lv, (dd0260*), 0, "ee60260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60260.e");
    test_class_info(&lv, &cd_ee60260);
    dp->~ee60260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60260(Test_ee60260, "ee60260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60260C1Ev();
extern void _ZN7ee60260D1Ev();
Name_Map name_map_ee60260[] = {
  NSPAIR(_ZN7ee60260C1Ev),
  NSPAIR(_ZN7ee60260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee60260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee60260[];
extern void _ZN7ee602603barEv();
extern void _ZN7ee602603fooEv();
static  VTBL_ENTRY vtc_ee60260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60260[0]),
  (VTBL_ENTRY)&_ZN7ee602603barEv,
  (VTBL_ENTRY)&_ZN7ee602603fooEv,
};
extern VTBL_ENTRY _ZTI7ee60260[];
extern  VTBL_ENTRY _ZTV7ee60260[];
Class_Descriptor cd_ee60260 = {  "ee60260", // class name
  bases_ee60260, 4,
  &(vtc_ee60260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60260),4, //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  ee70260  : virtual dd0260 {
  int e;
  virtual void  foo(); // _ZN7ee702603fooEv
  virtual void  bar(); // _ZN7ee702603barEv
  ~ee70260(); // tgen
  ee70260(); // tgen
};
//SIG(1 ee70260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee70260 ::foo(){vfunc_called(this, "_ZN7ee702603fooEv");}
void  ee70260 ::bar(){vfunc_called(this, "_ZN7ee702603barEv");}
ee70260 ::~ee70260(){ note_dtor("ee70260", this);} // tgen
ee70260 ::ee70260(){ note_ctor("ee70260", this);} // tgen

static void Test_ee70260()
{
  extern Class_Descriptor cd_ee70260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70260, buf);
    ee70260 *dp, &lv = *(dp=new (buf) ee70260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd0260*), ABISELECT(24,12), "ee70260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd0260*), ABISELECT(16,8), "ee70260");
    check_base_class_offset(lv, (cc260*)(dd0260*), ABISELECT(16,8), "ee70260");
    check_base_class_offset(lv, (dd0260*), ABISELECT(16,8), "ee70260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70260.e");
    test_class_info(&lv, &cd_ee70260);
    dp->~ee70260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70260(Test_ee70260, "ee70260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70260C1Ev();
extern void _ZN7ee70260D1Ev();
Name_Map name_map_ee70260[] = {
  NSPAIR(_ZN7ee70260C1Ev),
  NSPAIR(_ZN7ee70260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd0260;
extern VTBL_ENTRY _ZTI6dd0260[];
extern  VTBL_ENTRY _ZTV6dd0260[];
static Base_Class bases_ee70260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0260,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70260[];
extern void _ZN7ee702603fooEv();
extern void _ZN7ee702603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee702603barEv,_ZTv0_n12_N7ee702603barEv)();
extern void ABISELECT(_ZThn16_N7ee702603barEv,_ZThn8_N7ee702603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee702603fooEv,_ZTv0_n16_N7ee702603fooEv)();
extern void ABISELECT(_ZThn16_N7ee702603fooEv,_ZThn8_N7ee702603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70260[0]),
  (VTBL_ENTRY)&_ZN7ee702603fooEv,
  (VTBL_ENTRY)&_ZN7ee702603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee702603barEv,_ZTv0_n12_N7ee702603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee702603fooEv,_ZTv0_n16_N7ee702603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70260[];
static  VTT_ENTRY vtt_ee70260[] = {
  {&(_ZTV7ee70260[3]),  3,11},
  {&(_ZTV7ee70260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70260[];
extern  VTBL_ENTRY _ZTV7ee70260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70260[];
static VTBL_ENTRY alt_thunk_names114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee702603fooEv,_ZTv0_n16_N7ee702603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee702603fooEv,_ZThn8_N7ee702603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee702603barEv,_ZTv0_n12_N7ee702603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee702603barEv,_ZThn8_N7ee702603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70260 = {  "ee70260", // class name
  bases_ee70260, 4,
  &(vtc_ee70260[0]), // expected_vtbl_contents
  &(vtt_ee70260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names114,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1260  : virtual cc260 {
  int d;
  ~dd1260(); // tgen
  dd1260(); // tgen
};
//SIG(-1 dd1260) C1{ VBC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} Fi}


dd1260 ::~dd1260(){ note_dtor("dd1260", this);} // tgen
dd1260 ::dd1260(){ note_ctor("dd1260", this);} // tgen

static void Test_dd1260()
{
  extern Class_Descriptor cd_dd1260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1260, buf);
    dd1260 *dp, &lv = *(dp=new (buf) dd1260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,12), "dd1260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,8), "dd1260");
    check_base_class_offset(lv, (cc260*), ABISELECT(16,8), "dd1260");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1260.d");
    test_class_info(&lv, &cd_dd1260);
    dp->~dd1260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1260(Test_dd1260, "dd1260", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1260C1Ev();
extern void _ZN6dd1260D1Ev();
Name_Map name_map_dd1260[] = {
  NSPAIR(_ZN6dd1260C1Ev),
  NSPAIR(_ZN6dd1260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd1260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1260[];
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_dd1260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV6dd1260[];
static  VTT_ENTRY vtt_dd1260[] = {
  {&(_ZTV6dd1260[3]),  3,9},
  {&(_ZTV6dd1260[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
Class_Descriptor cd_dd1260 = {  "dd1260", // class name
  bases_dd1260, 3,
  &(vtc_dd1260[0]), // expected_vtbl_contents
  &(vtt_dd1260[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1260),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1260),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  ee01260  : dd1260 {
  int e;
  ~ee01260(); // tgen
  ee01260(); // tgen
};
//SIG(1 ee01260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee01260 ::~ee01260(){ note_dtor("ee01260", this);} // tgen
ee01260 ::ee01260(){ note_ctor("ee01260", this);} // tgen

static void Test_ee01260()
{
  extern Class_Descriptor cd_ee01260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01260, buf);
    ee01260 *dp, &lv = *(dp=new (buf) ee01260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee01260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee01260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(16,12), "ee01260");
    check_base_class_offset(lv, (dd1260*), 0, "ee01260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01260.e");
    test_class_info(&lv, &cd_ee01260);
    dp->~ee01260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01260(Test_ee01260, "ee01260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01260C1Ev();
extern void _ZN7ee01260D1Ev();
Name_Map name_map_ee01260[] = {
  NSPAIR(_ZN7ee01260C1Ev),
  NSPAIR(_ZN7ee01260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee01260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01260[];
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee01260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01260[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee01260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee01260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee01260[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee01260[] = {
  {&(_ZTV7ee01260[3]),  3,9},
  {&(_tg__ZTV6dd1260__7ee01260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee01260[4]),  4,6},
  {&(_ZTV7ee01260[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01260[];
extern  VTBL_ENTRY _ZTV7ee01260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01260[];
Class_Descriptor cd_ee01260 = {  "ee01260", // class name
  bases_ee01260, 4,
  &(vtc_ee01260[0]), // expected_vtbl_contents
  &(vtt_ee01260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01260),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01260),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  ee11260  : virtual dd1260 {
  int e;
  ~ee11260(); // tgen
  ee11260(); // tgen
};
//SIG(1 ee11260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee11260 ::~ee11260(){ note_dtor("ee11260", this);} // tgen
ee11260 ::ee11260(){ note_ctor("ee11260", this);} // tgen

static void Test_ee11260()
{
  extern Class_Descriptor cd_ee11260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11260, buf);
    ee11260 *dp, &lv = *(dp=new (buf) ee11260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee11260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee11260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(32,16), "ee11260");
    check_base_class_offset(lv, (dd1260*), ABISELECT(16,8), "ee11260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11260.e");
    test_class_info(&lv, &cd_ee11260);
    dp->~ee11260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11260(Test_ee11260, "ee11260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11260C1Ev();
extern void _ZN7ee11260D1Ev();
Name_Map name_map_ee11260[] = {
  NSPAIR(_ZN7ee11260C1Ev),
  NSPAIR(_ZN7ee11260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee11260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11260[];
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee11260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11260[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11260[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee11260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee11260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee11260[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee11260[] = {
  {&(_ZTV7ee11260[4]),  4,13},
  {&(_ZTV7ee11260[7]),  7,13},
  {&(_ZTV7ee11260[11]),  11,13},
  {&(_tg__ZTV6dd1260__7ee11260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee11260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11260[];
extern  VTBL_ENTRY _ZTV7ee11260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11260[];
Class_Descriptor cd_ee11260 = {  "ee11260", // class name
  bases_ee11260, 4,
  &(vtc_ee11260[0]), // expected_vtbl_contents
  &(vtt_ee11260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11260),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11260),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  ee21260  : dd1260 {
  int e;
  virtual void  foo(); // _ZN7ee212603fooEv
  ~ee21260(); // tgen
  ee21260(); // tgen
};
//SIG(1 ee21260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee21260 ::foo(){vfunc_called(this, "_ZN7ee212603fooEv");}
ee21260 ::~ee21260(){ note_dtor("ee21260", this);} // tgen
ee21260 ::ee21260(){ note_ctor("ee21260", this);} // tgen

static void Test_ee21260()
{
  extern Class_Descriptor cd_ee21260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21260, buf);
    ee21260 *dp, &lv = *(dp=new (buf) ee21260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee21260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee21260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(16,12), "ee21260");
    check_base_class_offset(lv, (dd1260*), 0, "ee21260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21260.e");
    test_class_info(&lv, &cd_ee21260);
    dp->~ee21260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21260(Test_ee21260, "ee21260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21260C1Ev();
extern void _ZN7ee21260D1Ev();
Name_Map name_map_ee21260[] = {
  NSPAIR(_ZN7ee21260C1Ev),
  NSPAIR(_ZN7ee21260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee21260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21260[];
extern void _ZN7ee212603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee212603fooEv,_ZTv0_n16_N7ee212603fooEv)();
extern void ABISELECT(_ZThn16_N7ee212603fooEv,_ZThn12_N7ee212603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21260[0]),
  (VTBL_ENTRY)&_ZN7ee212603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee212603fooEv,_ZTv0_n16_N7ee212603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee21260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee21260[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee21260[] = {
  {&(_ZTV7ee21260[3]),  3,10},
  {&(_tg__ZTV6dd1260__7ee21260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee21260[4]),  4,6},
  {&(_ZTV7ee21260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21260[];
extern  VTBL_ENTRY _ZTV7ee21260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21260[];
static VTBL_ENTRY alt_thunk_names115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee212603fooEv,_ZTv0_n16_N7ee212603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee212603fooEv,_ZThn12_N7ee212603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21260 = {  "ee21260", // class name
  bases_ee21260, 4,
  &(vtc_ee21260[0]), // expected_vtbl_contents
  &(vtt_ee21260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names115,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31260  : virtual dd1260 {
  int e;
  virtual void  foo(); // _ZN7ee312603fooEv
  ~ee31260(); // tgen
  ee31260(); // tgen
};
//SIG(1 ee31260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee31260 ::foo(){vfunc_called(this, "_ZN7ee312603fooEv");}
ee31260 ::~ee31260(){ note_dtor("ee31260", this);} // tgen
ee31260 ::ee31260(){ note_ctor("ee31260", this);} // tgen

static void Test_ee31260()
{
  extern Class_Descriptor cd_ee31260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31260, buf);
    ee31260 *dp, &lv = *(dp=new (buf) ee31260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee31260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee31260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(32,16), "ee31260");
    check_base_class_offset(lv, (dd1260*), ABISELECT(16,8), "ee31260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31260.e");
    test_class_info(&lv, &cd_ee31260);
    dp->~ee31260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31260(Test_ee31260, "ee31260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31260C1Ev();
extern void _ZN7ee31260D1Ev();
Name_Map name_map_ee31260[] = {
  NSPAIR(_ZN7ee31260C1Ev),
  NSPAIR(_ZN7ee31260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee31260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31260[];
extern void _ZN7ee312603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee312603fooEv,_ZTv0_n16_N7ee312603fooEv)();
extern void ABISELECT(_ZThn32_N7ee312603fooEv,_ZThn16_N7ee312603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31260[0]),
  (VTBL_ENTRY)&_ZN7ee312603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31260[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee312603fooEv,_ZTv0_n16_N7ee312603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee31260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee31260[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee31260[] = {
  {&(_ZTV7ee31260[4]),  4,14},
  {&(_ZTV7ee31260[8]),  8,14},
  {&(_ZTV7ee31260[12]),  12,14},
  {&(_tg__ZTV6dd1260__7ee31260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee31260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31260[];
extern  VTBL_ENTRY _ZTV7ee31260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31260[];
static VTBL_ENTRY alt_thunk_names116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee312603fooEv,_ZTv0_n16_N7ee312603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee312603fooEv,_ZThn16_N7ee312603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31260 = {  "ee31260", // class name
  bases_ee31260, 4,
  &(vtc_ee31260[0]), // expected_vtbl_contents
  &(vtt_ee31260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31260),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names116,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41260  : dd1260 {
  int e;
  virtual void  bar(); // _ZN7ee412603barEv
  ~ee41260(); // tgen
  ee41260(); // tgen
};
//SIG(1 ee41260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee41260 ::bar(){vfunc_called(this, "_ZN7ee412603barEv");}
ee41260 ::~ee41260(){ note_dtor("ee41260", this);} // tgen
ee41260 ::ee41260(){ note_ctor("ee41260", this);} // tgen

static void Test_ee41260()
{
  extern Class_Descriptor cd_ee41260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41260, buf);
    ee41260 *dp, &lv = *(dp=new (buf) ee41260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee41260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee41260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(16,12), "ee41260");
    check_base_class_offset(lv, (dd1260*), 0, "ee41260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41260.e");
    test_class_info(&lv, &cd_ee41260);
    dp->~ee41260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41260(Test_ee41260, "ee41260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41260C1Ev();
extern void _ZN7ee41260D1Ev();
Name_Map name_map_ee41260[] = {
  NSPAIR(_ZN7ee41260C1Ev),
  NSPAIR(_ZN7ee41260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee41260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41260[];
extern void _ZN7ee412603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee412603barEv,_ZTv0_n12_N7ee412603barEv)();
extern void ABISELECT(_ZThn16_N7ee412603barEv,_ZThn12_N7ee412603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee41260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41260[0]),
  (VTBL_ENTRY)&_ZN7ee412603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee412603barEv,_ZTv0_n12_N7ee412603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee41260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee41260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee41260[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee41260[] = {
  {&(_ZTV7ee41260[3]),  3,10},
  {&(_tg__ZTV6dd1260__7ee41260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee41260[4]),  4,6},
  {&(_ZTV7ee41260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41260[];
extern  VTBL_ENTRY _ZTV7ee41260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41260[];
static VTBL_ENTRY alt_thunk_names117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee412603barEv,_ZTv0_n12_N7ee412603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee412603barEv,_ZThn12_N7ee412603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41260 = {  "ee41260", // class name
  bases_ee41260, 4,
  &(vtc_ee41260[0]), // expected_vtbl_contents
  &(vtt_ee41260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names117,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51260  : virtual dd1260 {
  int e;
  virtual void  bar(); // _ZN7ee512603barEv
  ~ee51260(); // tgen
  ee51260(); // tgen
};
//SIG(1 ee51260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee51260 ::bar(){vfunc_called(this, "_ZN7ee512603barEv");}
ee51260 ::~ee51260(){ note_dtor("ee51260", this);} // tgen
ee51260 ::ee51260(){ note_ctor("ee51260", this);} // tgen

static void Test_ee51260()
{
  extern Class_Descriptor cd_ee51260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51260, buf);
    ee51260 *dp, &lv = *(dp=new (buf) ee51260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee51260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee51260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(32,16), "ee51260");
    check_base_class_offset(lv, (dd1260*), ABISELECT(16,8), "ee51260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51260.e");
    test_class_info(&lv, &cd_ee51260);
    dp->~ee51260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51260(Test_ee51260, "ee51260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51260C1Ev();
extern void _ZN7ee51260D1Ev();
Name_Map name_map_ee51260[] = {
  NSPAIR(_ZN7ee51260C1Ev),
  NSPAIR(_ZN7ee51260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee51260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51260[];
extern void _ZN7ee512603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee512603barEv,_ZTv0_n12_N7ee512603barEv)();
extern void ABISELECT(_ZThn32_N7ee512603barEv,_ZThn16_N7ee512603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee51260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51260[0]),
  (VTBL_ENTRY)&_ZN7ee512603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51260[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee512603barEv,_ZTv0_n12_N7ee512603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee51260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee51260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee51260[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee51260[] = {
  {&(_ZTV7ee51260[4]),  4,14},
  {&(_ZTV7ee51260[8]),  8,14},
  {&(_ZTV7ee51260[12]),  12,14},
  {&(_tg__ZTV6dd1260__7ee51260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee51260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51260[];
extern  VTBL_ENTRY _ZTV7ee51260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51260[];
static VTBL_ENTRY alt_thunk_names118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee512603barEv,_ZTv0_n12_N7ee512603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee512603barEv,_ZThn16_N7ee512603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51260 = {  "ee51260", // class name
  bases_ee51260, 4,
  &(vtc_ee51260[0]), // expected_vtbl_contents
  &(vtt_ee51260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51260),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names118,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61260  : dd1260 {
  int e;
  virtual void  foo(); // _ZN7ee612603fooEv
  virtual void  bar(); // _ZN7ee612603barEv
  ~ee61260(); // tgen
  ee61260(); // tgen
};
//SIG(1 ee61260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee61260 ::foo(){vfunc_called(this, "_ZN7ee612603fooEv");}
void  ee61260 ::bar(){vfunc_called(this, "_ZN7ee612603barEv");}
ee61260 ::~ee61260(){ note_dtor("ee61260", this);} // tgen
ee61260 ::ee61260(){ note_ctor("ee61260", this);} // tgen

static void Test_ee61260()
{
  extern Class_Descriptor cd_ee61260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61260, buf);
    ee61260 *dp, &lv = *(dp=new (buf) ee61260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee61260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee61260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(16,12), "ee61260");
    check_base_class_offset(lv, (dd1260*), 0, "ee61260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61260.e");
    test_class_info(&lv, &cd_ee61260);
    dp->~ee61260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61260(Test_ee61260, "ee61260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61260C1Ev();
extern void _ZN7ee61260D1Ev();
Name_Map name_map_ee61260[] = {
  NSPAIR(_ZN7ee61260C1Ev),
  NSPAIR(_ZN7ee61260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee61260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61260[];
extern void _ZN7ee612603fooEv();
extern void _ZN7ee612603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee612603barEv,_ZTv0_n12_N7ee612603barEv)();
extern void ABISELECT(_ZThn16_N7ee612603barEv,_ZThn12_N7ee612603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee612603fooEv,_ZTv0_n16_N7ee612603fooEv)();
extern void ABISELECT(_ZThn16_N7ee612603fooEv,_ZThn12_N7ee612603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61260[0]),
  (VTBL_ENTRY)&_ZN7ee612603fooEv,
  (VTBL_ENTRY)&_ZN7ee612603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee612603barEv,_ZTv0_n12_N7ee612603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee612603fooEv,_ZTv0_n16_N7ee612603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee61260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee61260[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee61260[] = {
  {&(_ZTV7ee61260[3]),  3,11},
  {&(_tg__ZTV6dd1260__7ee61260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee61260[4]),  4,6},
  {&(_ZTV7ee61260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61260[];
extern  VTBL_ENTRY _ZTV7ee61260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61260[];
static VTBL_ENTRY alt_thunk_names119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee612603fooEv,_ZTv0_n16_N7ee612603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee612603fooEv,_ZThn12_N7ee612603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee612603barEv,_ZTv0_n12_N7ee612603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee612603barEv,_ZThn12_N7ee612603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61260 = {  "ee61260", // class name
  bases_ee61260, 4,
  &(vtc_ee61260[0]), // expected_vtbl_contents
  &(vtt_ee61260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names119,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71260  : virtual dd1260 {
  int e;
  virtual void  foo(); // _ZN7ee712603fooEv
  virtual void  bar(); // _ZN7ee712603barEv
  ~ee71260(); // tgen
  ee71260(); // tgen
};
//SIG(1 ee71260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee71260 ::foo(){vfunc_called(this, "_ZN7ee712603fooEv");}
void  ee71260 ::bar(){vfunc_called(this, "_ZN7ee712603barEv");}
ee71260 ::~ee71260(){ note_dtor("ee71260", this);} // tgen
ee71260 ::ee71260(){ note_ctor("ee71260", this);} // tgen

static void Test_ee71260()
{
  extern Class_Descriptor cd_ee71260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71260, buf);
    ee71260 *dp, &lv = *(dp=new (buf) ee71260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee71260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee71260");
    check_base_class_offset(lv, (cc260*)(dd1260*), ABISELECT(32,16), "ee71260");
    check_base_class_offset(lv, (dd1260*), ABISELECT(16,8), "ee71260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71260.e");
    test_class_info(&lv, &cd_ee71260);
    dp->~ee71260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71260(Test_ee71260, "ee71260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71260C1Ev();
extern void _ZN7ee71260D1Ev();
Name_Map name_map_ee71260[] = {
  NSPAIR(_ZN7ee71260C1Ev),
  NSPAIR(_ZN7ee71260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd1260;
extern VTBL_ENTRY _ZTI6dd1260[];
extern  VTBL_ENTRY _ZTV6dd1260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1260[];
static Base_Class bases_ee71260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1260,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71260[];
extern void _ZN7ee712603fooEv();
extern void _ZN7ee712603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee712603barEv,_ZTv0_n12_N7ee712603barEv)();
extern void ABISELECT(_ZThn32_N7ee712603barEv,_ZThn16_N7ee712603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee712603fooEv,_ZTv0_n16_N7ee712603fooEv)();
extern void ABISELECT(_ZThn32_N7ee712603fooEv,_ZThn16_N7ee712603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71260[0]),
  (VTBL_ENTRY)&_ZN7ee712603fooEv,
  (VTBL_ENTRY)&_ZN7ee712603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71260[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee712603barEv,_ZTv0_n12_N7ee712603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee712603fooEv,_ZTv0_n16_N7ee712603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71260[];
static  VTBL_ENTRY _tg__ZTV6dd1260__7ee71260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
};
extern void _ZN4bb603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd1260__7ee71260[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee71260[] = {
  {&(_ZTV7ee71260[4]),  4,15},
  {&(_ZTV7ee71260[9]),  9,15},
  {&(_ZTV7ee71260[13]),  13,15},
  {&(_tg__ZTV6dd1260__7ee71260[3]),  3,3},
  {&(_tg__ZTV5cc260__6dd1260__7ee71260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71260[];
extern  VTBL_ENTRY _ZTV7ee71260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71260[];
static VTBL_ENTRY alt_thunk_names120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee712603fooEv,_ZTv0_n16_N7ee712603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee712603fooEv,_ZThn16_N7ee712603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee712603barEv,_ZTv0_n12_N7ee712603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee712603barEv,_ZThn16_N7ee712603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71260 = {  "ee71260", // class name
  bases_ee71260, 4,
  &(vtc_ee71260[0]), // expected_vtbl_contents
  &(vtt_ee71260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71260),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names120,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2260  : cc260 {
  int d;
  virtual void  foo(); // _ZN6dd22603fooEv
  ~dd2260(); // tgen
  dd2260(); // tgen
};
//SIG(-1 dd2260) C1{ BC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd2260 ::foo(){vfunc_called(this, "_ZN6dd22603fooEv");}
dd2260 ::~dd2260(){ note_dtor("dd2260", this);} // tgen
dd2260 ::dd2260(){ note_ctor("dd2260", this);} // tgen

static void Test_dd2260()
{
  extern Class_Descriptor cd_dd2260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2260, buf);
    dd2260 *dp, &lv = *(dp=new (buf) dd2260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(8,4), "dd2260");
    check_base_class_offset(lv, (bb60*)(cc260*), 0, "dd2260");
    check_base_class_offset(lv, (cc260*), 0, "dd2260");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2260.d");
    test_class_info(&lv, &cd_dd2260);
    dp->~dd2260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2260(Test_dd2260, "dd2260", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2260C1Ev();
extern void _ZN6dd2260D1Ev();
Name_Map name_map_dd2260[] = {
  NSPAIR(_ZN6dd2260C1Ev),
  NSPAIR(_ZN6dd2260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd2260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd2260[];
extern void _ZN4bb603barEv();
extern void _ZN6dd22603fooEv();
static  VTBL_ENTRY vtc_dd2260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN6dd22603fooEv,
};
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
Class_Descriptor cd_dd2260 = {  "dd2260", // class name
  bases_dd2260, 3,
  &(vtc_dd2260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2260),4, //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  ee02260  : dd2260 {
  int e;
  ~ee02260(); // tgen
  ee02260(); // tgen
};
//SIG(1 ee02260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee02260 ::~ee02260(){ note_dtor("ee02260", this);} // tgen
ee02260 ::ee02260(){ note_ctor("ee02260", this);} // tgen

static void Test_ee02260()
{
  extern Class_Descriptor cd_ee02260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02260, buf);
    ee02260 *dp, &lv = *(dp=new (buf) ee02260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(8,4), "ee02260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), 0, "ee02260");
    check_base_class_offset(lv, (cc260*)(dd2260*), 0, "ee02260");
    check_base_class_offset(lv, (dd2260*), 0, "ee02260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02260.e");
    test_class_info(&lv, &cd_ee02260);
    dp->~ee02260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02260(Test_ee02260, "ee02260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02260C1Ev();
extern void _ZN7ee02260D1Ev();
Name_Map name_map_ee02260[] = {
  NSPAIR(_ZN7ee02260C1Ev),
  NSPAIR(_ZN7ee02260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee02260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02260[];
extern void _ZN4bb603barEv();
extern void _ZN6dd22603fooEv();
static  VTBL_ENTRY vtc_ee02260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN6dd22603fooEv,
};
extern VTBL_ENTRY _ZTI7ee02260[];
extern  VTBL_ENTRY _ZTV7ee02260[];
Class_Descriptor cd_ee02260 = {  "ee02260", // class name
  bases_ee02260, 4,
  &(vtc_ee02260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02260),4, //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  ee12260  : virtual dd2260 {
  int e;
  ~ee12260(); // tgen
  ee12260(); // tgen
};
//SIG(1 ee12260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee12260 ::~ee12260(){ note_dtor("ee12260", this);} // tgen
ee12260 ::ee12260(){ note_ctor("ee12260", this);} // tgen

static void Test_ee12260()
{
  extern Class_Descriptor cd_ee12260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12260, buf);
    ee12260 *dp, &lv = *(dp=new (buf) ee12260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(24,12), "ee12260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), ABISELECT(16,8), "ee12260");
    check_base_class_offset(lv, (cc260*)(dd2260*), ABISELECT(16,8), "ee12260");
    check_base_class_offset(lv, (dd2260*), ABISELECT(16,8), "ee12260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12260.e");
    test_class_info(&lv, &cd_ee12260);
    dp->~ee12260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12260(Test_ee12260, "ee12260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12260C1Ev();
extern void _ZN7ee12260D1Ev();
Name_Map name_map_ee12260[] = {
  NSPAIR(_ZN7ee12260C1Ev),
  NSPAIR(_ZN7ee12260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee12260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12260[];
extern void _ZN4bb603barEv();
extern void _ZN6dd22603fooEv();
static  VTBL_ENTRY vtc_ee12260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12260[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN6dd22603fooEv,
};
extern VTBL_ENTRY _ZTV7ee12260[];
static  VTT_ENTRY vtt_ee12260[] = {
  {&(_ZTV7ee12260[3]),  3,9},
  {&(_ZTV7ee12260[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12260[];
extern  VTBL_ENTRY _ZTV7ee12260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12260[];
Class_Descriptor cd_ee12260 = {  "ee12260", // class name
  bases_ee12260, 4,
  &(vtc_ee12260[0]), // expected_vtbl_contents
  &(vtt_ee12260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12260),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12260),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  ee22260  : dd2260 {
  int e;
  virtual void  foo(); // _ZN7ee222603fooEv
  ~ee22260(); // tgen
  ee22260(); // tgen
};
//SIG(1 ee22260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee22260 ::foo(){vfunc_called(this, "_ZN7ee222603fooEv");}
ee22260 ::~ee22260(){ note_dtor("ee22260", this);} // tgen
ee22260 ::ee22260(){ note_ctor("ee22260", this);} // tgen

static void Test_ee22260()
{
  extern Class_Descriptor cd_ee22260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22260, buf);
    ee22260 *dp, &lv = *(dp=new (buf) ee22260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(8,4), "ee22260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), 0, "ee22260");
    check_base_class_offset(lv, (cc260*)(dd2260*), 0, "ee22260");
    check_base_class_offset(lv, (dd2260*), 0, "ee22260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22260.e");
    test_class_info(&lv, &cd_ee22260);
    dp->~ee22260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22260(Test_ee22260, "ee22260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22260C1Ev();
extern void _ZN7ee22260D1Ev();
Name_Map name_map_ee22260[] = {
  NSPAIR(_ZN7ee22260C1Ev),
  NSPAIR(_ZN7ee22260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee22260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee22260[];
extern void _ZN4bb603barEv();
extern void _ZN7ee222603fooEv();
static  VTBL_ENTRY vtc_ee22260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&_ZN7ee222603fooEv,
};
extern VTBL_ENTRY _ZTI7ee22260[];
extern  VTBL_ENTRY _ZTV7ee22260[];
Class_Descriptor cd_ee22260 = {  "ee22260", // class name
  bases_ee22260, 4,
  &(vtc_ee22260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22260),4, //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  ee32260  : virtual dd2260 {
  int e;
  virtual void  foo(); // _ZN7ee322603fooEv
  ~ee32260(); // tgen
  ee32260(); // tgen
};
//SIG(1 ee32260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee32260 ::foo(){vfunc_called(this, "_ZN7ee322603fooEv");}
ee32260 ::~ee32260(){ note_dtor("ee32260", this);} // tgen
ee32260 ::ee32260(){ note_ctor("ee32260", this);} // tgen

static void Test_ee32260()
{
  extern Class_Descriptor cd_ee32260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32260, buf);
    ee32260 *dp, &lv = *(dp=new (buf) ee32260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(24,12), "ee32260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), ABISELECT(16,8), "ee32260");
    check_base_class_offset(lv, (cc260*)(dd2260*), ABISELECT(16,8), "ee32260");
    check_base_class_offset(lv, (dd2260*), ABISELECT(16,8), "ee32260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32260.e");
    test_class_info(&lv, &cd_ee32260);
    dp->~ee32260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32260(Test_ee32260, "ee32260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32260C1Ev();
extern void _ZN7ee32260D1Ev();
Name_Map name_map_ee32260[] = {
  NSPAIR(_ZN7ee32260C1Ev),
  NSPAIR(_ZN7ee32260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee32260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32260[];
extern void _ZN7ee322603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee322603fooEv,_ZTv0_n16_N7ee322603fooEv)();
extern void ABISELECT(_ZThn16_N7ee322603fooEv,_ZThn8_N7ee322603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32260[0]),
  (VTBL_ENTRY)&_ZN7ee322603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee322603fooEv,_ZTv0_n16_N7ee322603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32260[];
static  VTT_ENTRY vtt_ee32260[] = {
  {&(_ZTV7ee32260[3]),  3,10},
  {&(_ZTV7ee32260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32260[];
extern  VTBL_ENTRY _ZTV7ee32260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32260[];
static VTBL_ENTRY alt_thunk_names121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee322603fooEv,_ZTv0_n16_N7ee322603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee322603fooEv,_ZThn8_N7ee322603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32260 = {  "ee32260", // class name
  bases_ee32260, 4,
  &(vtc_ee32260[0]), // expected_vtbl_contents
  &(vtt_ee32260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32260),2, //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  ee42260  : dd2260 {
  int e;
  virtual void  bar(); // _ZN7ee422603barEv
  ~ee42260(); // tgen
  ee42260(); // tgen
};
//SIG(1 ee42260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee42260 ::bar(){vfunc_called(this, "_ZN7ee422603barEv");}
ee42260 ::~ee42260(){ note_dtor("ee42260", this);} // tgen
ee42260 ::ee42260(){ note_ctor("ee42260", this);} // tgen

static void Test_ee42260()
{
  extern Class_Descriptor cd_ee42260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42260, buf);
    ee42260 *dp, &lv = *(dp=new (buf) ee42260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(8,4), "ee42260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), 0, "ee42260");
    check_base_class_offset(lv, (cc260*)(dd2260*), 0, "ee42260");
    check_base_class_offset(lv, (dd2260*), 0, "ee42260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42260.e");
    test_class_info(&lv, &cd_ee42260);
    dp->~ee42260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42260(Test_ee42260, "ee42260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42260C1Ev();
extern void _ZN7ee42260D1Ev();
Name_Map name_map_ee42260[] = {
  NSPAIR(_ZN7ee42260C1Ev),
  NSPAIR(_ZN7ee42260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee42260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee42260[];
extern void _ZN7ee422603barEv();
extern void _ZN6dd22603fooEv();
static  VTBL_ENTRY vtc_ee42260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42260[0]),
  (VTBL_ENTRY)&_ZN7ee422603barEv,
  (VTBL_ENTRY)&_ZN6dd22603fooEv,
};
extern VTBL_ENTRY _ZTI7ee42260[];
extern  VTBL_ENTRY _ZTV7ee42260[];
Class_Descriptor cd_ee42260 = {  "ee42260", // class name
  bases_ee42260, 4,
  &(vtc_ee42260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42260),4, //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  ee52260  : virtual dd2260 {
  int e;
  virtual void  bar(); // _ZN7ee522603barEv
  ~ee52260(); // tgen
  ee52260(); // tgen
};
//SIG(1 ee52260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee52260 ::bar(){vfunc_called(this, "_ZN7ee522603barEv");}
ee52260 ::~ee52260(){ note_dtor("ee52260", this);} // tgen
ee52260 ::ee52260(){ note_ctor("ee52260", this);} // tgen

static void Test_ee52260()
{
  extern Class_Descriptor cd_ee52260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52260, buf);
    ee52260 *dp, &lv = *(dp=new (buf) ee52260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(24,12), "ee52260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), ABISELECT(16,8), "ee52260");
    check_base_class_offset(lv, (cc260*)(dd2260*), ABISELECT(16,8), "ee52260");
    check_base_class_offset(lv, (dd2260*), ABISELECT(16,8), "ee52260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52260.e");
    test_class_info(&lv, &cd_ee52260);
    dp->~ee52260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52260(Test_ee52260, "ee52260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52260C1Ev();
extern void _ZN7ee52260D1Ev();
Name_Map name_map_ee52260[] = {
  NSPAIR(_ZN7ee52260C1Ev),
  NSPAIR(_ZN7ee52260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee52260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52260[];
extern void _ZN7ee522603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee522603barEv,_ZTv0_n12_N7ee522603barEv)();
extern void ABISELECT(_ZThn16_N7ee522603barEv,_ZThn8_N7ee522603barEv)() __attribute__((weak));
extern void _ZN6dd22603fooEv();
static  VTBL_ENTRY vtc_ee52260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52260[0]),
  (VTBL_ENTRY)&_ZN7ee522603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee522603barEv,_ZTv0_n12_N7ee522603barEv),
  (VTBL_ENTRY)&_ZN6dd22603fooEv,
};
extern VTBL_ENTRY _ZTV7ee52260[];
static  VTT_ENTRY vtt_ee52260[] = {
  {&(_ZTV7ee52260[3]),  3,10},
  {&(_ZTV7ee52260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52260[];
extern  VTBL_ENTRY _ZTV7ee52260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52260[];
static VTBL_ENTRY alt_thunk_names122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee522603barEv,_ZTv0_n12_N7ee522603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee522603barEv,_ZThn8_N7ee522603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52260 = {  "ee52260", // class name
  bases_ee52260, 4,
  &(vtc_ee52260[0]), // expected_vtbl_contents
  &(vtt_ee52260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52260),2, //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  ee62260  : dd2260 {
  int e;
  virtual void  foo(); // _ZN7ee622603fooEv
  virtual void  bar(); // _ZN7ee622603barEv
  ~ee62260(); // tgen
  ee62260(); // tgen
};
//SIG(1 ee62260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee62260 ::foo(){vfunc_called(this, "_ZN7ee622603fooEv");}
void  ee62260 ::bar(){vfunc_called(this, "_ZN7ee622603barEv");}
ee62260 ::~ee62260(){ note_dtor("ee62260", this);} // tgen
ee62260 ::ee62260(){ note_ctor("ee62260", this);} // tgen

static void Test_ee62260()
{
  extern Class_Descriptor cd_ee62260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62260, buf);
    ee62260 *dp, &lv = *(dp=new (buf) ee62260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(8,4), "ee62260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), 0, "ee62260");
    check_base_class_offset(lv, (cc260*)(dd2260*), 0, "ee62260");
    check_base_class_offset(lv, (dd2260*), 0, "ee62260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62260.e");
    test_class_info(&lv, &cd_ee62260);
    dp->~ee62260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62260(Test_ee62260, "ee62260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62260C1Ev();
extern void _ZN7ee62260D1Ev();
Name_Map name_map_ee62260[] = {
  NSPAIR(_ZN7ee62260C1Ev),
  NSPAIR(_ZN7ee62260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee62260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee62260[];
extern void _ZN7ee622603barEv();
extern void _ZN7ee622603fooEv();
static  VTBL_ENTRY vtc_ee62260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62260[0]),
  (VTBL_ENTRY)&_ZN7ee622603barEv,
  (VTBL_ENTRY)&_ZN7ee622603fooEv,
};
extern VTBL_ENTRY _ZTI7ee62260[];
extern  VTBL_ENTRY _ZTV7ee62260[];
Class_Descriptor cd_ee62260 = {  "ee62260", // class name
  bases_ee62260, 4,
  &(vtc_ee62260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62260),4, //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  ee72260  : virtual dd2260 {
  int e;
  virtual void  foo(); // _ZN7ee722603fooEv
  virtual void  bar(); // _ZN7ee722603barEv
  ~ee72260(); // tgen
  ee72260(); // tgen
};
//SIG(1 ee72260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee72260 ::foo(){vfunc_called(this, "_ZN7ee722603fooEv");}
void  ee72260 ::bar(){vfunc_called(this, "_ZN7ee722603barEv");}
ee72260 ::~ee72260(){ note_dtor("ee72260", this);} // tgen
ee72260 ::ee72260(){ note_ctor("ee72260", this);} // tgen

static void Test_ee72260()
{
  extern Class_Descriptor cd_ee72260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72260, buf);
    ee72260 *dp, &lv = *(dp=new (buf) ee72260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd2260*), ABISELECT(24,12), "ee72260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd2260*), ABISELECT(16,8), "ee72260");
    check_base_class_offset(lv, (cc260*)(dd2260*), ABISELECT(16,8), "ee72260");
    check_base_class_offset(lv, (dd2260*), ABISELECT(16,8), "ee72260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72260.e");
    test_class_info(&lv, &cd_ee72260);
    dp->~ee72260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72260(Test_ee72260, "ee72260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72260C1Ev();
extern void _ZN7ee72260D1Ev();
Name_Map name_map_ee72260[] = {
  NSPAIR(_ZN7ee72260C1Ev),
  NSPAIR(_ZN7ee72260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd2260;
extern VTBL_ENTRY _ZTI6dd2260[];
extern  VTBL_ENTRY _ZTV6dd2260[];
static Base_Class bases_ee72260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2260,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72260[];
extern void _ZN7ee722603fooEv();
extern void _ZN7ee722603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee722603barEv,_ZTv0_n12_N7ee722603barEv)();
extern void ABISELECT(_ZThn16_N7ee722603barEv,_ZThn8_N7ee722603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee722603fooEv,_ZTv0_n16_N7ee722603fooEv)();
extern void ABISELECT(_ZThn16_N7ee722603fooEv,_ZThn8_N7ee722603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72260[0]),
  (VTBL_ENTRY)&_ZN7ee722603fooEv,
  (VTBL_ENTRY)&_ZN7ee722603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee722603barEv,_ZTv0_n12_N7ee722603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee722603fooEv,_ZTv0_n16_N7ee722603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72260[];
static  VTT_ENTRY vtt_ee72260[] = {
  {&(_ZTV7ee72260[3]),  3,11},
  {&(_ZTV7ee72260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72260[];
extern  VTBL_ENTRY _ZTV7ee72260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72260[];
static VTBL_ENTRY alt_thunk_names123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee722603fooEv,_ZTv0_n16_N7ee722603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee722603fooEv,_ZThn8_N7ee722603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee722603barEv,_ZTv0_n12_N7ee722603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee722603barEv,_ZThn8_N7ee722603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72260 = {  "ee72260", // class name
  bases_ee72260, 4,
  &(vtc_ee72260[0]), // expected_vtbl_contents
  &(vtt_ee72260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72260),2, //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  dd3260  : virtual cc260 {
  int d;
  virtual void  foo(); // _ZN6dd32603fooEv
  ~dd3260(); // tgen
  dd3260(); // tgen
};
//SIG(-1 dd3260) C1{ VBC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd3260 ::foo(){vfunc_called(this, "_ZN6dd32603fooEv");}
dd3260 ::~dd3260(){ note_dtor("dd3260", this);} // tgen
dd3260 ::dd3260(){ note_ctor("dd3260", this);} // tgen

static void Test_dd3260()
{
  extern Class_Descriptor cd_dd3260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3260, buf);
    dd3260 *dp, &lv = *(dp=new (buf) dd3260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,12), "dd3260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,8), "dd3260");
    check_base_class_offset(lv, (cc260*), ABISELECT(16,8), "dd3260");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3260.d");
    test_class_info(&lv, &cd_dd3260);
    dp->~dd3260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3260(Test_dd3260, "dd3260", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3260C1Ev();
extern void _ZN6dd3260D1Ev();
Name_Map name_map_dd3260[] = {
  NSPAIR(_ZN6dd3260C1Ev),
  NSPAIR(_ZN6dd3260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd3260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3260[];
extern void _ZN6dd32603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3260[];
static  VTT_ENTRY vtt_dd3260[] = {
  {&(_ZTV6dd3260[3]),  3,10},
  {&(_ZTV6dd3260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static VTBL_ENTRY alt_thunk_names124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3260 = {  "dd3260", // class name
  bases_dd3260, 3,
  &(vtc_dd3260[0]), // expected_vtbl_contents
  &(vtt_dd3260[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3260),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names124,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03260  : dd3260 {
  int e;
  ~ee03260(); // tgen
  ee03260(); // tgen
};
//SIG(1 ee03260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee03260 ::~ee03260(){ note_dtor("ee03260", this);} // tgen
ee03260 ::ee03260(){ note_ctor("ee03260", this);} // tgen

static void Test_ee03260()
{
  extern Class_Descriptor cd_ee03260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03260, buf);
    ee03260 *dp, &lv = *(dp=new (buf) ee03260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee03260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee03260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(16,12), "ee03260");
    check_base_class_offset(lv, (dd3260*), 0, "ee03260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03260.e");
    test_class_info(&lv, &cd_ee03260);
    dp->~ee03260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03260(Test_ee03260, "ee03260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03260C1Ev();
extern void _ZN7ee03260D1Ev();
Name_Map name_map_ee03260[] = {
  NSPAIR(_ZN7ee03260C1Ev),
  NSPAIR(_ZN7ee03260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee03260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03260[];
extern void _ZN6dd32603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee03260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee03260[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee03260[] = {
  {&(_ZTV7ee03260[3]),  3,10},
  {&(_tg__ZTV6dd3260__7ee03260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee03260[4]),  4,6},
  {&(_ZTV7ee03260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03260[];
extern  VTBL_ENTRY _ZTV7ee03260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03260[];
static VTBL_ENTRY alt_thunk_names125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03260 = {  "ee03260", // class name
  bases_ee03260, 4,
  &(vtc_ee03260[0]), // expected_vtbl_contents
  &(vtt_ee03260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03260),4, //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  ee13260  : virtual dd3260 {
  int e;
  ~ee13260(); // tgen
  ee13260(); // tgen
};
//SIG(1 ee13260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee13260 ::~ee13260(){ note_dtor("ee13260", this);} // tgen
ee13260 ::ee13260(){ note_ctor("ee13260", this);} // tgen

static void Test_ee13260()
{
  extern Class_Descriptor cd_ee13260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13260, buf);
    ee13260 *dp, &lv = *(dp=new (buf) ee13260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee13260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee13260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(32,16), "ee13260");
    check_base_class_offset(lv, (dd3260*), ABISELECT(16,8), "ee13260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13260.e");
    test_class_info(&lv, &cd_ee13260);
    dp->~ee13260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13260(Test_ee13260, "ee13260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13260C1Ev();
extern void _ZN7ee13260D1Ev();
Name_Map name_map_ee13260[] = {
  NSPAIR(_ZN7ee13260C1Ev),
  NSPAIR(_ZN7ee13260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee13260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13260[];
extern void _ZN6dd32603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13260[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee13260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee13260[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee13260[] = {
  {&(_ZTV7ee13260[4]),  4,15},
  {&(_ZTV7ee13260[8]),  8,15},
  {&(_ZTV7ee13260[13]),  13,15},
  {&(_tg__ZTV6dd3260__7ee13260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee13260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13260[];
extern  VTBL_ENTRY _ZTV7ee13260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13260[];
static VTBL_ENTRY alt_thunk_names126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13260 = {  "ee13260", // class name
  bases_ee13260, 4,
  &(vtc_ee13260[0]), // expected_vtbl_contents
  &(vtt_ee13260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13260),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names126,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23260  : dd3260 {
  int e;
  virtual void  foo(); // _ZN7ee232603fooEv
  ~ee23260(); // tgen
  ee23260(); // tgen
};
//SIG(1 ee23260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee23260 ::foo(){vfunc_called(this, "_ZN7ee232603fooEv");}
ee23260 ::~ee23260(){ note_dtor("ee23260", this);} // tgen
ee23260 ::ee23260(){ note_ctor("ee23260", this);} // tgen

static void Test_ee23260()
{
  extern Class_Descriptor cd_ee23260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23260, buf);
    ee23260 *dp, &lv = *(dp=new (buf) ee23260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee23260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee23260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(16,12), "ee23260");
    check_base_class_offset(lv, (dd3260*), 0, "ee23260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23260.e");
    test_class_info(&lv, &cd_ee23260);
    dp->~ee23260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23260(Test_ee23260, "ee23260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23260C1Ev();
extern void _ZN7ee23260D1Ev();
Name_Map name_map_ee23260[] = {
  NSPAIR(_ZN7ee23260C1Ev),
  NSPAIR(_ZN7ee23260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee23260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23260[];
extern void _ZN7ee232603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee232603fooEv,_ZTv0_n16_N7ee232603fooEv)();
extern void ABISELECT(_ZThn16_N7ee232603fooEv,_ZThn12_N7ee232603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23260[0]),
  (VTBL_ENTRY)&_ZN7ee232603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee232603fooEv,_ZTv0_n16_N7ee232603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee23260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee23260[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee23260[] = {
  {&(_ZTV7ee23260[3]),  3,10},
  {&(_tg__ZTV6dd3260__7ee23260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee23260[4]),  4,6},
  {&(_ZTV7ee23260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23260[];
extern  VTBL_ENTRY _ZTV7ee23260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23260[];
static VTBL_ENTRY alt_thunk_names127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee232603fooEv,_ZTv0_n16_N7ee232603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee232603fooEv,_ZThn12_N7ee232603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23260 = {  "ee23260", // class name
  bases_ee23260, 4,
  &(vtc_ee23260[0]), // expected_vtbl_contents
  &(vtt_ee23260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names127,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33260  : virtual dd3260 {
  int e;
  virtual void  foo(); // _ZN7ee332603fooEv
  ~ee33260(); // tgen
  ee33260(); // tgen
};
//SIG(1 ee33260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee33260 ::foo(){vfunc_called(this, "_ZN7ee332603fooEv");}
ee33260 ::~ee33260(){ note_dtor("ee33260", this);} // tgen
ee33260 ::ee33260(){ note_ctor("ee33260", this);} // tgen

static void Test_ee33260()
{
  extern Class_Descriptor cd_ee33260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33260, buf);
    ee33260 *dp, &lv = *(dp=new (buf) ee33260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee33260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee33260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(32,16), "ee33260");
    check_base_class_offset(lv, (dd3260*), ABISELECT(16,8), "ee33260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33260.e");
    test_class_info(&lv, &cd_ee33260);
    dp->~ee33260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33260(Test_ee33260, "ee33260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33260C1Ev();
extern void _ZN7ee33260D1Ev();
Name_Map name_map_ee33260[] = {
  NSPAIR(_ZN7ee33260C1Ev),
  NSPAIR(_ZN7ee33260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee33260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33260[];
extern void _ZN7ee332603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee332603fooEv,_ZTv0_n16_N7ee332603fooEv)();
extern void ABISELECT(_ZThn16_N7ee332603fooEv,_ZThn8_N7ee332603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee332603fooEv,_ZTv0_n16_N7ee332603fooEv)();
extern void ABISELECT(_ZThn32_N7ee332603fooEv,_ZThn16_N7ee332603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33260[0]),
  (VTBL_ENTRY)&_ZN7ee332603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee332603fooEv,_ZTv0_n16_N7ee332603fooEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee332603fooEv,_ZTv0_n16_N7ee332603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee33260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee33260[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee33260[] = {
  {&(_ZTV7ee33260[4]),  4,16},
  {&(_ZTV7ee33260[9]),  9,16},
  {&(_ZTV7ee33260[14]),  14,16},
  {&(_tg__ZTV6dd3260__7ee33260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee33260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33260[];
extern  VTBL_ENTRY _ZTV7ee33260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33260[];
static VTBL_ENTRY alt_thunk_names128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee332603fooEv,_ZTv0_n16_N7ee332603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee332603fooEv,_ZThn16_N7ee332603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee332603fooEv,_ZThn8_N7ee332603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33260 = {  "ee33260", // class name
  bases_ee33260, 4,
  &(vtc_ee33260[0]), // expected_vtbl_contents
  &(vtt_ee33260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33260),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names128,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43260  : dd3260 {
  int e;
  virtual void  bar(); // _ZN7ee432603barEv
  ~ee43260(); // tgen
  ee43260(); // tgen
};
//SIG(1 ee43260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee43260 ::bar(){vfunc_called(this, "_ZN7ee432603barEv");}
ee43260 ::~ee43260(){ note_dtor("ee43260", this);} // tgen
ee43260 ::ee43260(){ note_ctor("ee43260", this);} // tgen

static void Test_ee43260()
{
  extern Class_Descriptor cd_ee43260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43260, buf);
    ee43260 *dp, &lv = *(dp=new (buf) ee43260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee43260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee43260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(16,12), "ee43260");
    check_base_class_offset(lv, (dd3260*), 0, "ee43260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43260.e");
    test_class_info(&lv, &cd_ee43260);
    dp->~ee43260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43260(Test_ee43260, "ee43260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43260C1Ev();
extern void _ZN7ee43260D1Ev();
Name_Map name_map_ee43260[] = {
  NSPAIR(_ZN7ee43260C1Ev),
  NSPAIR(_ZN7ee43260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee43260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43260[];
extern void _ZN6dd32603fooEv();
extern void _ZN7ee432603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee432603barEv,_ZTv0_n12_N7ee432603barEv)();
extern void ABISELECT(_ZThn16_N7ee432603barEv,_ZThn12_N7ee432603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
  (VTBL_ENTRY)&_ZN7ee432603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee432603barEv,_ZTv0_n12_N7ee432603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee43260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee43260[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee43260[] = {
  {&(_ZTV7ee43260[3]),  3,11},
  {&(_tg__ZTV6dd3260__7ee43260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee43260[4]),  4,6},
  {&(_ZTV7ee43260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43260[];
extern  VTBL_ENTRY _ZTV7ee43260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43260[];
static VTBL_ENTRY alt_thunk_names129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee432603barEv,_ZTv0_n12_N7ee432603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee432603barEv,_ZThn12_N7ee432603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43260 = {  "ee43260", // class name
  bases_ee43260, 4,
  &(vtc_ee43260[0]), // expected_vtbl_contents
  &(vtt_ee43260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names129,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53260  : virtual dd3260 {
  int e;
  virtual void  bar(); // _ZN7ee532603barEv
  ~ee53260(); // tgen
  ee53260(); // tgen
};
//SIG(1 ee53260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee53260 ::bar(){vfunc_called(this, "_ZN7ee532603barEv");}
ee53260 ::~ee53260(){ note_dtor("ee53260", this);} // tgen
ee53260 ::ee53260(){ note_ctor("ee53260", this);} // tgen

static void Test_ee53260()
{
  extern Class_Descriptor cd_ee53260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53260, buf);
    ee53260 *dp, &lv = *(dp=new (buf) ee53260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee53260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee53260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(32,16), "ee53260");
    check_base_class_offset(lv, (dd3260*), ABISELECT(16,8), "ee53260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53260.e");
    test_class_info(&lv, &cd_ee53260);
    dp->~ee53260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53260(Test_ee53260, "ee53260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53260C1Ev();
extern void _ZN7ee53260D1Ev();
Name_Map name_map_ee53260[] = {
  NSPAIR(_ZN7ee53260C1Ev),
  NSPAIR(_ZN7ee53260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee53260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53260[];
extern void _ZN7ee532603barEv();
extern void _ZN6dd32603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee532603barEv,_ZTv0_n12_N7ee532603barEv)();
extern void ABISELECT(_ZThn32_N7ee532603barEv,_ZThn16_N7ee532603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53260[0]),
  (VTBL_ENTRY)&_ZN7ee532603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee532603barEv,_ZTv0_n12_N7ee532603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee53260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee53260[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee53260[] = {
  {&(_ZTV7ee53260[4]),  4,16},
  {&(_ZTV7ee53260[9]),  9,16},
  {&(_ZTV7ee53260[14]),  14,16},
  {&(_tg__ZTV6dd3260__7ee53260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee53260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53260[];
extern  VTBL_ENTRY _ZTV7ee53260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53260[];
static VTBL_ENTRY alt_thunk_names130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee532603barEv,_ZTv0_n12_N7ee532603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee532603barEv,_ZThn16_N7ee532603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53260 = {  "ee53260", // class name
  bases_ee53260, 4,
  &(vtc_ee53260[0]), // expected_vtbl_contents
  &(vtt_ee53260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53260),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names130,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63260  : dd3260 {
  int e;
  virtual void  foo(); // _ZN7ee632603fooEv
  virtual void  bar(); // _ZN7ee632603barEv
  ~ee63260(); // tgen
  ee63260(); // tgen
};
//SIG(1 ee63260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee63260 ::foo(){vfunc_called(this, "_ZN7ee632603fooEv");}
void  ee63260 ::bar(){vfunc_called(this, "_ZN7ee632603barEv");}
ee63260 ::~ee63260(){ note_dtor("ee63260", this);} // tgen
ee63260 ::ee63260(){ note_ctor("ee63260", this);} // tgen

static void Test_ee63260()
{
  extern Class_Descriptor cd_ee63260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63260, buf);
    ee63260 *dp, &lv = *(dp=new (buf) ee63260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee63260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee63260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(16,12), "ee63260");
    check_base_class_offset(lv, (dd3260*), 0, "ee63260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63260.e");
    test_class_info(&lv, &cd_ee63260);
    dp->~ee63260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63260(Test_ee63260, "ee63260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63260C1Ev();
extern void _ZN7ee63260D1Ev();
Name_Map name_map_ee63260[] = {
  NSPAIR(_ZN7ee63260C1Ev),
  NSPAIR(_ZN7ee63260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee63260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63260[];
extern void _ZN7ee632603fooEv();
extern void _ZN7ee632603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee632603barEv,_ZTv0_n12_N7ee632603barEv)();
extern void ABISELECT(_ZThn16_N7ee632603barEv,_ZThn12_N7ee632603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee632603fooEv,_ZTv0_n16_N7ee632603fooEv)();
extern void ABISELECT(_ZThn16_N7ee632603fooEv,_ZThn12_N7ee632603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63260[0]),
  (VTBL_ENTRY)&_ZN7ee632603fooEv,
  (VTBL_ENTRY)&_ZN7ee632603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee632603barEv,_ZTv0_n12_N7ee632603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee632603fooEv,_ZTv0_n16_N7ee632603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee63260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee63260[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee63260[] = {
  {&(_ZTV7ee63260[3]),  3,11},
  {&(_tg__ZTV6dd3260__7ee63260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee63260[4]),  4,6},
  {&(_ZTV7ee63260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63260[];
extern  VTBL_ENTRY _ZTV7ee63260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63260[];
static VTBL_ENTRY alt_thunk_names131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn12_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee632603fooEv,_ZTv0_n16_N7ee632603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee632603fooEv,_ZThn12_N7ee632603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee632603barEv,_ZTv0_n12_N7ee632603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee632603barEv,_ZThn12_N7ee632603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63260 = {  "ee63260", // class name
  bases_ee63260, 4,
  &(vtc_ee63260[0]), // expected_vtbl_contents
  &(vtt_ee63260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names131,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73260  : virtual dd3260 {
  int e;
  virtual void  foo(); // _ZN7ee732603fooEv
  virtual void  bar(); // _ZN7ee732603barEv
  ~ee73260(); // tgen
  ee73260(); // tgen
};
//SIG(1 ee73260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee73260 ::foo(){vfunc_called(this, "_ZN7ee732603fooEv");}
void  ee73260 ::bar(){vfunc_called(this, "_ZN7ee732603barEv");}
ee73260 ::~ee73260(){ note_dtor("ee73260", this);} // tgen
ee73260 ::ee73260(){ note_ctor("ee73260", this);} // tgen

static void Test_ee73260()
{
  extern Class_Descriptor cd_ee73260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73260, buf);
    ee73260 *dp, &lv = *(dp=new (buf) ee73260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee73260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee73260");
    check_base_class_offset(lv, (cc260*)(dd3260*), ABISELECT(32,16), "ee73260");
    check_base_class_offset(lv, (dd3260*), ABISELECT(16,8), "ee73260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73260.e");
    test_class_info(&lv, &cd_ee73260);
    dp->~ee73260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73260(Test_ee73260, "ee73260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73260C1Ev();
extern void _ZN7ee73260D1Ev();
Name_Map name_map_ee73260[] = {
  NSPAIR(_ZN7ee73260C1Ev),
  NSPAIR(_ZN7ee73260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd3260;
extern VTBL_ENTRY _ZTI6dd3260[];
extern  VTBL_ENTRY _ZTV6dd3260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3260[];
static Base_Class bases_ee73260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73260[];
extern void _ZN7ee732603fooEv();
extern void _ZN7ee732603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee732603fooEv,_ZTv0_n16_N7ee732603fooEv)();
extern void ABISELECT(_ZThn16_N7ee732603fooEv,_ZThn8_N7ee732603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee732603barEv,_ZTv0_n12_N7ee732603barEv)();
extern void ABISELECT(_ZThn32_N7ee732603barEv,_ZThn16_N7ee732603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee732603fooEv,_ZTv0_n16_N7ee732603fooEv)();
extern void ABISELECT(_ZThn32_N7ee732603fooEv,_ZThn16_N7ee732603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73260[0]),
  (VTBL_ENTRY)&_ZN7ee732603fooEv,
  (VTBL_ENTRY)&_ZN7ee732603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee732603fooEv,_ZTv0_n16_N7ee732603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee732603barEv,_ZTv0_n12_N7ee732603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee732603fooEv,_ZTv0_n16_N7ee732603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73260[];
extern void _ZN6dd32603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3260__7ee73260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN6dd32603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv)();
extern void ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd3260__7ee73260[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3260[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv),
};
static  VTT_ENTRY vtt_ee73260[] = {
  {&(_ZTV7ee73260[4]),  4,17},
  {&(_ZTV7ee73260[10]),  10,17},
  {&(_ZTV7ee73260[15]),  15,17},
  {&(_tg__ZTV6dd3260__7ee73260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd3260__7ee73260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73260[];
extern  VTBL_ENTRY _ZTV7ee73260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73260[];
static VTBL_ENTRY alt_thunk_names132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd32603fooEv,_ZTv0_n16_N6dd32603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32603fooEv,_ZThn8_N6dd32603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee732603barEv,_ZTv0_n12_N7ee732603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee732603barEv,_ZThn16_N7ee732603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee732603fooEv,_ZTv0_n16_N7ee732603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee732603fooEv,_ZThn16_N7ee732603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee732603fooEv,_ZThn8_N7ee732603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73260 = {  "ee73260", // class name
  bases_ee73260, 4,
  &(vtc_ee73260[0]), // expected_vtbl_contents
  &(vtt_ee73260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73260),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names132,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4260  : cc260 {
  int d;
  virtual void  bar(); // _ZN6dd42603barEv
  ~dd4260(); // tgen
  dd4260(); // tgen
};
//SIG(-1 dd4260) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd4260 ::bar(){vfunc_called(this, "_ZN6dd42603barEv");}
dd4260 ::~dd4260(){ note_dtor("dd4260", this);} // tgen
dd4260 ::dd4260(){ note_ctor("dd4260", this);} // tgen

static void Test_dd4260()
{
  extern Class_Descriptor cd_dd4260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4260, buf);
    dd4260 *dp, &lv = *(dp=new (buf) dd4260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(8,4), "dd4260");
    check_base_class_offset(lv, (bb60*)(cc260*), 0, "dd4260");
    check_base_class_offset(lv, (cc260*), 0, "dd4260");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4260.d");
    test_class_info(&lv, &cd_dd4260);
    dp->~dd4260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4260(Test_dd4260, "dd4260", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4260C1Ev();
extern void _ZN6dd4260D1Ev();
Name_Map name_map_dd4260[] = {
  NSPAIR(_ZN6dd4260C1Ev),
  NSPAIR(_ZN6dd4260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd4260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd4260[];
extern void _ZN6dd42603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_dd4260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4260[0]),
  (VTBL_ENTRY)&_ZN6dd42603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
Class_Descriptor cd_dd4260 = {  "dd4260", // class name
  bases_dd4260, 3,
  &(vtc_dd4260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4260),4, //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  ee04260  : dd4260 {
  int e;
  ~ee04260(); // tgen
  ee04260(); // tgen
};
//SIG(1 ee04260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee04260 ::~ee04260(){ note_dtor("ee04260", this);} // tgen
ee04260 ::ee04260(){ note_ctor("ee04260", this);} // tgen

static void Test_ee04260()
{
  extern Class_Descriptor cd_ee04260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04260, buf);
    ee04260 *dp, &lv = *(dp=new (buf) ee04260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(8,4), "ee04260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), 0, "ee04260");
    check_base_class_offset(lv, (cc260*)(dd4260*), 0, "ee04260");
    check_base_class_offset(lv, (dd4260*), 0, "ee04260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04260.e");
    test_class_info(&lv, &cd_ee04260);
    dp->~ee04260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04260(Test_ee04260, "ee04260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04260C1Ev();
extern void _ZN7ee04260D1Ev();
Name_Map name_map_ee04260[] = {
  NSPAIR(_ZN7ee04260C1Ev),
  NSPAIR(_ZN7ee04260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee04260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04260[];
extern void _ZN6dd42603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee04260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04260[0]),
  (VTBL_ENTRY)&_ZN6dd42603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTI7ee04260[];
extern  VTBL_ENTRY _ZTV7ee04260[];
Class_Descriptor cd_ee04260 = {  "ee04260", // class name
  bases_ee04260, 4,
  &(vtc_ee04260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04260),4, //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  ee14260  : virtual dd4260 {
  int e;
  ~ee14260(); // tgen
  ee14260(); // tgen
};
//SIG(1 ee14260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee14260 ::~ee14260(){ note_dtor("ee14260", this);} // tgen
ee14260 ::ee14260(){ note_ctor("ee14260", this);} // tgen

static void Test_ee14260()
{
  extern Class_Descriptor cd_ee14260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14260, buf);
    ee14260 *dp, &lv = *(dp=new (buf) ee14260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(24,12), "ee14260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), ABISELECT(16,8), "ee14260");
    check_base_class_offset(lv, (cc260*)(dd4260*), ABISELECT(16,8), "ee14260");
    check_base_class_offset(lv, (dd4260*), ABISELECT(16,8), "ee14260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14260.e");
    test_class_info(&lv, &cd_ee14260);
    dp->~ee14260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14260(Test_ee14260, "ee14260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14260C1Ev();
extern void _ZN7ee14260D1Ev();
Name_Map name_map_ee14260[] = {
  NSPAIR(_ZN7ee14260C1Ev),
  NSPAIR(_ZN7ee14260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee14260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14260[];
extern void _ZN6dd42603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee14260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14260[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14260[0]),
  (VTBL_ENTRY)&_ZN6dd42603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee14260[];
static  VTT_ENTRY vtt_ee14260[] = {
  {&(_ZTV7ee14260[3]),  3,9},
  {&(_ZTV7ee14260[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14260[];
extern  VTBL_ENTRY _ZTV7ee14260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14260[];
Class_Descriptor cd_ee14260 = {  "ee14260", // class name
  bases_ee14260, 4,
  &(vtc_ee14260[0]), // expected_vtbl_contents
  &(vtt_ee14260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14260),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14260),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  ee24260  : dd4260 {
  int e;
  virtual void  foo(); // _ZN7ee242603fooEv
  ~ee24260(); // tgen
  ee24260(); // tgen
};
//SIG(1 ee24260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee24260 ::foo(){vfunc_called(this, "_ZN7ee242603fooEv");}
ee24260 ::~ee24260(){ note_dtor("ee24260", this);} // tgen
ee24260 ::ee24260(){ note_ctor("ee24260", this);} // tgen

static void Test_ee24260()
{
  extern Class_Descriptor cd_ee24260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24260, buf);
    ee24260 *dp, &lv = *(dp=new (buf) ee24260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(8,4), "ee24260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), 0, "ee24260");
    check_base_class_offset(lv, (cc260*)(dd4260*), 0, "ee24260");
    check_base_class_offset(lv, (dd4260*), 0, "ee24260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24260.e");
    test_class_info(&lv, &cd_ee24260);
    dp->~ee24260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24260(Test_ee24260, "ee24260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24260C1Ev();
extern void _ZN7ee24260D1Ev();
Name_Map name_map_ee24260[] = {
  NSPAIR(_ZN7ee24260C1Ev),
  NSPAIR(_ZN7ee24260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee24260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee24260[];
extern void _ZN6dd42603barEv();
extern void _ZN7ee242603fooEv();
static  VTBL_ENTRY vtc_ee24260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24260[0]),
  (VTBL_ENTRY)&_ZN6dd42603barEv,
  (VTBL_ENTRY)&_ZN7ee242603fooEv,
};
extern VTBL_ENTRY _ZTI7ee24260[];
extern  VTBL_ENTRY _ZTV7ee24260[];
Class_Descriptor cd_ee24260 = {  "ee24260", // class name
  bases_ee24260, 4,
  &(vtc_ee24260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24260),4, //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  ee34260  : virtual dd4260 {
  int e;
  virtual void  foo(); // _ZN7ee342603fooEv
  ~ee34260(); // tgen
  ee34260(); // tgen
};
//SIG(1 ee34260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee34260 ::foo(){vfunc_called(this, "_ZN7ee342603fooEv");}
ee34260 ::~ee34260(){ note_dtor("ee34260", this);} // tgen
ee34260 ::ee34260(){ note_ctor("ee34260", this);} // tgen

static void Test_ee34260()
{
  extern Class_Descriptor cd_ee34260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34260, buf);
    ee34260 *dp, &lv = *(dp=new (buf) ee34260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(24,12), "ee34260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), ABISELECT(16,8), "ee34260");
    check_base_class_offset(lv, (cc260*)(dd4260*), ABISELECT(16,8), "ee34260");
    check_base_class_offset(lv, (dd4260*), ABISELECT(16,8), "ee34260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34260.e");
    test_class_info(&lv, &cd_ee34260);
    dp->~ee34260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34260(Test_ee34260, "ee34260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34260C1Ev();
extern void _ZN7ee34260D1Ev();
Name_Map name_map_ee34260[] = {
  NSPAIR(_ZN7ee34260C1Ev),
  NSPAIR(_ZN7ee34260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee34260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34260[];
extern void _ZN7ee342603fooEv();
extern void _ZN6dd42603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee342603fooEv,_ZTv0_n16_N7ee342603fooEv)();
extern void ABISELECT(_ZThn16_N7ee342603fooEv,_ZThn8_N7ee342603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34260[0]),
  (VTBL_ENTRY)&_ZN7ee342603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34260[0]),
  (VTBL_ENTRY)&_ZN6dd42603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee342603fooEv,_ZTv0_n16_N7ee342603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34260[];
static  VTT_ENTRY vtt_ee34260[] = {
  {&(_ZTV7ee34260[3]),  3,10},
  {&(_ZTV7ee34260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34260[];
extern  VTBL_ENTRY _ZTV7ee34260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34260[];
static VTBL_ENTRY alt_thunk_names133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee342603fooEv,_ZTv0_n16_N7ee342603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee342603fooEv,_ZThn8_N7ee342603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34260 = {  "ee34260", // class name
  bases_ee34260, 4,
  &(vtc_ee34260[0]), // expected_vtbl_contents
  &(vtt_ee34260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names133,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44260  : dd4260 {
  int e;
  virtual void  bar(); // _ZN7ee442603barEv
  ~ee44260(); // tgen
  ee44260(); // tgen
};
//SIG(1 ee44260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee44260 ::bar(){vfunc_called(this, "_ZN7ee442603barEv");}
ee44260 ::~ee44260(){ note_dtor("ee44260", this);} // tgen
ee44260 ::ee44260(){ note_ctor("ee44260", this);} // tgen

static void Test_ee44260()
{
  extern Class_Descriptor cd_ee44260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44260, buf);
    ee44260 *dp, &lv = *(dp=new (buf) ee44260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(8,4), "ee44260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), 0, "ee44260");
    check_base_class_offset(lv, (cc260*)(dd4260*), 0, "ee44260");
    check_base_class_offset(lv, (dd4260*), 0, "ee44260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44260.e");
    test_class_info(&lv, &cd_ee44260);
    dp->~ee44260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44260(Test_ee44260, "ee44260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44260C1Ev();
extern void _ZN7ee44260D1Ev();
Name_Map name_map_ee44260[] = {
  NSPAIR(_ZN7ee44260C1Ev),
  NSPAIR(_ZN7ee44260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee44260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee44260[];
extern void _ZN7ee442603barEv();
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee44260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44260[0]),
  (VTBL_ENTRY)&_ZN7ee442603barEv,
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTI7ee44260[];
extern  VTBL_ENTRY _ZTV7ee44260[];
Class_Descriptor cd_ee44260 = {  "ee44260", // class name
  bases_ee44260, 4,
  &(vtc_ee44260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44260),4, //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  ee54260  : virtual dd4260 {
  int e;
  virtual void  bar(); // _ZN7ee542603barEv
  ~ee54260(); // tgen
  ee54260(); // tgen
};
//SIG(1 ee54260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee54260 ::bar(){vfunc_called(this, "_ZN7ee542603barEv");}
ee54260 ::~ee54260(){ note_dtor("ee54260", this);} // tgen
ee54260 ::ee54260(){ note_ctor("ee54260", this);} // tgen

static void Test_ee54260()
{
  extern Class_Descriptor cd_ee54260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54260, buf);
    ee54260 *dp, &lv = *(dp=new (buf) ee54260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(24,12), "ee54260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), ABISELECT(16,8), "ee54260");
    check_base_class_offset(lv, (cc260*)(dd4260*), ABISELECT(16,8), "ee54260");
    check_base_class_offset(lv, (dd4260*), ABISELECT(16,8), "ee54260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54260.e");
    test_class_info(&lv, &cd_ee54260);
    dp->~ee54260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54260(Test_ee54260, "ee54260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54260C1Ev();
extern void _ZN7ee54260D1Ev();
Name_Map name_map_ee54260[] = {
  NSPAIR(_ZN7ee54260C1Ev),
  NSPAIR(_ZN7ee54260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee54260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54260[];
extern void _ZN7ee542603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee542603barEv,_ZTv0_n12_N7ee542603barEv)();
extern void ABISELECT(_ZThn16_N7ee542603barEv,_ZThn8_N7ee542603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee54260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54260[0]),
  (VTBL_ENTRY)&_ZN7ee542603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee542603barEv,_ZTv0_n12_N7ee542603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee54260[];
static  VTT_ENTRY vtt_ee54260[] = {
  {&(_ZTV7ee54260[3]),  3,10},
  {&(_ZTV7ee54260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54260[];
extern  VTBL_ENTRY _ZTV7ee54260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54260[];
static VTBL_ENTRY alt_thunk_names134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee542603barEv,_ZTv0_n12_N7ee542603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee542603barEv,_ZThn8_N7ee542603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54260 = {  "ee54260", // class name
  bases_ee54260, 4,
  &(vtc_ee54260[0]), // expected_vtbl_contents
  &(vtt_ee54260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names134,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64260  : dd4260 {
  int e;
  virtual void  foo(); // _ZN7ee642603fooEv
  virtual void  bar(); // _ZN7ee642603barEv
  ~ee64260(); // tgen
  ee64260(); // tgen
};
//SIG(1 ee64260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee64260 ::foo(){vfunc_called(this, "_ZN7ee642603fooEv");}
void  ee64260 ::bar(){vfunc_called(this, "_ZN7ee642603barEv");}
ee64260 ::~ee64260(){ note_dtor("ee64260", this);} // tgen
ee64260 ::ee64260(){ note_ctor("ee64260", this);} // tgen

static void Test_ee64260()
{
  extern Class_Descriptor cd_ee64260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64260, buf);
    ee64260 *dp, &lv = *(dp=new (buf) ee64260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(8,4), "ee64260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), 0, "ee64260");
    check_base_class_offset(lv, (cc260*)(dd4260*), 0, "ee64260");
    check_base_class_offset(lv, (dd4260*), 0, "ee64260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64260.e");
    test_class_info(&lv, &cd_ee64260);
    dp->~ee64260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64260(Test_ee64260, "ee64260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64260C1Ev();
extern void _ZN7ee64260D1Ev();
Name_Map name_map_ee64260[] = {
  NSPAIR(_ZN7ee64260C1Ev),
  NSPAIR(_ZN7ee64260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee64260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee64260[];
extern void _ZN7ee642603barEv();
extern void _ZN7ee642603fooEv();
static  VTBL_ENTRY vtc_ee64260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64260[0]),
  (VTBL_ENTRY)&_ZN7ee642603barEv,
  (VTBL_ENTRY)&_ZN7ee642603fooEv,
};
extern VTBL_ENTRY _ZTI7ee64260[];
extern  VTBL_ENTRY _ZTV7ee64260[];
Class_Descriptor cd_ee64260 = {  "ee64260", // class name
  bases_ee64260, 4,
  &(vtc_ee64260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64260),4, //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  ee74260  : virtual dd4260 {
  int e;
  virtual void  foo(); // _ZN7ee742603fooEv
  virtual void  bar(); // _ZN7ee742603barEv
  ~ee74260(); // tgen
  ee74260(); // tgen
};
//SIG(1 ee74260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee74260 ::foo(){vfunc_called(this, "_ZN7ee742603fooEv");}
void  ee74260 ::bar(){vfunc_called(this, "_ZN7ee742603barEv");}
ee74260 ::~ee74260(){ note_dtor("ee74260", this);} // tgen
ee74260 ::ee74260(){ note_ctor("ee74260", this);} // tgen

static void Test_ee74260()
{
  extern Class_Descriptor cd_ee74260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74260, buf);
    ee74260 *dp, &lv = *(dp=new (buf) ee74260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd4260*), ABISELECT(24,12), "ee74260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd4260*), ABISELECT(16,8), "ee74260");
    check_base_class_offset(lv, (cc260*)(dd4260*), ABISELECT(16,8), "ee74260");
    check_base_class_offset(lv, (dd4260*), ABISELECT(16,8), "ee74260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74260.e");
    test_class_info(&lv, &cd_ee74260);
    dp->~ee74260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74260(Test_ee74260, "ee74260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74260C1Ev();
extern void _ZN7ee74260D1Ev();
Name_Map name_map_ee74260[] = {
  NSPAIR(_ZN7ee74260C1Ev),
  NSPAIR(_ZN7ee74260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd4260;
extern VTBL_ENTRY _ZTI6dd4260[];
extern  VTBL_ENTRY _ZTV6dd4260[];
static Base_Class bases_ee74260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4260,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74260[];
extern void _ZN7ee742603fooEv();
extern void _ZN7ee742603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee742603barEv,_ZTv0_n12_N7ee742603barEv)();
extern void ABISELECT(_ZThn16_N7ee742603barEv,_ZThn8_N7ee742603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee742603fooEv,_ZTv0_n16_N7ee742603fooEv)();
extern void ABISELECT(_ZThn16_N7ee742603fooEv,_ZThn8_N7ee742603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74260[0]),
  (VTBL_ENTRY)&_ZN7ee742603fooEv,
  (VTBL_ENTRY)&_ZN7ee742603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee742603barEv,_ZTv0_n12_N7ee742603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee742603fooEv,_ZTv0_n16_N7ee742603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74260[];
static  VTT_ENTRY vtt_ee74260[] = {
  {&(_ZTV7ee74260[3]),  3,11},
  {&(_ZTV7ee74260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74260[];
extern  VTBL_ENTRY _ZTV7ee74260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74260[];
static VTBL_ENTRY alt_thunk_names135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee742603fooEv,_ZTv0_n16_N7ee742603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee742603fooEv,_ZThn8_N7ee742603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee742603barEv,_ZTv0_n12_N7ee742603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee742603barEv,_ZThn8_N7ee742603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74260 = {  "ee74260", // class name
  bases_ee74260, 4,
  &(vtc_ee74260[0]), // expected_vtbl_contents
  &(vtt_ee74260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names135,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5260  : virtual cc260 {
  int d;
  virtual void  bar(); // _ZN6dd52603barEv
  ~dd5260(); // tgen
  dd5260(); // tgen
};
//SIG(-1 dd5260) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd5260 ::bar(){vfunc_called(this, "_ZN6dd52603barEv");}
dd5260 ::~dd5260(){ note_dtor("dd5260", this);} // tgen
dd5260 ::dd5260(){ note_ctor("dd5260", this);} // tgen

static void Test_dd5260()
{
  extern Class_Descriptor cd_dd5260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5260, buf);
    dd5260 *dp, &lv = *(dp=new (buf) dd5260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,12), "dd5260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,8), "dd5260");
    check_base_class_offset(lv, (cc260*), ABISELECT(16,8), "dd5260");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5260.d");
    test_class_info(&lv, &cd_dd5260);
    dp->~dd5260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5260(Test_dd5260, "dd5260", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5260C1Ev();
extern void _ZN6dd5260D1Ev();
Name_Map name_map_dd5260[] = {
  NSPAIR(_ZN6dd5260C1Ev),
  NSPAIR(_ZN6dd5260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd5260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5260[];
extern void _ZN6dd52603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_dd5260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV6dd5260[];
static  VTT_ENTRY vtt_dd5260[] = {
  {&(_ZTV6dd5260[3]),  3,10},
  {&(_ZTV6dd5260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static VTBL_ENTRY alt_thunk_names136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5260 = {  "dd5260", // class name
  bases_dd5260, 3,
  &(vtc_dd5260[0]), // expected_vtbl_contents
  &(vtt_dd5260[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5260),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names136,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05260  : dd5260 {
  int e;
  ~ee05260(); // tgen
  ee05260(); // tgen
};
//SIG(1 ee05260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee05260 ::~ee05260(){ note_dtor("ee05260", this);} // tgen
ee05260 ::ee05260(){ note_ctor("ee05260", this);} // tgen

static void Test_ee05260()
{
  extern Class_Descriptor cd_ee05260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05260, buf);
    ee05260 *dp, &lv = *(dp=new (buf) ee05260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee05260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee05260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(16,12), "ee05260");
    check_base_class_offset(lv, (dd5260*), 0, "ee05260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05260.e");
    test_class_info(&lv, &cd_ee05260);
    dp->~ee05260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05260(Test_ee05260, "ee05260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05260C1Ev();
extern void _ZN7ee05260D1Ev();
Name_Map name_map_ee05260[] = {
  NSPAIR(_ZN7ee05260C1Ev),
  NSPAIR(_ZN7ee05260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee05260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05260[];
extern void _ZN6dd52603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee05260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee05260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee05260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee05260[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee05260[] = {
  {&(_ZTV7ee05260[3]),  3,10},
  {&(_tg__ZTV6dd5260__7ee05260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee05260[4]),  4,6},
  {&(_ZTV7ee05260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05260[];
extern  VTBL_ENTRY _ZTV7ee05260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05260[];
static VTBL_ENTRY alt_thunk_names137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05260 = {  "ee05260", // class name
  bases_ee05260, 4,
  &(vtc_ee05260[0]), // expected_vtbl_contents
  &(vtt_ee05260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names137,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15260  : virtual dd5260 {
  int e;
  ~ee15260(); // tgen
  ee15260(); // tgen
};
//SIG(1 ee15260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee15260 ::~ee15260(){ note_dtor("ee15260", this);} // tgen
ee15260 ::ee15260(){ note_ctor("ee15260", this);} // tgen

static void Test_ee15260()
{
  extern Class_Descriptor cd_ee15260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15260, buf);
    ee15260 *dp, &lv = *(dp=new (buf) ee15260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee15260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee15260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(32,16), "ee15260");
    check_base_class_offset(lv, (dd5260*), ABISELECT(16,8), "ee15260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15260.e");
    test_class_info(&lv, &cd_ee15260);
    dp->~ee15260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15260(Test_ee15260, "ee15260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15260C1Ev();
extern void _ZN7ee15260D1Ev();
Name_Map name_map_ee15260[] = {
  NSPAIR(_ZN7ee15260C1Ev),
  NSPAIR(_ZN7ee15260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee15260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15260[];
extern void _ZN6dd52603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee15260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15260[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee15260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee15260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee15260[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee15260[] = {
  {&(_ZTV7ee15260[4]),  4,15},
  {&(_ZTV7ee15260[8]),  8,15},
  {&(_ZTV7ee15260[13]),  13,15},
  {&(_tg__ZTV6dd5260__7ee15260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee15260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15260[];
extern  VTBL_ENTRY _ZTV7ee15260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15260[];
static VTBL_ENTRY alt_thunk_names138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15260 = {  "ee15260", // class name
  bases_ee15260, 4,
  &(vtc_ee15260[0]), // expected_vtbl_contents
  &(vtt_ee15260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15260),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names138,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25260  : dd5260 {
  int e;
  virtual void  foo(); // _ZN7ee252603fooEv
  ~ee25260(); // tgen
  ee25260(); // tgen
};
//SIG(1 ee25260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee25260 ::foo(){vfunc_called(this, "_ZN7ee252603fooEv");}
ee25260 ::~ee25260(){ note_dtor("ee25260", this);} // tgen
ee25260 ::ee25260(){ note_ctor("ee25260", this);} // tgen

static void Test_ee25260()
{
  extern Class_Descriptor cd_ee25260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25260, buf);
    ee25260 *dp, &lv = *(dp=new (buf) ee25260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee25260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee25260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(16,12), "ee25260");
    check_base_class_offset(lv, (dd5260*), 0, "ee25260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25260.e");
    test_class_info(&lv, &cd_ee25260);
    dp->~ee25260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25260(Test_ee25260, "ee25260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25260C1Ev();
extern void _ZN7ee25260D1Ev();
Name_Map name_map_ee25260[] = {
  NSPAIR(_ZN7ee25260C1Ev),
  NSPAIR(_ZN7ee25260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee25260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25260[];
extern void _ZN6dd52603barEv();
extern void _ZN7ee252603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee252603fooEv,_ZTv0_n16_N7ee252603fooEv)();
extern void ABISELECT(_ZThn16_N7ee252603fooEv,_ZThn12_N7ee252603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
  (VTBL_ENTRY)&_ZN7ee252603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee252603fooEv,_ZTv0_n16_N7ee252603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee25260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee25260[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee25260[] = {
  {&(_ZTV7ee25260[3]),  3,11},
  {&(_tg__ZTV6dd5260__7ee25260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee25260[4]),  4,6},
  {&(_ZTV7ee25260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25260[];
extern  VTBL_ENTRY _ZTV7ee25260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25260[];
static VTBL_ENTRY alt_thunk_names139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee252603fooEv,_ZTv0_n16_N7ee252603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee252603fooEv,_ZThn12_N7ee252603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25260 = {  "ee25260", // class name
  bases_ee25260, 4,
  &(vtc_ee25260[0]), // expected_vtbl_contents
  &(vtt_ee25260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25260),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  ee35260  : virtual dd5260 {
  int e;
  virtual void  foo(); // _ZN7ee352603fooEv
  ~ee35260(); // tgen
  ee35260(); // tgen
};
//SIG(1 ee35260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee35260 ::foo(){vfunc_called(this, "_ZN7ee352603fooEv");}
ee35260 ::~ee35260(){ note_dtor("ee35260", this);} // tgen
ee35260 ::ee35260(){ note_ctor("ee35260", this);} // tgen

static void Test_ee35260()
{
  extern Class_Descriptor cd_ee35260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35260, buf);
    ee35260 *dp, &lv = *(dp=new (buf) ee35260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee35260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee35260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(32,16), "ee35260");
    check_base_class_offset(lv, (dd5260*), ABISELECT(16,8), "ee35260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35260.e");
    test_class_info(&lv, &cd_ee35260);
    dp->~ee35260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35260(Test_ee35260, "ee35260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35260C1Ev();
extern void _ZN7ee35260D1Ev();
Name_Map name_map_ee35260[] = {
  NSPAIR(_ZN7ee35260C1Ev),
  NSPAIR(_ZN7ee35260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee35260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35260[];
extern void _ZN7ee352603fooEv();
extern void _ZN6dd52603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee352603fooEv,_ZTv0_n16_N7ee352603fooEv)();
extern void ABISELECT(_ZThn32_N7ee352603fooEv,_ZThn16_N7ee352603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35260[0]),
  (VTBL_ENTRY)&_ZN7ee352603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee352603fooEv,_ZTv0_n16_N7ee352603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee35260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee35260[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee35260[] = {
  {&(_ZTV7ee35260[4]),  4,16},
  {&(_ZTV7ee35260[9]),  9,16},
  {&(_ZTV7ee35260[14]),  14,16},
  {&(_tg__ZTV6dd5260__7ee35260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee35260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35260[];
extern  VTBL_ENTRY _ZTV7ee35260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35260[];
static VTBL_ENTRY alt_thunk_names140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee352603fooEv,_ZTv0_n16_N7ee352603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee352603fooEv,_ZThn16_N7ee352603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35260 = {  "ee35260", // class name
  bases_ee35260, 4,
  &(vtc_ee35260[0]), // expected_vtbl_contents
  &(vtt_ee35260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35260),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35260),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  ee45260  : dd5260 {
  int e;
  virtual void  bar(); // _ZN7ee452603barEv
  ~ee45260(); // tgen
  ee45260(); // tgen
};
//SIG(1 ee45260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee45260 ::bar(){vfunc_called(this, "_ZN7ee452603barEv");}
ee45260 ::~ee45260(){ note_dtor("ee45260", this);} // tgen
ee45260 ::ee45260(){ note_ctor("ee45260", this);} // tgen

static void Test_ee45260()
{
  extern Class_Descriptor cd_ee45260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45260, buf);
    ee45260 *dp, &lv = *(dp=new (buf) ee45260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee45260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee45260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(16,12), "ee45260");
    check_base_class_offset(lv, (dd5260*), 0, "ee45260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45260.e");
    test_class_info(&lv, &cd_ee45260);
    dp->~ee45260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45260(Test_ee45260, "ee45260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45260C1Ev();
extern void _ZN7ee45260D1Ev();
Name_Map name_map_ee45260[] = {
  NSPAIR(_ZN7ee45260C1Ev),
  NSPAIR(_ZN7ee45260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee45260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45260[];
extern void _ZN7ee452603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee452603barEv,_ZTv0_n12_N7ee452603barEv)();
extern void ABISELECT(_ZThn16_N7ee452603barEv,_ZThn12_N7ee452603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee45260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45260[0]),
  (VTBL_ENTRY)&_ZN7ee452603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee452603barEv,_ZTv0_n12_N7ee452603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee45260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee45260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee45260[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee45260[] = {
  {&(_ZTV7ee45260[3]),  3,10},
  {&(_tg__ZTV6dd5260__7ee45260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee45260[4]),  4,6},
  {&(_ZTV7ee45260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45260[];
extern  VTBL_ENTRY _ZTV7ee45260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45260[];
static VTBL_ENTRY alt_thunk_names141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee452603barEv,_ZTv0_n12_N7ee452603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee452603barEv,_ZThn12_N7ee452603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45260 = {  "ee45260", // class name
  bases_ee45260, 4,
  &(vtc_ee45260[0]), // expected_vtbl_contents
  &(vtt_ee45260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45260),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  ee55260  : virtual dd5260 {
  int e;
  virtual void  bar(); // _ZN7ee552603barEv
  ~ee55260(); // tgen
  ee55260(); // tgen
};
//SIG(1 ee55260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee55260 ::bar(){vfunc_called(this, "_ZN7ee552603barEv");}
ee55260 ::~ee55260(){ note_dtor("ee55260", this);} // tgen
ee55260 ::ee55260(){ note_ctor("ee55260", this);} // tgen

static void Test_ee55260()
{
  extern Class_Descriptor cd_ee55260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55260, buf);
    ee55260 *dp, &lv = *(dp=new (buf) ee55260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee55260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee55260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(32,16), "ee55260");
    check_base_class_offset(lv, (dd5260*), ABISELECT(16,8), "ee55260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55260.e");
    test_class_info(&lv, &cd_ee55260);
    dp->~ee55260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55260(Test_ee55260, "ee55260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55260C1Ev();
extern void _ZN7ee55260D1Ev();
Name_Map name_map_ee55260[] = {
  NSPAIR(_ZN7ee55260C1Ev),
  NSPAIR(_ZN7ee55260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee55260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55260[];
extern void _ZN7ee552603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee552603barEv,_ZTv0_n16_N7ee552603barEv)();
extern void ABISELECT(_ZThn16_N7ee552603barEv,_ZThn8_N7ee552603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee552603barEv,_ZTv0_n12_N7ee552603barEv)();
extern void ABISELECT(_ZThn32_N7ee552603barEv,_ZThn16_N7ee552603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY vtc_ee55260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55260[0]),
  (VTBL_ENTRY)&_ZN7ee552603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee552603barEv,_ZTv0_n16_N7ee552603barEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee552603barEv,_ZTv0_n12_N7ee552603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
extern VTBL_ENTRY _ZTV7ee55260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee55260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee55260[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee55260[] = {
  {&(_ZTV7ee55260[4]),  4,16},
  {&(_ZTV7ee55260[9]),  9,16},
  {&(_ZTV7ee55260[14]),  14,16},
  {&(_tg__ZTV6dd5260__7ee55260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee55260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55260[];
extern  VTBL_ENTRY _ZTV7ee55260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55260[];
static VTBL_ENTRY alt_thunk_names142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee552603barEv,_ZTv0_n12_N7ee552603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee552603barEv,_ZThn16_N7ee552603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee552603barEv,_ZTv0_n16_N7ee552603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee552603barEv,_ZThn8_N7ee552603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55260 = {  "ee55260", // class name
  bases_ee55260, 4,
  &(vtc_ee55260[0]), // expected_vtbl_contents
  &(vtt_ee55260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55260),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55260),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  ee65260  : dd5260 {
  int e;
  virtual void  foo(); // _ZN7ee652603fooEv
  virtual void  bar(); // _ZN7ee652603barEv
  ~ee65260(); // tgen
  ee65260(); // tgen
};
//SIG(1 ee65260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee65260 ::foo(){vfunc_called(this, "_ZN7ee652603fooEv");}
void  ee65260 ::bar(){vfunc_called(this, "_ZN7ee652603barEv");}
ee65260 ::~ee65260(){ note_dtor("ee65260", this);} // tgen
ee65260 ::ee65260(){ note_ctor("ee65260", this);} // tgen

static void Test_ee65260()
{
  extern Class_Descriptor cd_ee65260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65260, buf);
    ee65260 *dp, &lv = *(dp=new (buf) ee65260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee65260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee65260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(16,12), "ee65260");
    check_base_class_offset(lv, (dd5260*), 0, "ee65260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65260.e");
    test_class_info(&lv, &cd_ee65260);
    dp->~ee65260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65260(Test_ee65260, "ee65260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65260C1Ev();
extern void _ZN7ee65260D1Ev();
Name_Map name_map_ee65260[] = {
  NSPAIR(_ZN7ee65260C1Ev),
  NSPAIR(_ZN7ee65260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee65260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65260[];
extern void _ZN7ee652603barEv();
extern void _ZN7ee652603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee652603barEv,_ZTv0_n12_N7ee652603barEv)();
extern void ABISELECT(_ZThn16_N7ee652603barEv,_ZThn12_N7ee652603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee652603fooEv,_ZTv0_n16_N7ee652603fooEv)();
extern void ABISELECT(_ZThn16_N7ee652603fooEv,_ZThn12_N7ee652603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65260[0]),
  (VTBL_ENTRY)&_ZN7ee652603barEv,
  (VTBL_ENTRY)&_ZN7ee652603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee652603barEv,_ZTv0_n12_N7ee652603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee652603fooEv,_ZTv0_n16_N7ee652603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee65260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee65260[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee65260[] = {
  {&(_ZTV7ee65260[3]),  3,11},
  {&(_tg__ZTV6dd5260__7ee65260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee65260[4]),  4,6},
  {&(_ZTV7ee65260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65260[];
extern  VTBL_ENTRY _ZTV7ee65260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65260[];
static VTBL_ENTRY alt_thunk_names143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn12_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee652603fooEv,_ZTv0_n16_N7ee652603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee652603fooEv,_ZThn12_N7ee652603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee652603barEv,_ZTv0_n12_N7ee652603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee652603barEv,_ZThn12_N7ee652603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65260 = {  "ee65260", // class name
  bases_ee65260, 4,
  &(vtc_ee65260[0]), // expected_vtbl_contents
  &(vtt_ee65260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names143,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75260  : virtual dd5260 {
  int e;
  virtual void  foo(); // _ZN7ee752603fooEv
  virtual void  bar(); // _ZN7ee752603barEv
  ~ee75260(); // tgen
  ee75260(); // tgen
};
//SIG(1 ee75260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee75260 ::foo(){vfunc_called(this, "_ZN7ee752603fooEv");}
void  ee75260 ::bar(){vfunc_called(this, "_ZN7ee752603barEv");}
ee75260 ::~ee75260(){ note_dtor("ee75260", this);} // tgen
ee75260 ::ee75260(){ note_ctor("ee75260", this);} // tgen

static void Test_ee75260()
{
  extern Class_Descriptor cd_ee75260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75260, buf);
    ee75260 *dp, &lv = *(dp=new (buf) ee75260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee75260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee75260");
    check_base_class_offset(lv, (cc260*)(dd5260*), ABISELECT(32,16), "ee75260");
    check_base_class_offset(lv, (dd5260*), ABISELECT(16,8), "ee75260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75260.e");
    test_class_info(&lv, &cd_ee75260);
    dp->~ee75260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75260(Test_ee75260, "ee75260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75260C1Ev();
extern void _ZN7ee75260D1Ev();
Name_Map name_map_ee75260[] = {
  NSPAIR(_ZN7ee75260C1Ev),
  NSPAIR(_ZN7ee75260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd5260;
extern VTBL_ENTRY _ZTI6dd5260[];
extern  VTBL_ENTRY _ZTV6dd5260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5260[];
static Base_Class bases_ee75260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75260[];
extern void _ZN7ee752603fooEv();
extern void _ZN7ee752603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee752603barEv,_ZTv0_n16_N7ee752603barEv)();
extern void ABISELECT(_ZThn16_N7ee752603barEv,_ZThn8_N7ee752603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee752603barEv,_ZTv0_n12_N7ee752603barEv)();
extern void ABISELECT(_ZThn32_N7ee752603barEv,_ZThn16_N7ee752603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee752603fooEv,_ZTv0_n16_N7ee752603fooEv)();
extern void ABISELECT(_ZThn32_N7ee752603fooEv,_ZThn16_N7ee752603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75260[0]),
  (VTBL_ENTRY)&_ZN7ee752603fooEv,
  (VTBL_ENTRY)&_ZN7ee752603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee752603barEv,_ZTv0_n16_N7ee752603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee752603barEv,_ZTv0_n12_N7ee752603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee752603fooEv,_ZTv0_n16_N7ee752603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75260[];
extern void _ZN6dd52603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5260__7ee75260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&_ZN6dd52603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv)();
extern void ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv)() __attribute__((weak));
extern void _ZN5cc2603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc260__6dd5260__7ee75260[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv),
  (VTBL_ENTRY)&_ZN5cc2603fooEv,
};
static  VTT_ENTRY vtt_ee75260[] = {
  {&(_ZTV7ee75260[4]),  4,17},
  {&(_ZTV7ee75260[10]),  10,17},
  {&(_ZTV7ee75260[15]),  15,17},
  {&(_tg__ZTV6dd5260__7ee75260[3]),  3,4},
  {&(_tg__ZTV5cc260__6dd5260__7ee75260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75260[];
extern  VTBL_ENTRY _ZTV7ee75260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75260[];
static VTBL_ENTRY alt_thunk_names144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd52603barEv,_ZTv0_n12_N6dd52603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52603barEv,_ZThn8_N6dd52603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee752603fooEv,_ZTv0_n16_N7ee752603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee752603fooEv,_ZThn16_N7ee752603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee752603barEv,_ZTv0_n12_N7ee752603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee752603barEv,_ZThn16_N7ee752603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee752603barEv,_ZTv0_n16_N7ee752603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee752603barEv,_ZThn8_N7ee752603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75260 = {  "ee75260", // class name
  bases_ee75260, 4,
  &(vtc_ee75260[0]), // expected_vtbl_contents
  &(vtt_ee75260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75260),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names144,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6260  : cc260 {
  int d;
  virtual void  bar(); // _ZN6dd62603barEv
  virtual void  foo(); // _ZN6dd62603fooEv
  ~dd6260(); // tgen
  dd6260(); // tgen
};
//SIG(-1 dd6260) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd6260 ::bar(){vfunc_called(this, "_ZN6dd62603barEv");}
void  dd6260 ::foo(){vfunc_called(this, "_ZN6dd62603fooEv");}
dd6260 ::~dd6260(){ note_dtor("dd6260", this);} // tgen
dd6260 ::dd6260(){ note_ctor("dd6260", this);} // tgen

static void Test_dd6260()
{
  extern Class_Descriptor cd_dd6260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6260, buf);
    dd6260 *dp, &lv = *(dp=new (buf) dd6260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(8,4), "dd6260");
    check_base_class_offset(lv, (bb60*)(cc260*), 0, "dd6260");
    check_base_class_offset(lv, (cc260*), 0, "dd6260");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6260.d");
    test_class_info(&lv, &cd_dd6260);
    dp->~dd6260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6260(Test_dd6260, "dd6260", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6260C1Ev();
extern void _ZN6dd6260D1Ev();
Name_Map name_map_dd6260[] = {
  NSPAIR(_ZN6dd6260C1Ev),
  NSPAIR(_ZN6dd6260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd6260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd6260[];
extern void _ZN6dd62603barEv();
extern void _ZN6dd62603fooEv();
static  VTBL_ENTRY vtc_dd6260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6260[0]),
  (VTBL_ENTRY)&_ZN6dd62603barEv,
  (VTBL_ENTRY)&_ZN6dd62603fooEv,
};
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
Class_Descriptor cd_dd6260 = {  "dd6260", // class name
  bases_dd6260, 3,
  &(vtc_dd6260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6260),4, //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  ee06260  : dd6260 {
  int e;
  ~ee06260(); // tgen
  ee06260(); // tgen
};
//SIG(1 ee06260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee06260 ::~ee06260(){ note_dtor("ee06260", this);} // tgen
ee06260 ::ee06260(){ note_ctor("ee06260", this);} // tgen

static void Test_ee06260()
{
  extern Class_Descriptor cd_ee06260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06260, buf);
    ee06260 *dp, &lv = *(dp=new (buf) ee06260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(8,4), "ee06260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), 0, "ee06260");
    check_base_class_offset(lv, (cc260*)(dd6260*), 0, "ee06260");
    check_base_class_offset(lv, (dd6260*), 0, "ee06260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06260.e");
    test_class_info(&lv, &cd_ee06260);
    dp->~ee06260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06260(Test_ee06260, "ee06260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06260C1Ev();
extern void _ZN7ee06260D1Ev();
Name_Map name_map_ee06260[] = {
  NSPAIR(_ZN7ee06260C1Ev),
  NSPAIR(_ZN7ee06260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee06260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06260[];
extern void _ZN6dd62603barEv();
extern void _ZN6dd62603fooEv();
static  VTBL_ENTRY vtc_ee06260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06260[0]),
  (VTBL_ENTRY)&_ZN6dd62603barEv,
  (VTBL_ENTRY)&_ZN6dd62603fooEv,
};
extern VTBL_ENTRY _ZTI7ee06260[];
extern  VTBL_ENTRY _ZTV7ee06260[];
Class_Descriptor cd_ee06260 = {  "ee06260", // class name
  bases_ee06260, 4,
  &(vtc_ee06260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06260),4, //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  ee16260  : virtual dd6260 {
  int e;
  ~ee16260(); // tgen
  ee16260(); // tgen
};
//SIG(1 ee16260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee16260 ::~ee16260(){ note_dtor("ee16260", this);} // tgen
ee16260 ::ee16260(){ note_ctor("ee16260", this);} // tgen

static void Test_ee16260()
{
  extern Class_Descriptor cd_ee16260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16260, buf);
    ee16260 *dp, &lv = *(dp=new (buf) ee16260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(24,12), "ee16260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), ABISELECT(16,8), "ee16260");
    check_base_class_offset(lv, (cc260*)(dd6260*), ABISELECT(16,8), "ee16260");
    check_base_class_offset(lv, (dd6260*), ABISELECT(16,8), "ee16260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16260.e");
    test_class_info(&lv, &cd_ee16260);
    dp->~ee16260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16260(Test_ee16260, "ee16260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16260C1Ev();
extern void _ZN7ee16260D1Ev();
Name_Map name_map_ee16260[] = {
  NSPAIR(_ZN7ee16260C1Ev),
  NSPAIR(_ZN7ee16260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee16260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16260[];
extern void _ZN6dd62603barEv();
extern void _ZN6dd62603fooEv();
static  VTBL_ENTRY vtc_ee16260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16260[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16260[0]),
  (VTBL_ENTRY)&_ZN6dd62603barEv,
  (VTBL_ENTRY)&_ZN6dd62603fooEv,
};
extern VTBL_ENTRY _ZTV7ee16260[];
static  VTT_ENTRY vtt_ee16260[] = {
  {&(_ZTV7ee16260[3]),  3,9},
  {&(_ZTV7ee16260[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16260[];
extern  VTBL_ENTRY _ZTV7ee16260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16260[];
Class_Descriptor cd_ee16260 = {  "ee16260", // class name
  bases_ee16260, 4,
  &(vtc_ee16260[0]), // expected_vtbl_contents
  &(vtt_ee16260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16260),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16260),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  ee26260  : dd6260 {
  int e;
  virtual void  foo(); // _ZN7ee262603fooEv
  ~ee26260(); // tgen
  ee26260(); // tgen
};
//SIG(1 ee26260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee26260 ::foo(){vfunc_called(this, "_ZN7ee262603fooEv");}
ee26260 ::~ee26260(){ note_dtor("ee26260", this);} // tgen
ee26260 ::ee26260(){ note_ctor("ee26260", this);} // tgen

static void Test_ee26260()
{
  extern Class_Descriptor cd_ee26260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26260, buf);
    ee26260 *dp, &lv = *(dp=new (buf) ee26260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(8,4), "ee26260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), 0, "ee26260");
    check_base_class_offset(lv, (cc260*)(dd6260*), 0, "ee26260");
    check_base_class_offset(lv, (dd6260*), 0, "ee26260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26260.e");
    test_class_info(&lv, &cd_ee26260);
    dp->~ee26260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26260(Test_ee26260, "ee26260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26260C1Ev();
extern void _ZN7ee26260D1Ev();
Name_Map name_map_ee26260[] = {
  NSPAIR(_ZN7ee26260C1Ev),
  NSPAIR(_ZN7ee26260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee26260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee26260[];
extern void _ZN6dd62603barEv();
extern void _ZN7ee262603fooEv();
static  VTBL_ENTRY vtc_ee26260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26260[0]),
  (VTBL_ENTRY)&_ZN6dd62603barEv,
  (VTBL_ENTRY)&_ZN7ee262603fooEv,
};
extern VTBL_ENTRY _ZTI7ee26260[];
extern  VTBL_ENTRY _ZTV7ee26260[];
Class_Descriptor cd_ee26260 = {  "ee26260", // class name
  bases_ee26260, 4,
  &(vtc_ee26260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26260),4, //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  ee36260  : virtual dd6260 {
  int e;
  virtual void  foo(); // _ZN7ee362603fooEv
  ~ee36260(); // tgen
  ee36260(); // tgen
};
//SIG(1 ee36260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee36260 ::foo(){vfunc_called(this, "_ZN7ee362603fooEv");}
ee36260 ::~ee36260(){ note_dtor("ee36260", this);} // tgen
ee36260 ::ee36260(){ note_ctor("ee36260", this);} // tgen

static void Test_ee36260()
{
  extern Class_Descriptor cd_ee36260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36260, buf);
    ee36260 *dp, &lv = *(dp=new (buf) ee36260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(24,12), "ee36260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), ABISELECT(16,8), "ee36260");
    check_base_class_offset(lv, (cc260*)(dd6260*), ABISELECT(16,8), "ee36260");
    check_base_class_offset(lv, (dd6260*), ABISELECT(16,8), "ee36260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36260.e");
    test_class_info(&lv, &cd_ee36260);
    dp->~ee36260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36260(Test_ee36260, "ee36260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36260C1Ev();
extern void _ZN7ee36260D1Ev();
Name_Map name_map_ee36260[] = {
  NSPAIR(_ZN7ee36260C1Ev),
  NSPAIR(_ZN7ee36260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee36260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36260[];
extern void _ZN7ee362603fooEv();
extern void _ZN6dd62603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee362603fooEv,_ZTv0_n16_N7ee362603fooEv)();
extern void ABISELECT(_ZThn16_N7ee362603fooEv,_ZThn8_N7ee362603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36260[0]),
  (VTBL_ENTRY)&_ZN7ee362603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36260[0]),
  (VTBL_ENTRY)&_ZN6dd62603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee362603fooEv,_ZTv0_n16_N7ee362603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36260[];
static  VTT_ENTRY vtt_ee36260[] = {
  {&(_ZTV7ee36260[3]),  3,10},
  {&(_ZTV7ee36260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36260[];
extern  VTBL_ENTRY _ZTV7ee36260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36260[];
static VTBL_ENTRY alt_thunk_names145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee362603fooEv,_ZTv0_n16_N7ee362603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee362603fooEv,_ZThn8_N7ee362603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36260 = {  "ee36260", // class name
  bases_ee36260, 4,
  &(vtc_ee36260[0]), // expected_vtbl_contents
  &(vtt_ee36260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names145,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46260  : dd6260 {
  int e;
  virtual void  bar(); // _ZN7ee462603barEv
  ~ee46260(); // tgen
  ee46260(); // tgen
};
//SIG(1 ee46260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee46260 ::bar(){vfunc_called(this, "_ZN7ee462603barEv");}
ee46260 ::~ee46260(){ note_dtor("ee46260", this);} // tgen
ee46260 ::ee46260(){ note_ctor("ee46260", this);} // tgen

static void Test_ee46260()
{
  extern Class_Descriptor cd_ee46260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46260, buf);
    ee46260 *dp, &lv = *(dp=new (buf) ee46260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(8,4), "ee46260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), 0, "ee46260");
    check_base_class_offset(lv, (cc260*)(dd6260*), 0, "ee46260");
    check_base_class_offset(lv, (dd6260*), 0, "ee46260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46260.e");
    test_class_info(&lv, &cd_ee46260);
    dp->~ee46260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46260(Test_ee46260, "ee46260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46260C1Ev();
extern void _ZN7ee46260D1Ev();
Name_Map name_map_ee46260[] = {
  NSPAIR(_ZN7ee46260C1Ev),
  NSPAIR(_ZN7ee46260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee46260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee46260[];
extern void _ZN7ee462603barEv();
extern void _ZN6dd62603fooEv();
static  VTBL_ENTRY vtc_ee46260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46260[0]),
  (VTBL_ENTRY)&_ZN7ee462603barEv,
  (VTBL_ENTRY)&_ZN6dd62603fooEv,
};
extern VTBL_ENTRY _ZTI7ee46260[];
extern  VTBL_ENTRY _ZTV7ee46260[];
Class_Descriptor cd_ee46260 = {  "ee46260", // class name
  bases_ee46260, 4,
  &(vtc_ee46260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46260),4, //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  ee56260  : virtual dd6260 {
  int e;
  virtual void  bar(); // _ZN7ee562603barEv
  ~ee56260(); // tgen
  ee56260(); // tgen
};
//SIG(1 ee56260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee56260 ::bar(){vfunc_called(this, "_ZN7ee562603barEv");}
ee56260 ::~ee56260(){ note_dtor("ee56260", this);} // tgen
ee56260 ::ee56260(){ note_ctor("ee56260", this);} // tgen

static void Test_ee56260()
{
  extern Class_Descriptor cd_ee56260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56260, buf);
    ee56260 *dp, &lv = *(dp=new (buf) ee56260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(24,12), "ee56260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), ABISELECT(16,8), "ee56260");
    check_base_class_offset(lv, (cc260*)(dd6260*), ABISELECT(16,8), "ee56260");
    check_base_class_offset(lv, (dd6260*), ABISELECT(16,8), "ee56260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56260.e");
    test_class_info(&lv, &cd_ee56260);
    dp->~ee56260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56260(Test_ee56260, "ee56260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56260C1Ev();
extern void _ZN7ee56260D1Ev();
Name_Map name_map_ee56260[] = {
  NSPAIR(_ZN7ee56260C1Ev),
  NSPAIR(_ZN7ee56260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee56260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56260[];
extern void _ZN7ee562603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee562603barEv,_ZTv0_n12_N7ee562603barEv)();
extern void ABISELECT(_ZThn16_N7ee562603barEv,_ZThn8_N7ee562603barEv)() __attribute__((weak));
extern void _ZN6dd62603fooEv();
static  VTBL_ENTRY vtc_ee56260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56260[0]),
  (VTBL_ENTRY)&_ZN7ee562603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee562603barEv,_ZTv0_n12_N7ee562603barEv),
  (VTBL_ENTRY)&_ZN6dd62603fooEv,
};
extern VTBL_ENTRY _ZTV7ee56260[];
static  VTT_ENTRY vtt_ee56260[] = {
  {&(_ZTV7ee56260[3]),  3,10},
  {&(_ZTV7ee56260[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56260[];
extern  VTBL_ENTRY _ZTV7ee56260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56260[];
static VTBL_ENTRY alt_thunk_names146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee562603barEv,_ZTv0_n12_N7ee562603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee562603barEv,_ZThn8_N7ee562603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56260 = {  "ee56260", // class name
  bases_ee56260, 4,
  &(vtc_ee56260[0]), // expected_vtbl_contents
  &(vtt_ee56260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56260),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names146,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66260  : dd6260 {
  int e;
  virtual void  foo(); // _ZN7ee662603fooEv
  virtual void  bar(); // _ZN7ee662603barEv
  ~ee66260(); // tgen
  ee66260(); // tgen
};
//SIG(1 ee66260) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66260 ::foo(){vfunc_called(this, "_ZN7ee662603fooEv");}
void  ee66260 ::bar(){vfunc_called(this, "_ZN7ee662603barEv");}
ee66260 ::~ee66260(){ note_dtor("ee66260", this);} // tgen
ee66260 ::ee66260(){ note_ctor("ee66260", this);} // tgen

static void Test_ee66260()
{
  extern Class_Descriptor cd_ee66260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66260, buf);
    ee66260 *dp, &lv = *(dp=new (buf) ee66260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(8,4), "ee66260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), 0, "ee66260");
    check_base_class_offset(lv, (cc260*)(dd6260*), 0, "ee66260");
    check_base_class_offset(lv, (dd6260*), 0, "ee66260");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66260.e");
    test_class_info(&lv, &cd_ee66260);
    dp->~ee66260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66260(Test_ee66260, "ee66260", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66260C1Ev();
extern void _ZN7ee66260D1Ev();
Name_Map name_map_ee66260[] = {
  NSPAIR(_ZN7ee66260C1Ev),
  NSPAIR(_ZN7ee66260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee66260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee66260[];
extern void _ZN7ee662603barEv();
extern void _ZN7ee662603fooEv();
static  VTBL_ENTRY vtc_ee66260[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66260[0]),
  (VTBL_ENTRY)&_ZN7ee662603barEv,
  (VTBL_ENTRY)&_ZN7ee662603fooEv,
};
extern VTBL_ENTRY _ZTI7ee66260[];
extern  VTBL_ENTRY _ZTV7ee66260[];
Class_Descriptor cd_ee66260 = {  "ee66260", // class name
  bases_ee66260, 4,
  &(vtc_ee66260[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66260),4, //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  ee76260  : virtual dd6260 {
  int e;
  virtual void  foo(); // _ZN7ee762603fooEv
  virtual void  bar(); // _ZN7ee762603barEv
  ~ee76260(); // tgen
  ee76260(); // tgen
};
//SIG(1 ee76260) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76260 ::foo(){vfunc_called(this, "_ZN7ee762603fooEv");}
void  ee76260 ::bar(){vfunc_called(this, "_ZN7ee762603barEv");}
ee76260 ::~ee76260(){ note_dtor("ee76260", this);} // tgen
ee76260 ::ee76260(){ note_ctor("ee76260", this);} // tgen

static void Test_ee76260()
{
  extern Class_Descriptor cd_ee76260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76260, buf);
    ee76260 *dp, &lv = *(dp=new (buf) ee76260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*)(dd6260*), ABISELECT(24,12), "ee76260");
    check_base_class_offset(lv, (bb60*)(cc260*)(dd6260*), ABISELECT(16,8), "ee76260");
    check_base_class_offset(lv, (cc260*)(dd6260*), ABISELECT(16,8), "ee76260");
    check_base_class_offset(lv, (dd6260*), ABISELECT(16,8), "ee76260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76260.e");
    test_class_info(&lv, &cd_ee76260);
    dp->~ee76260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76260(Test_ee76260, "ee76260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76260C1Ev();
extern void _ZN7ee76260D1Ev();
Name_Map name_map_ee76260[] = {
  NSPAIR(_ZN7ee76260C1Ev),
  NSPAIR(_ZN7ee76260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd6260;
extern VTBL_ENTRY _ZTI6dd6260[];
extern  VTBL_ENTRY _ZTV6dd6260[];
static Base_Class bases_ee76260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6260,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76260[];
extern void _ZN7ee762603fooEv();
extern void _ZN7ee762603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee762603barEv,_ZTv0_n12_N7ee762603barEv)();
extern void ABISELECT(_ZThn16_N7ee762603barEv,_ZThn8_N7ee762603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee762603fooEv,_ZTv0_n16_N7ee762603fooEv)();
extern void ABISELECT(_ZThn16_N7ee762603fooEv,_ZThn8_N7ee762603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76260[0]),
  (VTBL_ENTRY)&_ZN7ee762603fooEv,
  (VTBL_ENTRY)&_ZN7ee762603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee762603barEv,_ZTv0_n12_N7ee762603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee762603fooEv,_ZTv0_n16_N7ee762603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76260[];
static  VTT_ENTRY vtt_ee76260[] = {
  {&(_ZTV7ee76260[3]),  3,11},
  {&(_ZTV7ee76260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76260[];
extern  VTBL_ENTRY _ZTV7ee76260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76260[];
static VTBL_ENTRY alt_thunk_names147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee762603fooEv,_ZTv0_n16_N7ee762603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee762603fooEv,_ZThn8_N7ee762603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee762603barEv,_ZTv0_n12_N7ee762603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee762603barEv,_ZThn8_N7ee762603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76260 = {  "ee76260", // class name
  bases_ee76260, 4,
  &(vtc_ee76260[0]), // expected_vtbl_contents
  &(vtt_ee76260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76260),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names147,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7260  : virtual cc260 {
  int d;
  virtual void  bar(); // _ZN6dd72603barEv
  virtual void  foo(); // _ZN6dd72603fooEv
  ~dd7260(); // tgen
  dd7260(); // tgen
};
//SIG(-1 dd7260) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd7260 ::bar(){vfunc_called(this, "_ZN6dd72603barEv");}
void  dd7260 ::foo(){vfunc_called(this, "_ZN6dd72603fooEv");}
dd7260 ::~dd7260(){ note_dtor("dd7260", this);} // tgen
dd7260 ::dd7260(){ note_ctor("dd7260", this);} // tgen

static void Test_dd7260()
{
  extern Class_Descriptor cd_dd7260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7260, buf);
    dd7260 *dp, &lv = *(dp=new (buf) dd7260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,12), "dd7260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,8), "dd7260");
    check_base_class_offset(lv, (cc260*), ABISELECT(16,8), "dd7260");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7260.d");
    test_class_info(&lv, &cd_dd7260);
    dp->~dd7260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7260(Test_dd7260, "dd7260", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7260C1Ev();
extern void _ZN6dd7260D1Ev();
Name_Map name_map_dd7260[] = {
  NSPAIR(_ZN6dd7260C1Ev),
  NSPAIR(_ZN6dd7260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
static Base_Class bases_dd7260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7260[];
static  VTT_ENTRY vtt_dd7260[] = {
  {&(_ZTV6dd7260[3]),  3,11},
  {&(_ZTV6dd7260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static VTBL_ENTRY alt_thunk_names148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7260 = {  "dd7260", // class name
  bases_dd7260, 3,
  &(vtc_dd7260[0]), // expected_vtbl_contents
  &(vtt_dd7260[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7260),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names148,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07260  : dd7260 {
  int e;
  ~ee07260(); // tgen
  ee07260(); // tgen
};
//SIG(1 ee07260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee07260 ::~ee07260(){ note_dtor("ee07260", this);} // tgen
ee07260 ::ee07260(){ note_ctor("ee07260", this);} // tgen

static void Test_ee07260()
{
  extern Class_Descriptor cd_ee07260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07260, buf);
    ee07260 *dp, &lv = *(dp=new (buf) ee07260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee07260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee07260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(16,12), "ee07260");
    check_base_class_offset(lv, (dd7260*), 0, "ee07260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07260.e");
    test_class_info(&lv, &cd_ee07260);
    dp->~ee07260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07260(Test_ee07260, "ee07260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07260C1Ev();
extern void _ZN7ee07260D1Ev();
Name_Map name_map_ee07260[] = {
  NSPAIR(_ZN7ee07260C1Ev),
  NSPAIR(_ZN7ee07260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee07260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee07260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee07260[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee07260[] = {
  {&(_ZTV7ee07260[3]),  3,11},
  {&(_tg__ZTV6dd7260__7ee07260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee07260[4]),  4,6},
  {&(_ZTV7ee07260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07260[];
extern  VTBL_ENTRY _ZTV7ee07260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07260[];
static VTBL_ENTRY alt_thunk_names149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07260 = {  "ee07260", // class name
  bases_ee07260, 4,
  &(vtc_ee07260[0]), // expected_vtbl_contents
  &(vtt_ee07260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07260),4, //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  ee17260  : virtual dd7260 {
  int e;
  ~ee17260(); // tgen
  ee17260(); // tgen
};
//SIG(1 ee17260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee17260 ::~ee17260(){ note_dtor("ee17260", this);} // tgen
ee17260 ::ee17260(){ note_ctor("ee17260", this);} // tgen

static void Test_ee17260()
{
  extern Class_Descriptor cd_ee17260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17260, buf);
    ee17260 *dp, &lv = *(dp=new (buf) ee17260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee17260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee17260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(32,16), "ee17260");
    check_base_class_offset(lv, (dd7260*), ABISELECT(16,8), "ee17260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17260.e");
    test_class_info(&lv, &cd_ee17260);
    dp->~ee17260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17260(Test_ee17260, "ee17260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17260C1Ev();
extern void _ZN7ee17260D1Ev();
Name_Map name_map_ee17260[] = {
  NSPAIR(_ZN7ee17260C1Ev),
  NSPAIR(_ZN7ee17260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee17260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17260[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee17260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee17260[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee17260[] = {
  {&(_ZTV7ee17260[4]),  4,17},
  {&(_ZTV7ee17260[9]),  9,17},
  {&(_ZTV7ee17260[15]),  15,17},
  {&(_tg__ZTV6dd7260__7ee17260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee17260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17260[];
extern  VTBL_ENTRY _ZTV7ee17260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17260[];
static VTBL_ENTRY alt_thunk_names150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17260 = {  "ee17260", // class name
  bases_ee17260, 4,
  &(vtc_ee17260[0]), // expected_vtbl_contents
  &(vtt_ee17260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17260),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17260),5, //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  ee27260  : dd7260 {
  int e;
  virtual void  foo(); // _ZN7ee272603fooEv
  ~ee27260(); // tgen
  ee27260(); // tgen
};
//SIG(1 ee27260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee27260 ::foo(){vfunc_called(this, "_ZN7ee272603fooEv");}
ee27260 ::~ee27260(){ note_dtor("ee27260", this);} // tgen
ee27260 ::ee27260(){ note_ctor("ee27260", this);} // tgen

static void Test_ee27260()
{
  extern Class_Descriptor cd_ee27260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27260, buf);
    ee27260 *dp, &lv = *(dp=new (buf) ee27260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee27260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee27260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(16,12), "ee27260");
    check_base_class_offset(lv, (dd7260*), 0, "ee27260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27260.e");
    test_class_info(&lv, &cd_ee27260);
    dp->~ee27260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27260(Test_ee27260, "ee27260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27260C1Ev();
extern void _ZN7ee27260D1Ev();
Name_Map name_map_ee27260[] = {
  NSPAIR(_ZN7ee27260C1Ev),
  NSPAIR(_ZN7ee27260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee27260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27260[];
extern void _ZN6dd72603barEv();
extern void _ZN7ee272603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee272603fooEv,_ZTv0_n16_N7ee272603fooEv)();
extern void ABISELECT(_ZThn16_N7ee272603fooEv,_ZThn12_N7ee272603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN7ee272603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee272603fooEv,_ZTv0_n16_N7ee272603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee27260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee27260[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee27260[] = {
  {&(_ZTV7ee27260[3]),  3,11},
  {&(_tg__ZTV6dd7260__7ee27260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee27260[4]),  4,6},
  {&(_ZTV7ee27260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27260[];
extern  VTBL_ENTRY _ZTV7ee27260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27260[];
static VTBL_ENTRY alt_thunk_names151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee272603fooEv,_ZTv0_n16_N7ee272603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee272603fooEv,_ZThn12_N7ee272603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27260 = {  "ee27260", // class name
  bases_ee27260, 4,
  &(vtc_ee27260[0]), // expected_vtbl_contents
  &(vtt_ee27260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27260),4, //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  ee37260  : virtual dd7260 {
  int e;
  virtual void  foo(); // _ZN7ee372603fooEv
  ~ee37260(); // tgen
  ee37260(); // tgen
};
//SIG(1 ee37260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee37260 ::foo(){vfunc_called(this, "_ZN7ee372603fooEv");}
ee37260 ::~ee37260(){ note_dtor("ee37260", this);} // tgen
ee37260 ::ee37260(){ note_ctor("ee37260", this);} // tgen

static void Test_ee37260()
{
  extern Class_Descriptor cd_ee37260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37260, buf);
    ee37260 *dp, &lv = *(dp=new (buf) ee37260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee37260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee37260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(32,16), "ee37260");
    check_base_class_offset(lv, (dd7260*), ABISELECT(16,8), "ee37260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37260.e");
    test_class_info(&lv, &cd_ee37260);
    dp->~ee37260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37260(Test_ee37260, "ee37260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37260C1Ev();
extern void _ZN7ee37260D1Ev();
Name_Map name_map_ee37260[] = {
  NSPAIR(_ZN7ee37260C1Ev),
  NSPAIR(_ZN7ee37260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee37260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37260[];
extern void _ZN7ee372603fooEv();
extern void _ZN6dd72603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee372603fooEv,_ZTv0_n20_N7ee372603fooEv)();
extern void ABISELECT(_ZThn16_N7ee372603fooEv,_ZThn8_N7ee372603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee372603fooEv,_ZTv0_n16_N7ee372603fooEv)();
extern void ABISELECT(_ZThn32_N7ee372603fooEv,_ZThn16_N7ee372603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37260[0]),
  (VTBL_ENTRY)&_ZN7ee372603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee372603fooEv,_ZTv0_n20_N7ee372603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee372603fooEv,_ZTv0_n16_N7ee372603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee37260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee37260[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee37260[] = {
  {&(_ZTV7ee37260[4]),  4,18},
  {&(_ZTV7ee37260[10]),  10,18},
  {&(_ZTV7ee37260[16]),  16,18},
  {&(_tg__ZTV6dd7260__7ee37260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee37260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37260[];
extern  VTBL_ENTRY _ZTV7ee37260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37260[];
static VTBL_ENTRY alt_thunk_names152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee372603fooEv,_ZTv0_n16_N7ee372603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee372603fooEv,_ZThn16_N7ee372603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee372603fooEv,_ZTv0_n20_N7ee372603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee372603fooEv,_ZThn8_N7ee372603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37260 = {  "ee37260", // class name
  bases_ee37260, 4,
  &(vtc_ee37260[0]), // expected_vtbl_contents
  &(vtt_ee37260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37260),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names152,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47260  : dd7260 {
  int e;
  virtual void  bar(); // _ZN7ee472603barEv
  ~ee47260(); // tgen
  ee47260(); // tgen
};
//SIG(1 ee47260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee47260 ::bar(){vfunc_called(this, "_ZN7ee472603barEv");}
ee47260 ::~ee47260(){ note_dtor("ee47260", this);} // tgen
ee47260 ::ee47260(){ note_ctor("ee47260", this);} // tgen

static void Test_ee47260()
{
  extern Class_Descriptor cd_ee47260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47260, buf);
    ee47260 *dp, &lv = *(dp=new (buf) ee47260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee47260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee47260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(16,12), "ee47260");
    check_base_class_offset(lv, (dd7260*), 0, "ee47260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47260.e");
    test_class_info(&lv, &cd_ee47260);
    dp->~ee47260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47260(Test_ee47260, "ee47260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47260C1Ev();
extern void _ZN7ee47260D1Ev();
Name_Map name_map_ee47260[] = {
  NSPAIR(_ZN7ee47260C1Ev),
  NSPAIR(_ZN7ee47260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee47260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47260[];
extern void _ZN7ee472603barEv();
extern void _ZN6dd72603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee472603barEv,_ZTv0_n12_N7ee472603barEv)();
extern void ABISELECT(_ZThn16_N7ee472603barEv,_ZThn12_N7ee472603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47260[0]),
  (VTBL_ENTRY)&_ZN7ee472603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee472603barEv,_ZTv0_n12_N7ee472603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee47260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee47260[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee47260[] = {
  {&(_ZTV7ee47260[3]),  3,11},
  {&(_tg__ZTV6dd7260__7ee47260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee47260[4]),  4,6},
  {&(_ZTV7ee47260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47260[];
extern  VTBL_ENTRY _ZTV7ee47260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47260[];
static VTBL_ENTRY alt_thunk_names153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee472603barEv,_ZTv0_n12_N7ee472603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee472603barEv,_ZThn12_N7ee472603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47260 = {  "ee47260", // class name
  bases_ee47260, 4,
  &(vtc_ee47260[0]), // expected_vtbl_contents
  &(vtt_ee47260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names153,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57260  : virtual dd7260 {
  int e;
  virtual void  bar(); // _ZN7ee572603barEv
  ~ee57260(); // tgen
  ee57260(); // tgen
};
//SIG(1 ee57260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee57260 ::bar(){vfunc_called(this, "_ZN7ee572603barEv");}
ee57260 ::~ee57260(){ note_dtor("ee57260", this);} // tgen
ee57260 ::ee57260(){ note_ctor("ee57260", this);} // tgen

static void Test_ee57260()
{
  extern Class_Descriptor cd_ee57260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57260, buf);
    ee57260 *dp, &lv = *(dp=new (buf) ee57260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee57260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee57260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(32,16), "ee57260");
    check_base_class_offset(lv, (dd7260*), ABISELECT(16,8), "ee57260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57260.e");
    test_class_info(&lv, &cd_ee57260);
    dp->~ee57260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57260(Test_ee57260, "ee57260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57260C1Ev();
extern void _ZN7ee57260D1Ev();
Name_Map name_map_ee57260[] = {
  NSPAIR(_ZN7ee57260C1Ev),
  NSPAIR(_ZN7ee57260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee57260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57260[];
extern void _ZN7ee572603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee572603barEv,_ZTv0_n16_N7ee572603barEv)();
extern void ABISELECT(_ZThn16_N7ee572603barEv,_ZThn8_N7ee572603barEv)() __attribute__((weak));
extern void _ZN6dd72603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee572603barEv,_ZTv0_n12_N7ee572603barEv)();
extern void ABISELECT(_ZThn32_N7ee572603barEv,_ZThn16_N7ee572603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57260[0]),
  (VTBL_ENTRY)&_ZN7ee572603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee572603barEv,_ZTv0_n16_N7ee572603barEv),
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee572603barEv,_ZTv0_n12_N7ee572603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee57260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee57260[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee57260[] = {
  {&(_ZTV7ee57260[4]),  4,18},
  {&(_ZTV7ee57260[10]),  10,18},
  {&(_ZTV7ee57260[16]),  16,18},
  {&(_tg__ZTV6dd7260__7ee57260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee57260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57260[];
extern  VTBL_ENTRY _ZTV7ee57260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57260[];
static VTBL_ENTRY alt_thunk_names154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee572603barEv,_ZTv0_n12_N7ee572603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee572603barEv,_ZThn16_N7ee572603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee572603barEv,_ZTv0_n16_N7ee572603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee572603barEv,_ZThn8_N7ee572603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57260 = {  "ee57260", // class name
  bases_ee57260, 4,
  &(vtc_ee57260[0]), // expected_vtbl_contents
  &(vtt_ee57260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57260),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names154,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67260  : dd7260 {
  int e;
  virtual void  foo(); // _ZN7ee672603fooEv
  virtual void  bar(); // _ZN7ee672603barEv
  ~ee67260(); // tgen
  ee67260(); // tgen
};
//SIG(1 ee67260) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67260 ::foo(){vfunc_called(this, "_ZN7ee672603fooEv");}
void  ee67260 ::bar(){vfunc_called(this, "_ZN7ee672603barEv");}
ee67260 ::~ee67260(){ note_dtor("ee67260", this);} // tgen
ee67260 ::ee67260(){ note_ctor("ee67260", this);} // tgen

static void Test_ee67260()
{
  extern Class_Descriptor cd_ee67260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67260, buf);
    ee67260 *dp, &lv = *(dp=new (buf) ee67260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(24,16), "ee67260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(16,12), "ee67260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(16,12), "ee67260");
    check_base_class_offset(lv, (dd7260*), 0, "ee67260");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67260.e");
    test_class_info(&lv, &cd_ee67260);
    dp->~ee67260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67260(Test_ee67260, "ee67260", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67260C1Ev();
extern void _ZN7ee67260D1Ev();
Name_Map name_map_ee67260[] = {
  NSPAIR(_ZN7ee67260C1Ev),
  NSPAIR(_ZN7ee67260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee67260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc260,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67260[];
extern void _ZN7ee672603barEv();
extern void _ZN7ee672603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee672603barEv,_ZTv0_n12_N7ee672603barEv)();
extern void ABISELECT(_ZThn16_N7ee672603barEv,_ZThn12_N7ee672603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee672603fooEv,_ZTv0_n16_N7ee672603fooEv)();
extern void ABISELECT(_ZThn16_N7ee672603fooEv,_ZThn12_N7ee672603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67260[0]),
  (VTBL_ENTRY)&_ZN7ee672603barEv,
  (VTBL_ENTRY)&_ZN7ee672603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee672603barEv,_ZTv0_n12_N7ee672603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee672603fooEv,_ZTv0_n16_N7ee672603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee67260[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee67260[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee67260[] = {
  {&(_ZTV7ee67260[3]),  3,11},
  {&(_tg__ZTV6dd7260__7ee67260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee67260[4]),  4,6},
  {&(_ZTV7ee67260[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67260[];
extern  VTBL_ENTRY _ZTV7ee67260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67260[];
static VTBL_ENTRY alt_thunk_names155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn12_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn12_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee672603fooEv,_ZTv0_n16_N7ee672603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee672603fooEv,_ZThn12_N7ee672603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee672603barEv,_ZTv0_n12_N7ee672603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee672603barEv,_ZThn12_N7ee672603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67260 = {  "ee67260", // class name
  bases_ee67260, 4,
  &(vtc_ee67260[0]), // expected_vtbl_contents
  &(vtt_ee67260[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67260),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67260),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67260),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names155,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77260  : virtual dd7260 {
  int e;
  virtual void  foo(); // _ZN7ee772603fooEv
  virtual void  bar(); // _ZN7ee772603barEv
  ~ee77260(); // tgen
  ee77260(); // tgen
};
//SIG(1 ee77260) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77260 ::foo(){vfunc_called(this, "_ZN7ee772603fooEv");}
void  ee77260 ::bar(){vfunc_called(this, "_ZN7ee772603barEv");}
ee77260 ::~ee77260(){ note_dtor("ee77260", this);} // tgen
ee77260 ::ee77260(){ note_ctor("ee77260", this);} // tgen

static void Test_ee77260()
{
  extern Class_Descriptor cd_ee77260;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77260, buf);
    ee77260 *dp, &lv = *(dp=new (buf) ee77260());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77260)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77260)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc260*), ABISELECT(40,20), "ee77260");
    check_base_class_offset(lv, (bb60*)(cc260*), ABISELECT(32,16), "ee77260");
    check_base_class_offset(lv, (cc260*)(dd7260*), ABISELECT(32,16), "ee77260");
    check_base_class_offset(lv, (dd7260*), ABISELECT(16,8), "ee77260");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77260.e");
    test_class_info(&lv, &cd_ee77260);
    dp->~ee77260();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77260(Test_ee77260, "ee77260", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77260C1Ev();
extern void _ZN7ee77260D1Ev();
Name_Map name_map_ee77260[] = {
  NSPAIR(_ZN7ee77260C1Ev),
  NSPAIR(_ZN7ee77260D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc260;
extern VTBL_ENTRY _ZTI5cc260[];
extern  VTBL_ENTRY _ZTV5cc260[];
extern Class_Descriptor cd_dd7260;
extern VTBL_ENTRY _ZTI6dd7260[];
extern  VTBL_ENTRY _ZTV6dd7260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7260[];
static Base_Class bases_ee77260[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc260,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7260,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77260[];
extern void _ZN7ee772603fooEv();
extern void _ZN7ee772603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee772603barEv,_ZTv0_n16_N7ee772603barEv)();
extern void ABISELECT(_ZThn16_N7ee772603barEv,_ZThn8_N7ee772603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee772603fooEv,_ZTv0_n20_N7ee772603fooEv)();
extern void ABISELECT(_ZThn16_N7ee772603fooEv,_ZThn8_N7ee772603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee772603barEv,_ZTv0_n12_N7ee772603barEv)();
extern void ABISELECT(_ZThn32_N7ee772603barEv,_ZThn16_N7ee772603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee772603fooEv,_ZTv0_n16_N7ee772603fooEv)();
extern void ABISELECT(_ZThn32_N7ee772603fooEv,_ZThn16_N7ee772603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77260[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77260[0]),
  (VTBL_ENTRY)&_ZN7ee772603fooEv,
  (VTBL_ENTRY)&_ZN7ee772603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee772603barEv,_ZTv0_n16_N7ee772603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee772603fooEv,_ZTv0_n20_N7ee772603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee772603barEv,_ZTv0_n12_N7ee772603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee772603fooEv,_ZTv0_n16_N7ee772603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77260[];
extern void _ZN6dd72603barEv();
extern void _ZN6dd72603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7260__7ee77260[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&_ZN6dd72603barEv,
  (VTBL_ENTRY)&_ZN6dd72603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv)();
extern void ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv)();
extern void ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc260__6dd7260__7ee77260[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7260[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv),
};
static  VTT_ENTRY vtt_ee77260[] = {
  {&(_ZTV7ee77260[4]),  4,19},
  {&(_ZTV7ee77260[11]),  11,19},
  {&(_ZTV7ee77260[17]),  17,19},
  {&(_tg__ZTV6dd7260__7ee77260[3]),  3,5},
  {&(_tg__ZTV5cc260__6dd7260__7ee77260[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77260[];
extern  VTBL_ENTRY _ZTV7ee77260[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77260[];
static VTBL_ENTRY alt_thunk_names156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72603fooEv,_ZTv0_n16_N6dd72603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603fooEv,_ZThn8_N6dd72603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72603barEv,_ZTv0_n12_N6dd72603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72603barEv,_ZThn8_N6dd72603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee772603fooEv,_ZTv0_n16_N7ee772603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee772603fooEv,_ZThn16_N7ee772603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee772603barEv,_ZTv0_n12_N7ee772603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee772603barEv,_ZThn16_N7ee772603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee772603fooEv,_ZTv0_n20_N7ee772603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee772603fooEv,_ZThn8_N7ee772603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee772603barEv,_ZTv0_n16_N7ee772603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee772603barEv,_ZThn8_N7ee772603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77260 = {  "ee77260", // class name
  bases_ee77260, 4,
  &(vtc_ee77260[0]), // expected_vtbl_contents
  &(vtt_ee77260[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77260),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77260),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77260),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names156,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc360  : virtual bb60 {
  int c;
  virtual void  foo(); // _ZN5cc3603fooEv
  ~cc360(); // tgen
  cc360(); // tgen
};
//SIG(-1 cc360) C1{ VBC2{ BC3{ Fi} v2 v1 Fi} v1 Fi}


void  cc360 ::foo(){vfunc_called(this, "_ZN5cc3603fooEv");}
cc360 ::~cc360(){ note_dtor("cc360", this);} // tgen
cc360 ::cc360(){ note_ctor("cc360", this);} // tgen

static void Test_cc360()
{
  extern Class_Descriptor cd_cc360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc360, buf);
    cc360 *dp, &lv = *(dp=new (buf) cc360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,12), "cc360");
    check_base_class_offset(lv, (bb60*), ABISELECT(16,8), "cc360");
    check_field_offset(lv, c, ABISELECT(8,4), "cc360.c");
    test_class_info(&lv, &cd_cc360);
    dp->~cc360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc360(Test_cc360, "cc360", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc360C1Ev();
extern void _ZN5cc360D1Ev();
Name_Map name_map_cc360[] = {
  NSPAIR(_ZN5cc360C1Ev),
  NSPAIR(_ZN5cc360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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 _ZTI5cc360[];
extern void _ZN5cc3603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_cc360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV5cc360[];
static  VTT_ENTRY vtt_cc360[] = {
  {&(_ZTV5cc360[3]),  3,10},
  {&(_ZTV5cc360[8]),  8,10},
};
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static VTBL_ENTRY alt_thunk_names157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc360 = {  "cc360", // class name
  bases_cc360, 2,
  &(vtc_cc360[0]), // expected_vtbl_contents
  &(vtt_cc360[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc360),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc360),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names157,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0360  : cc360 {
  int d;
  ~dd0360(); // tgen
  dd0360(); // tgen
};
//SIG(-1 dd0360) C1{ BC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} Fi}


dd0360 ::~dd0360(){ note_dtor("dd0360", this);} // tgen
dd0360 ::dd0360(){ note_ctor("dd0360", this);} // tgen

static void Test_dd0360()
{
  extern Class_Descriptor cd_dd0360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0360, buf);
    dd0360 *dp, &lv = *(dp=new (buf) dd0360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd0360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(16,12), "dd0360");
    check_base_class_offset(lv, (cc360*), 0, "dd0360");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0360.d");
    test_class_info(&lv, &cd_dd0360);
    dp->~dd0360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0360(Test_dd0360, "dd0360", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0360C1Ev();
extern void _ZN6dd0360D1Ev();
Name_Map name_map_dd0360[] = {
  NSPAIR(_ZN6dd0360C1Ev),
  NSPAIR(_ZN6dd0360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd0360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0360[];
extern void _ZN5cc3603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd0360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV6dd0360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd0360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd0360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd0360[] = {
  {&(_ZTV6dd0360[3]),  3,10},
  {&(_tg__ZTV5cc360__6dd0360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd0360[4]),  4,6},
  {&(_ZTV6dd0360[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static VTBL_ENTRY alt_thunk_names158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0360 = {  "dd0360", // class name
  bases_dd0360, 3,
  &(vtc_dd0360[0]), // expected_vtbl_contents
  &(vtt_dd0360[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0360),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0360),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names158,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00360  : dd0360 {
  int e;
  ~ee00360(); // tgen
  ee00360(); // tgen
};
//SIG(1 ee00360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee00360 ::~ee00360(){ note_dtor("ee00360", this);} // tgen
ee00360 ::ee00360(){ note_ctor("ee00360", this);} // tgen

static void Test_ee00360()
{
  extern Class_Descriptor cd_ee00360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00360, buf);
    ee00360 *dp, &lv = *(dp=new (buf) ee00360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee00360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(24,16), "ee00360");
    check_base_class_offset(lv, (cc360*)(dd0360*), 0, "ee00360");
    check_base_class_offset(lv, (dd0360*), 0, "ee00360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00360.e");
    test_class_info(&lv, &cd_ee00360);
    dp->~ee00360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00360(Test_ee00360, "ee00360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00360C1Ev();
extern void _ZN7ee00360D1Ev();
Name_Map name_map_ee00360[] = {
  NSPAIR(_ZN7ee00360C1Ev),
  NSPAIR(_ZN7ee00360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee00360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00360[];
extern void _ZN5cc3603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee00360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee00360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee00360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee00360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee00360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee00360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee00360[] = {
  {&(_ZTV7ee00360[3]),  3,10},
  {&(_tg__ZTV6dd0360__7ee00360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee00360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee00360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee00360[4]),  4,6},
  {&(_ZTV7ee00360[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee00360[];
extern  VTBL_ENTRY _ZTV7ee00360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00360[];
static VTBL_ENTRY alt_thunk_names159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00360 = {  "ee00360", // class name
  bases_ee00360, 4,
  &(vtc_ee00360[0]), // expected_vtbl_contents
  &(vtt_ee00360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00360),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names159,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10360  : virtual dd0360 {
  int e;
  ~ee10360(); // tgen
  ee10360(); // tgen
};
//SIG(1 ee10360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee10360 ::~ee10360(){ note_dtor("ee10360", this);} // tgen
ee10360 ::ee10360(){ note_ctor("ee10360", this);} // tgen

static void Test_ee10360()
{
  extern Class_Descriptor cd_ee10360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10360, buf);
    ee10360 *dp, &lv = *(dp=new (buf) ee10360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee10360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(32,20), "ee10360");
    check_base_class_offset(lv, (cc360*)(dd0360*), ABISELECT(16,8), "ee10360");
    check_base_class_offset(lv, (dd0360*), ABISELECT(16,8), "ee10360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10360.e");
    test_class_info(&lv, &cd_ee10360);
    dp->~ee10360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10360(Test_ee10360, "ee10360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10360C1Ev();
extern void _ZN7ee10360D1Ev();
Name_Map name_map_ee10360[] = {
  NSPAIR(_ZN7ee10360C1Ev),
  NSPAIR(_ZN7ee10360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee10360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10360[];
extern void _ZN5cc3603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee10360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10360[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee10360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee10360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee10360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee10360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee10360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee10360[] = {
  {&(_ZTV7ee10360[4]),  4,15},
  {&(_ZTV7ee10360[8]),  8,15},
  {&(_ZTV7ee10360[13]),  13,15},
  {&(_tg__ZTV6dd0360__7ee10360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee10360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee10360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee10360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10360[];
extern  VTBL_ENTRY _ZTV7ee10360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10360[];
static VTBL_ENTRY alt_thunk_names160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10360 = {  "ee10360", // class name
  bases_ee10360, 4,
  &(vtc_ee10360[0]), // expected_vtbl_contents
  &(vtt_ee10360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10360),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names160,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20360  : dd0360 {
  int e;
  virtual void  foo(); // _ZN7ee203603fooEv
  ~ee20360(); // tgen
  ee20360(); // tgen
};
//SIG(1 ee20360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee20360 ::foo(){vfunc_called(this, "_ZN7ee203603fooEv");}
ee20360 ::~ee20360(){ note_dtor("ee20360", this);} // tgen
ee20360 ::ee20360(){ note_ctor("ee20360", this);} // tgen

static void Test_ee20360()
{
  extern Class_Descriptor cd_ee20360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20360, buf);
    ee20360 *dp, &lv = *(dp=new (buf) ee20360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee20360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(24,16), "ee20360");
    check_base_class_offset(lv, (cc360*)(dd0360*), 0, "ee20360");
    check_base_class_offset(lv, (dd0360*), 0, "ee20360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20360.e");
    test_class_info(&lv, &cd_ee20360);
    dp->~ee20360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20360(Test_ee20360, "ee20360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20360C1Ev();
extern void _ZN7ee20360D1Ev();
Name_Map name_map_ee20360[] = {
  NSPAIR(_ZN7ee20360C1Ev),
  NSPAIR(_ZN7ee20360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee20360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20360[];
extern void _ZN7ee203603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee203603fooEv,_ZTv0_n16_N7ee203603fooEv)();
extern void ABISELECT(_ZThn24_N7ee203603fooEv,_ZThn16_N7ee203603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20360[0]),
  (VTBL_ENTRY)&_ZN7ee203603fooEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee203603fooEv,_ZTv0_n16_N7ee203603fooEv),
};
extern VTBL_ENTRY _ZTV7ee20360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee20360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee20360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee20360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee20360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee20360[] = {
  {&(_ZTV7ee20360[3]),  3,10},
  {&(_tg__ZTV6dd0360__7ee20360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee20360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee20360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee20360[4]),  4,6},
  {&(_ZTV7ee20360[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee20360[];
extern  VTBL_ENTRY _ZTV7ee20360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20360[];
static VTBL_ENTRY alt_thunk_names161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee203603fooEv,_ZTv0_n16_N7ee203603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee203603fooEv,_ZThn16_N7ee203603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20360 = {  "ee20360", // class name
  bases_ee20360, 4,
  &(vtc_ee20360[0]), // expected_vtbl_contents
  &(vtt_ee20360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20360),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20360),6, //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  ee30360  : virtual dd0360 {
  int e;
  virtual void  foo(); // _ZN7ee303603fooEv
  ~ee30360(); // tgen
  ee30360(); // tgen
};
//SIG(1 ee30360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee30360 ::foo(){vfunc_called(this, "_ZN7ee303603fooEv");}
ee30360 ::~ee30360(){ note_dtor("ee30360", this);} // tgen
ee30360 ::ee30360(){ note_ctor("ee30360", this);} // tgen

static void Test_ee30360()
{
  extern Class_Descriptor cd_ee30360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30360, buf);
    ee30360 *dp, &lv = *(dp=new (buf) ee30360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee30360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(32,20), "ee30360");
    check_base_class_offset(lv, (cc360*)(dd0360*), ABISELECT(16,8), "ee30360");
    check_base_class_offset(lv, (dd0360*), ABISELECT(16,8), "ee30360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30360.e");
    test_class_info(&lv, &cd_ee30360);
    dp->~ee30360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30360(Test_ee30360, "ee30360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30360C1Ev();
extern void _ZN7ee30360D1Ev();
Name_Map name_map_ee30360[] = {
  NSPAIR(_ZN7ee30360C1Ev),
  NSPAIR(_ZN7ee30360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee30360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30360[];
extern void _ZN7ee303603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee303603fooEv,_ZTv0_n16_N7ee303603fooEv)();
extern void ABISELECT(_ZThn16_N7ee303603fooEv,_ZThn8_N7ee303603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee303603fooEv,_ZTv0_n16_N7ee303603fooEv)();
extern void ABISELECT(_ZThn32_N7ee303603fooEv,_ZThn20_N7ee303603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30360[0]),
  (VTBL_ENTRY)&_ZN7ee303603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee303603fooEv,_ZTv0_n16_N7ee303603fooEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee303603fooEv,_ZTv0_n16_N7ee303603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee30360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee30360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee30360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee30360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee30360[] = {
  {&(_ZTV7ee30360[4]),  4,16},
  {&(_ZTV7ee30360[9]),  9,16},
  {&(_ZTV7ee30360[14]),  14,16},
  {&(_tg__ZTV6dd0360__7ee30360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee30360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee30360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee30360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30360[];
extern  VTBL_ENTRY _ZTV7ee30360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30360[];
static VTBL_ENTRY alt_thunk_names162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee303603fooEv,_ZTv0_n16_N7ee303603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee303603fooEv,_ZThn20_N7ee303603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee303603fooEv,_ZThn8_N7ee303603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30360 = {  "ee30360", // class name
  bases_ee30360, 4,
  &(vtc_ee30360[0]), // expected_vtbl_contents
  &(vtt_ee30360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names162,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40360  : dd0360 {
  int e;
  virtual void  bar(); // _ZN7ee403603barEv
  ~ee40360(); // tgen
  ee40360(); // tgen
};
//SIG(1 ee40360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee40360 ::bar(){vfunc_called(this, "_ZN7ee403603barEv");}
ee40360 ::~ee40360(){ note_dtor("ee40360", this);} // tgen
ee40360 ::ee40360(){ note_ctor("ee40360", this);} // tgen

static void Test_ee40360()
{
  extern Class_Descriptor cd_ee40360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40360, buf);
    ee40360 *dp, &lv = *(dp=new (buf) ee40360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee40360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(24,16), "ee40360");
    check_base_class_offset(lv, (cc360*)(dd0360*), 0, "ee40360");
    check_base_class_offset(lv, (dd0360*), 0, "ee40360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40360.e");
    test_class_info(&lv, &cd_ee40360);
    dp->~ee40360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40360(Test_ee40360, "ee40360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40360C1Ev();
extern void _ZN7ee40360D1Ev();
Name_Map name_map_ee40360[] = {
  NSPAIR(_ZN7ee40360C1Ev),
  NSPAIR(_ZN7ee40360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee40360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40360[];
extern void _ZN5cc3603fooEv();
extern void _ZN7ee403603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee403603barEv,_ZTv0_n12_N7ee403603barEv)();
extern void ABISELECT(_ZThn24_N7ee403603barEv,_ZThn16_N7ee403603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN7ee403603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee403603barEv,_ZTv0_n12_N7ee403603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee40360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee40360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee40360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee40360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee40360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee40360[] = {
  {&(_ZTV7ee40360[3]),  3,11},
  {&(_tg__ZTV6dd0360__7ee40360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee40360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee40360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee40360[4]),  4,6},
  {&(_ZTV7ee40360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee40360[];
extern  VTBL_ENTRY _ZTV7ee40360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40360[];
static VTBL_ENTRY alt_thunk_names163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee403603barEv,_ZTv0_n12_N7ee403603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee403603barEv,_ZThn16_N7ee403603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40360 = {  "ee40360", // class name
  bases_ee40360, 4,
  &(vtc_ee40360[0]), // expected_vtbl_contents
  &(vtt_ee40360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names163,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50360  : virtual dd0360 {
  int e;
  virtual void  bar(); // _ZN7ee503603barEv
  ~ee50360(); // tgen
  ee50360(); // tgen
};
//SIG(1 ee50360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee50360 ::bar(){vfunc_called(this, "_ZN7ee503603barEv");}
ee50360 ::~ee50360(){ note_dtor("ee50360", this);} // tgen
ee50360 ::ee50360(){ note_ctor("ee50360", this);} // tgen

static void Test_ee50360()
{
  extern Class_Descriptor cd_ee50360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50360, buf);
    ee50360 *dp, &lv = *(dp=new (buf) ee50360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee50360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(32,20), "ee50360");
    check_base_class_offset(lv, (cc360*)(dd0360*), ABISELECT(16,8), "ee50360");
    check_base_class_offset(lv, (dd0360*), ABISELECT(16,8), "ee50360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50360.e");
    test_class_info(&lv, &cd_ee50360);
    dp->~ee50360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50360(Test_ee50360, "ee50360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50360C1Ev();
extern void _ZN7ee50360D1Ev();
Name_Map name_map_ee50360[] = {
  NSPAIR(_ZN7ee50360C1Ev),
  NSPAIR(_ZN7ee50360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee50360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50360[];
extern void _ZN7ee503603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee503603barEv,_ZTv0_n12_N7ee503603barEv)();
extern void ABISELECT(_ZThn32_N7ee503603barEv,_ZThn20_N7ee503603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50360[0]),
  (VTBL_ENTRY)&_ZN7ee503603barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee503603barEv,_ZTv0_n12_N7ee503603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee50360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee50360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee50360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee50360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee50360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee50360[] = {
  {&(_ZTV7ee50360[4]),  4,16},
  {&(_ZTV7ee50360[9]),  9,16},
  {&(_ZTV7ee50360[14]),  14,16},
  {&(_tg__ZTV6dd0360__7ee50360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee50360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee50360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee50360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50360[];
extern  VTBL_ENTRY _ZTV7ee50360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50360[];
static VTBL_ENTRY alt_thunk_names164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee503603barEv,_ZTv0_n12_N7ee503603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee503603barEv,_ZThn20_N7ee503603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50360 = {  "ee50360", // class name
  bases_ee50360, 4,
  &(vtc_ee50360[0]), // expected_vtbl_contents
  &(vtt_ee50360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names164,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60360  : dd0360 {
  int e;
  virtual void  foo(); // _ZN7ee603603fooEv
  virtual void  bar(); // _ZN7ee603603barEv
  ~ee60360(); // tgen
  ee60360(); // tgen
};
//SIG(1 ee60360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee60360 ::foo(){vfunc_called(this, "_ZN7ee603603fooEv");}
void  ee60360 ::bar(){vfunc_called(this, "_ZN7ee603603barEv");}
ee60360 ::~ee60360(){ note_dtor("ee60360", this);} // tgen
ee60360 ::ee60360(){ note_ctor("ee60360", this);} // tgen

static void Test_ee60360()
{
  extern Class_Descriptor cd_ee60360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60360, buf);
    ee60360 *dp, &lv = *(dp=new (buf) ee60360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee60360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(24,16), "ee60360");
    check_base_class_offset(lv, (cc360*)(dd0360*), 0, "ee60360");
    check_base_class_offset(lv, (dd0360*), 0, "ee60360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60360.e");
    test_class_info(&lv, &cd_ee60360);
    dp->~ee60360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60360(Test_ee60360, "ee60360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60360C1Ev();
extern void _ZN7ee60360D1Ev();
Name_Map name_map_ee60360[] = {
  NSPAIR(_ZN7ee60360C1Ev),
  NSPAIR(_ZN7ee60360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee60360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60360[];
extern void _ZN7ee603603fooEv();
extern void _ZN7ee603603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee603603barEv,_ZTv0_n12_N7ee603603barEv)();
extern void ABISELECT(_ZThn24_N7ee603603barEv,_ZThn16_N7ee603603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee603603fooEv,_ZTv0_n16_N7ee603603fooEv)();
extern void ABISELECT(_ZThn24_N7ee603603fooEv,_ZThn16_N7ee603603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60360[0]),
  (VTBL_ENTRY)&_ZN7ee603603fooEv,
  (VTBL_ENTRY)&_ZN7ee603603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee603603barEv,_ZTv0_n12_N7ee603603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee603603fooEv,_ZTv0_n16_N7ee603603fooEv),
};
extern VTBL_ENTRY _ZTV7ee60360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee60360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee60360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee60360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee60360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee60360[] = {
  {&(_ZTV7ee60360[3]),  3,11},
  {&(_tg__ZTV6dd0360__7ee60360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee60360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee60360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee60360[4]),  4,6},
  {&(_ZTV7ee60360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60360[];
extern  VTBL_ENTRY _ZTV7ee60360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60360[];
static VTBL_ENTRY alt_thunk_names165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee603603fooEv,_ZTv0_n16_N7ee603603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee603603fooEv,_ZThn16_N7ee603603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee603603barEv,_ZTv0_n12_N7ee603603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee603603barEv,_ZThn16_N7ee603603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60360 = {  "ee60360", // class name
  bases_ee60360, 4,
  &(vtc_ee60360[0]), // expected_vtbl_contents
  &(vtt_ee60360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names165,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70360  : virtual dd0360 {
  int e;
  virtual void  foo(); // _ZN7ee703603fooEv
  virtual void  bar(); // _ZN7ee703603barEv
  ~ee70360(); // tgen
  ee70360(); // tgen
};
//SIG(1 ee70360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee70360 ::foo(){vfunc_called(this, "_ZN7ee703603fooEv");}
void  ee70360 ::bar(){vfunc_called(this, "_ZN7ee703603barEv");}
ee70360 ::~ee70360(){ note_dtor("ee70360", this);} // tgen
ee70360 ::ee70360(){ note_ctor("ee70360", this);} // tgen

static void Test_ee70360()
{
  extern Class_Descriptor cd_ee70360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70360, buf);
    ee70360 *dp, &lv = *(dp=new (buf) ee70360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee70360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd0360*), ABISELECT(32,20), "ee70360");
    check_base_class_offset(lv, (cc360*)(dd0360*), ABISELECT(16,8), "ee70360");
    check_base_class_offset(lv, (dd0360*), ABISELECT(16,8), "ee70360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70360.e");
    test_class_info(&lv, &cd_ee70360);
    dp->~ee70360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70360(Test_ee70360, "ee70360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70360C1Ev();
extern void _ZN7ee70360D1Ev();
Name_Map name_map_ee70360[] = {
  NSPAIR(_ZN7ee70360C1Ev),
  NSPAIR(_ZN7ee70360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd0360;
extern VTBL_ENTRY _ZTI6dd0360[];
extern  VTBL_ENTRY _ZTV6dd0360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0360[];
static Base_Class bases_ee70360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70360[];
extern void _ZN7ee703603fooEv();
extern void _ZN7ee703603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee703603fooEv,_ZTv0_n16_N7ee703603fooEv)();
extern void ABISELECT(_ZThn16_N7ee703603fooEv,_ZThn8_N7ee703603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee703603barEv,_ZTv0_n12_N7ee703603barEv)();
extern void ABISELECT(_ZThn32_N7ee703603barEv,_ZThn20_N7ee703603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee703603fooEv,_ZTv0_n16_N7ee703603fooEv)();
extern void ABISELECT(_ZThn32_N7ee703603fooEv,_ZThn20_N7ee703603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70360[0]),
  (VTBL_ENTRY)&_ZN7ee703603fooEv,
  (VTBL_ENTRY)&_ZN7ee703603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee703603fooEv,_ZTv0_n16_N7ee703603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee703603barEv,_ZTv0_n12_N7ee703603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee703603fooEv,_ZTv0_n16_N7ee703603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0360__7ee70360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd0360__7ee70360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd0360__7ee70360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0360__7ee70360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee70360[] = {
  {&(_ZTV7ee70360[4]),  4,17},
  {&(_ZTV7ee70360[10]),  10,17},
  {&(_ZTV7ee70360[15]),  15,17},
  {&(_tg__ZTV6dd0360__7ee70360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd0360__7ee70360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd0360__7ee70360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0360__7ee70360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70360[];
extern  VTBL_ENTRY _ZTV7ee70360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70360[];
static VTBL_ENTRY alt_thunk_names166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee703603barEv,_ZTv0_n12_N7ee703603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee703603barEv,_ZThn20_N7ee703603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee703603fooEv,_ZTv0_n16_N7ee703603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee703603fooEv,_ZThn20_N7ee703603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee703603fooEv,_ZThn8_N7ee703603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70360 = {  "ee70360", // class name
  bases_ee70360, 4,
  &(vtc_ee70360[0]), // expected_vtbl_contents
  &(vtt_ee70360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names166,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1360  : virtual cc360 {
  int d;
  ~dd1360(); // tgen
  dd1360(); // tgen
};
//SIG(-1 dd1360) C1{ VBC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} Fi}


dd1360 ::~dd1360(){ note_dtor("dd1360", this);} // tgen
dd1360 ::dd1360(){ note_ctor("dd1360", this);} // tgen

static void Test_dd1360()
{
  extern Class_Descriptor cd_dd1360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1360, buf);
    dd1360 *dp, &lv = *(dp=new (buf) dd1360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd1360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,16), "dd1360");
    check_base_class_offset(lv, (cc360*), ABISELECT(16,8), "dd1360");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1360.d");
    test_class_info(&lv, &cd_dd1360);
    dp->~dd1360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1360(Test_dd1360, "dd1360", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1360C1Ev();
extern void _ZN6dd1360D1Ev();
Name_Map name_map_dd1360[] = {
  NSPAIR(_ZN6dd1360C1Ev),
  NSPAIR(_ZN6dd1360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd1360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1360[];
extern void _ZN5cc3603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd1360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV6dd1360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd1360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd1360[] = {
  {&(_ZTV6dd1360[4]),  4,15},
  {&(_ZTV6dd1360[8]),  8,15},
  {&(_ZTV6dd1360[13]),  13,15},
  {&(_tg__ZTV5cc360__6dd1360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd1360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static VTBL_ENTRY alt_thunk_names167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1360 = {  "dd1360", // class name
  bases_dd1360, 3,
  &(vtc_dd1360[0]), // expected_vtbl_contents
  &(vtt_dd1360[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1360),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1360),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names167,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01360  : dd1360 {
  int e;
  ~ee01360(); // tgen
  ee01360(); // tgen
};
//SIG(1 ee01360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee01360 ::~ee01360(){ note_dtor("ee01360", this);} // tgen
ee01360 ::ee01360(){ note_ctor("ee01360", this);} // tgen

static void Test_ee01360()
{
  extern Class_Descriptor cd_ee01360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01360, buf);
    ee01360 *dp, &lv = *(dp=new (buf) ee01360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee01360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee01360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(16,12), "ee01360");
    check_base_class_offset(lv, (dd1360*), 0, "ee01360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01360.e");
    test_class_info(&lv, &cd_ee01360);
    dp->~ee01360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01360(Test_ee01360, "ee01360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01360C1Ev();
extern void _ZN7ee01360D1Ev();
Name_Map name_map_ee01360[] = {
  NSPAIR(_ZN7ee01360C1Ev),
  NSPAIR(_ZN7ee01360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee01360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01360[];
extern void _ZN5cc3603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee01360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01360[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee01360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee01360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee01360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee01360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee01360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee01360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee01360[] = {
  {&(_ZTV7ee01360[4]),  4,15},
  {&(_tg__ZTV6dd1360__7ee01360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee01360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee01360[4]),  4,6},
  {&(_ZTV7ee01360[8]),  8,15},
  {&(_ZTV7ee01360[13]),  13,15},
  {&(_tg__ZTV5cc360__7ee01360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee01360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01360[];
extern  VTBL_ENTRY _ZTV7ee01360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01360[];
static VTBL_ENTRY alt_thunk_names168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01360 = {  "ee01360", // class name
  bases_ee01360, 4,
  &(vtc_ee01360[0]), // expected_vtbl_contents
  &(vtt_ee01360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01360),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names168,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11360  : virtual dd1360 {
  int e;
  ~ee11360(); // tgen
  ee11360(); // tgen
};
//SIG(1 ee11360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee11360 ::~ee11360(){ note_dtor("ee11360", this);} // tgen
ee11360 ::ee11360(){ note_ctor("ee11360", this);} // tgen

static void Test_ee11360()
{
  extern Class_Descriptor cd_ee11360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11360, buf);
    ee11360 *dp, &lv = *(dp=new (buf) ee11360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee11360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee11360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(32,16), "ee11360");
    check_base_class_offset(lv, (dd1360*), ABISELECT(16,8), "ee11360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11360.e");
    test_class_info(&lv, &cd_ee11360);
    dp->~ee11360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11360(Test_ee11360, "ee11360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11360C1Ev();
extern void _ZN7ee11360D1Ev();
Name_Map name_map_ee11360[] = {
  NSPAIR(_ZN7ee11360C1Ev),
  NSPAIR(_ZN7ee11360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee11360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11360[];
extern void _ZN5cc3603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee11360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11360[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11360[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee11360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee11360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee11360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee11360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee11360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee11360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee11360[] = {
  {&(_ZTV7ee11360[5]),  5,20},
  {&(_ZTV7ee11360[9]),  9,20},
  {&(_ZTV7ee11360[13]),  13,20},
  {&(_ZTV7ee11360[18]),  18,20},
  {&(_tg__ZTV6dd1360__7ee11360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee11360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee11360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee11360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee11360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11360[];
extern  VTBL_ENTRY _ZTV7ee11360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11360[];
static VTBL_ENTRY alt_thunk_names169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11360 = {  "ee11360", // class name
  bases_ee11360, 4,
  &(vtc_ee11360[0]), // expected_vtbl_contents
  &(vtt_ee11360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11360),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names169,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21360  : dd1360 {
  int e;
  virtual void  foo(); // _ZN7ee213603fooEv
  ~ee21360(); // tgen
  ee21360(); // tgen
};
//SIG(1 ee21360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee21360 ::foo(){vfunc_called(this, "_ZN7ee213603fooEv");}
ee21360 ::~ee21360(){ note_dtor("ee21360", this);} // tgen
ee21360 ::ee21360(){ note_ctor("ee21360", this);} // tgen

static void Test_ee21360()
{
  extern Class_Descriptor cd_ee21360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21360, buf);
    ee21360 *dp, &lv = *(dp=new (buf) ee21360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee21360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee21360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(16,12), "ee21360");
    check_base_class_offset(lv, (dd1360*), 0, "ee21360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21360.e");
    test_class_info(&lv, &cd_ee21360);
    dp->~ee21360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21360(Test_ee21360, "ee21360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21360C1Ev();
extern void _ZN7ee21360D1Ev();
Name_Map name_map_ee21360[] = {
  NSPAIR(_ZN7ee21360C1Ev),
  NSPAIR(_ZN7ee21360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee21360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21360[];
extern void _ZN7ee213603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee213603fooEv,_ZTv0_n16_N7ee213603fooEv)();
extern void ABISELECT(_ZThn16_N7ee213603fooEv,_ZThn12_N7ee213603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee213603fooEv,_ZTv0_n16_N7ee213603fooEv)();
extern void ABISELECT(_ZThn32_N7ee213603fooEv,_ZThn20_N7ee213603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21360[0]),
  (VTBL_ENTRY)&_ZN7ee213603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee213603fooEv,_ZTv0_n16_N7ee213603fooEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee213603fooEv,_ZTv0_n16_N7ee213603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee21360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee21360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee21360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee21360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee21360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee21360[] = {
  {&(_ZTV7ee21360[4]),  4,16},
  {&(_tg__ZTV6dd1360__7ee21360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee21360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee21360[4]),  4,6},
  {&(_ZTV7ee21360[9]),  9,16},
  {&(_ZTV7ee21360[14]),  14,16},
  {&(_tg__ZTV5cc360__7ee21360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee21360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21360[];
extern  VTBL_ENTRY _ZTV7ee21360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21360[];
static VTBL_ENTRY alt_thunk_names170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee213603fooEv,_ZTv0_n16_N7ee213603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee213603fooEv,_ZThn20_N7ee213603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee213603fooEv,_ZThn12_N7ee213603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21360 = {  "ee21360", // class name
  bases_ee21360, 4,
  &(vtc_ee21360[0]), // expected_vtbl_contents
  &(vtt_ee21360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31360  : virtual dd1360 {
  int e;
  virtual void  foo(); // _ZN7ee313603fooEv
  ~ee31360(); // tgen
  ee31360(); // tgen
};
//SIG(1 ee31360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee31360 ::foo(){vfunc_called(this, "_ZN7ee313603fooEv");}
ee31360 ::~ee31360(){ note_dtor("ee31360", this);} // tgen
ee31360 ::ee31360(){ note_ctor("ee31360", this);} // tgen

static void Test_ee31360()
{
  extern Class_Descriptor cd_ee31360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31360, buf);
    ee31360 *dp, &lv = *(dp=new (buf) ee31360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee31360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee31360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(32,16), "ee31360");
    check_base_class_offset(lv, (dd1360*), ABISELECT(16,8), "ee31360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31360.e");
    test_class_info(&lv, &cd_ee31360);
    dp->~ee31360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31360(Test_ee31360, "ee31360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31360C1Ev();
extern void _ZN7ee31360D1Ev();
Name_Map name_map_ee31360[] = {
  NSPAIR(_ZN7ee31360C1Ev),
  NSPAIR(_ZN7ee31360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee31360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31360[];
extern void _ZN7ee313603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee313603fooEv,_ZTv0_n16_N7ee313603fooEv)();
extern void ABISELECT(_ZThn32_N7ee313603fooEv,_ZThn16_N7ee313603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee313603fooEv,_ZTv0_n16_N7ee313603fooEv)();
extern void ABISELECT(_ZThn48_N7ee313603fooEv,_ZThn24_N7ee313603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31360[0]),
  (VTBL_ENTRY)&_ZN7ee313603fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31360[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee313603fooEv,_ZTv0_n16_N7ee313603fooEv),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee313603fooEv,_ZTv0_n16_N7ee313603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee31360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee31360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee31360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee31360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee31360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee31360[] = {
  {&(_ZTV7ee31360[5]),  5,21},
  {&(_ZTV7ee31360[10]),  10,21},
  {&(_ZTV7ee31360[14]),  14,21},
  {&(_ZTV7ee31360[19]),  19,21},
  {&(_tg__ZTV6dd1360__7ee31360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee31360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee31360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee31360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee31360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31360[];
extern  VTBL_ENTRY _ZTV7ee31360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31360[];
static VTBL_ENTRY alt_thunk_names171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee313603fooEv,_ZTv0_n16_N7ee313603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee313603fooEv,_ZThn24_N7ee313603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee313603fooEv,_ZThn16_N7ee313603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31360 = {  "ee31360", // class name
  bases_ee31360, 4,
  &(vtc_ee31360[0]), // expected_vtbl_contents
  &(vtt_ee31360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31360),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names171,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41360  : dd1360 {
  int e;
  virtual void  bar(); // _ZN7ee413603barEv
  ~ee41360(); // tgen
  ee41360(); // tgen
};
//SIG(1 ee41360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee41360 ::bar(){vfunc_called(this, "_ZN7ee413603barEv");}
ee41360 ::~ee41360(){ note_dtor("ee41360", this);} // tgen
ee41360 ::ee41360(){ note_ctor("ee41360", this);} // tgen

static void Test_ee41360()
{
  extern Class_Descriptor cd_ee41360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41360, buf);
    ee41360 *dp, &lv = *(dp=new (buf) ee41360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee41360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee41360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(16,12), "ee41360");
    check_base_class_offset(lv, (dd1360*), 0, "ee41360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41360.e");
    test_class_info(&lv, &cd_ee41360);
    dp->~ee41360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41360(Test_ee41360, "ee41360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41360C1Ev();
extern void _ZN7ee41360D1Ev();
Name_Map name_map_ee41360[] = {
  NSPAIR(_ZN7ee41360C1Ev),
  NSPAIR(_ZN7ee41360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee41360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41360[];
extern void _ZN7ee413603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee413603barEv,_ZTv0_n12_N7ee413603barEv)();
extern void ABISELECT(_ZThn32_N7ee413603barEv,_ZThn20_N7ee413603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41360[0]),
  (VTBL_ENTRY)&_ZN7ee413603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee413603barEv,_ZTv0_n12_N7ee413603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee41360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee41360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee41360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee41360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee41360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee41360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee41360[] = {
  {&(_ZTV7ee41360[4]),  4,16},
  {&(_tg__ZTV6dd1360__7ee41360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee41360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee41360[4]),  4,6},
  {&(_ZTV7ee41360[9]),  9,16},
  {&(_ZTV7ee41360[14]),  14,16},
  {&(_tg__ZTV5cc360__7ee41360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee41360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41360[];
extern  VTBL_ENTRY _ZTV7ee41360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41360[];
static VTBL_ENTRY alt_thunk_names172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee413603barEv,_ZTv0_n12_N7ee413603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee413603barEv,_ZThn20_N7ee413603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41360 = {  "ee41360", // class name
  bases_ee41360, 4,
  &(vtc_ee41360[0]), // expected_vtbl_contents
  &(vtt_ee41360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names172,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51360  : virtual dd1360 {
  int e;
  virtual void  bar(); // _ZN7ee513603barEv
  ~ee51360(); // tgen
  ee51360(); // tgen
};
//SIG(1 ee51360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee51360 ::bar(){vfunc_called(this, "_ZN7ee513603barEv");}
ee51360 ::~ee51360(){ note_dtor("ee51360", this);} // tgen
ee51360 ::ee51360(){ note_ctor("ee51360", this);} // tgen

static void Test_ee51360()
{
  extern Class_Descriptor cd_ee51360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51360, buf);
    ee51360 *dp, &lv = *(dp=new (buf) ee51360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee51360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee51360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(32,16), "ee51360");
    check_base_class_offset(lv, (dd1360*), ABISELECT(16,8), "ee51360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51360.e");
    test_class_info(&lv, &cd_ee51360);
    dp->~ee51360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51360(Test_ee51360, "ee51360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51360C1Ev();
extern void _ZN7ee51360D1Ev();
Name_Map name_map_ee51360[] = {
  NSPAIR(_ZN7ee51360C1Ev),
  NSPAIR(_ZN7ee51360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee51360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51360[];
extern void _ZN7ee513603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee513603barEv,_ZTv0_n12_N7ee513603barEv)();
extern void ABISELECT(_ZThn48_N7ee513603barEv,_ZThn24_N7ee513603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51360[0]),
  (VTBL_ENTRY)&_ZN7ee513603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51360[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee513603barEv,_ZTv0_n12_N7ee513603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee51360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee51360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee51360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee51360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee51360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee51360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee51360[] = {
  {&(_ZTV7ee51360[5]),  5,21},
  {&(_ZTV7ee51360[10]),  10,21},
  {&(_ZTV7ee51360[14]),  14,21},
  {&(_ZTV7ee51360[19]),  19,21},
  {&(_tg__ZTV6dd1360__7ee51360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee51360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee51360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee51360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee51360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51360[];
extern  VTBL_ENTRY _ZTV7ee51360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51360[];
static VTBL_ENTRY alt_thunk_names173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee513603barEv,_ZTv0_n12_N7ee513603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee513603barEv,_ZThn24_N7ee513603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51360 = {  "ee51360", // class name
  bases_ee51360, 4,
  &(vtc_ee51360[0]), // expected_vtbl_contents
  &(vtt_ee51360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51360),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names173,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61360  : dd1360 {
  int e;
  virtual void  foo(); // _ZN7ee613603fooEv
  virtual void  bar(); // _ZN7ee613603barEv
  ~ee61360(); // tgen
  ee61360(); // tgen
};
//SIG(1 ee61360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee61360 ::foo(){vfunc_called(this, "_ZN7ee613603fooEv");}
void  ee61360 ::bar(){vfunc_called(this, "_ZN7ee613603barEv");}
ee61360 ::~ee61360(){ note_dtor("ee61360", this);} // tgen
ee61360 ::ee61360(){ note_ctor("ee61360", this);} // tgen

static void Test_ee61360()
{
  extern Class_Descriptor cd_ee61360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61360, buf);
    ee61360 *dp, &lv = *(dp=new (buf) ee61360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee61360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee61360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(16,12), "ee61360");
    check_base_class_offset(lv, (dd1360*), 0, "ee61360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61360.e");
    test_class_info(&lv, &cd_ee61360);
    dp->~ee61360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61360(Test_ee61360, "ee61360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61360C1Ev();
extern void _ZN7ee61360D1Ev();
Name_Map name_map_ee61360[] = {
  NSPAIR(_ZN7ee61360C1Ev),
  NSPAIR(_ZN7ee61360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee61360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61360[];
extern void _ZN7ee613603fooEv();
extern void _ZN7ee613603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee613603fooEv,_ZTv0_n16_N7ee613603fooEv)();
extern void ABISELECT(_ZThn16_N7ee613603fooEv,_ZThn12_N7ee613603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee613603barEv,_ZTv0_n12_N7ee613603barEv)();
extern void ABISELECT(_ZThn32_N7ee613603barEv,_ZThn20_N7ee613603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee613603fooEv,_ZTv0_n16_N7ee613603fooEv)();
extern void ABISELECT(_ZThn32_N7ee613603fooEv,_ZThn20_N7ee613603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61360[0]),
  (VTBL_ENTRY)&_ZN7ee613603fooEv,
  (VTBL_ENTRY)&_ZN7ee613603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee613603fooEv,_ZTv0_n16_N7ee613603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee613603barEv,_ZTv0_n12_N7ee613603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee613603fooEv,_ZTv0_n16_N7ee613603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee61360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee61360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee61360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee61360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee61360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee61360[] = {
  {&(_ZTV7ee61360[4]),  4,17},
  {&(_tg__ZTV6dd1360__7ee61360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee61360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee61360[4]),  4,6},
  {&(_ZTV7ee61360[10]),  10,17},
  {&(_ZTV7ee61360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee61360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee61360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61360[];
extern  VTBL_ENTRY _ZTV7ee61360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61360[];
static VTBL_ENTRY alt_thunk_names174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee613603barEv,_ZTv0_n12_N7ee613603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee613603barEv,_ZThn20_N7ee613603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee613603fooEv,_ZTv0_n16_N7ee613603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee613603fooEv,_ZThn20_N7ee613603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee613603fooEv,_ZThn12_N7ee613603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61360 = {  "ee61360", // class name
  bases_ee61360, 4,
  &(vtc_ee61360[0]), // expected_vtbl_contents
  &(vtt_ee61360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names174,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71360  : virtual dd1360 {
  int e;
  virtual void  foo(); // _ZN7ee713603fooEv
  virtual void  bar(); // _ZN7ee713603barEv
  ~ee71360(); // tgen
  ee71360(); // tgen
};
//SIG(1 ee71360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee71360 ::foo(){vfunc_called(this, "_ZN7ee713603fooEv");}
void  ee71360 ::bar(){vfunc_called(this, "_ZN7ee713603barEv");}
ee71360 ::~ee71360(){ note_dtor("ee71360", this);} // tgen
ee71360 ::ee71360(){ note_ctor("ee71360", this);} // tgen

static void Test_ee71360()
{
  extern Class_Descriptor cd_ee71360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71360, buf);
    ee71360 *dp, &lv = *(dp=new (buf) ee71360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee71360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee71360");
    check_base_class_offset(lv, (cc360*)(dd1360*), ABISELECT(32,16), "ee71360");
    check_base_class_offset(lv, (dd1360*), ABISELECT(16,8), "ee71360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71360.e");
    test_class_info(&lv, &cd_ee71360);
    dp->~ee71360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71360(Test_ee71360, "ee71360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71360C1Ev();
extern void _ZN7ee71360D1Ev();
Name_Map name_map_ee71360[] = {
  NSPAIR(_ZN7ee71360C1Ev),
  NSPAIR(_ZN7ee71360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd1360;
extern VTBL_ENTRY _ZTI6dd1360[];
extern  VTBL_ENTRY _ZTV6dd1360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1360[];
static Base_Class bases_ee71360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee71360[];
extern void _ZN7ee713603fooEv();
extern void _ZN7ee713603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee713603fooEv,_ZTv0_n16_N7ee713603fooEv)();
extern void ABISELECT(_ZThn32_N7ee713603fooEv,_ZThn16_N7ee713603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee713603barEv,_ZTv0_n12_N7ee713603barEv)();
extern void ABISELECT(_ZThn48_N7ee713603barEv,_ZThn24_N7ee713603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee713603fooEv,_ZTv0_n16_N7ee713603fooEv)();
extern void ABISELECT(_ZThn48_N7ee713603fooEv,_ZThn24_N7ee713603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71360[0]),
  (VTBL_ENTRY)&_ZN7ee713603fooEv,
  (VTBL_ENTRY)&_ZN7ee713603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71360[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee713603fooEv,_ZTv0_n16_N7ee713603fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee713603barEv,_ZTv0_n12_N7ee713603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee713603fooEv,_ZTv0_n16_N7ee713603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71360[];
static  VTBL_ENTRY _tg__ZTV6dd1360__7ee71360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd1360__7ee71360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1360__7ee71360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee71360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee71360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee71360[] = {
  {&(_ZTV7ee71360[5]),  5,22},
  {&(_ZTV7ee71360[11]),  11,22},
  {&(_ZTV7ee71360[15]),  15,22},
  {&(_ZTV7ee71360[20]),  20,22},
  {&(_tg__ZTV6dd1360__7ee71360[4]),  4,4},
  {&(_tg__ZTV5cc360__6dd1360__7ee71360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1360__7ee71360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee71360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee71360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71360[];
extern  VTBL_ENTRY _ZTV7ee71360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71360[];
static VTBL_ENTRY alt_thunk_names175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee713603barEv,_ZTv0_n12_N7ee713603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee713603barEv,_ZThn24_N7ee713603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee713603fooEv,_ZTv0_n16_N7ee713603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee713603fooEv,_ZThn24_N7ee713603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee713603fooEv,_ZThn16_N7ee713603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71360 = {  "ee71360", // class name
  bases_ee71360, 4,
  &(vtc_ee71360[0]), // expected_vtbl_contents
  &(vtt_ee71360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71360),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71360),9, //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  dd2360  : cc360 {
  int d;
  virtual void  foo(); // _ZN6dd23603fooEv
  ~dd2360(); // tgen
  dd2360(); // tgen
};
//SIG(-1 dd2360) C1{ BC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd2360 ::foo(){vfunc_called(this, "_ZN6dd23603fooEv");}
dd2360 ::~dd2360(){ note_dtor("dd2360", this);} // tgen
dd2360 ::dd2360(){ note_ctor("dd2360", this);} // tgen

static void Test_dd2360()
{
  extern Class_Descriptor cd_dd2360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2360, buf);
    dd2360 *dp, &lv = *(dp=new (buf) dd2360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd2360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(16,12), "dd2360");
    check_base_class_offset(lv, (cc360*), 0, "dd2360");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2360.d");
    test_class_info(&lv, &cd_dd2360);
    dp->~dd2360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2360(Test_dd2360, "dd2360", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2360C1Ev();
extern void _ZN6dd2360D1Ev();
Name_Map name_map_dd2360[] = {
  NSPAIR(_ZN6dd2360C1Ev),
  NSPAIR(_ZN6dd2360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd2360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2360[];
extern void _ZN6dd23603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
extern VTBL_ENTRY _ZTV6dd2360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd2360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd2360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd2360[] = {
  {&(_ZTV6dd2360[3]),  3,10},
  {&(_tg__ZTV5cc360__6dd2360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd2360[4]),  4,6},
  {&(_ZTV6dd2360[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static VTBL_ENTRY alt_thunk_names176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2360 = {  "dd2360", // class name
  bases_dd2360, 3,
  &(vtc_dd2360[0]), // expected_vtbl_contents
  &(vtt_dd2360[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2360),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2360),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names176,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02360  : dd2360 {
  int e;
  ~ee02360(); // tgen
  ee02360(); // tgen
};
//SIG(1 ee02360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee02360 ::~ee02360(){ note_dtor("ee02360", this);} // tgen
ee02360 ::ee02360(){ note_ctor("ee02360", this);} // tgen

static void Test_ee02360()
{
  extern Class_Descriptor cd_ee02360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02360, buf);
    ee02360 *dp, &lv = *(dp=new (buf) ee02360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee02360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(24,16), "ee02360");
    check_base_class_offset(lv, (cc360*)(dd2360*), 0, "ee02360");
    check_base_class_offset(lv, (dd2360*), 0, "ee02360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02360.e");
    test_class_info(&lv, &cd_ee02360);
    dp->~ee02360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02360(Test_ee02360, "ee02360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02360C1Ev();
extern void _ZN7ee02360D1Ev();
Name_Map name_map_ee02360[] = {
  NSPAIR(_ZN7ee02360C1Ev),
  NSPAIR(_ZN7ee02360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee02360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02360[];
extern void _ZN6dd23603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
extern VTBL_ENTRY _ZTV7ee02360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee02360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee02360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee02360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee02360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee02360[] = {
  {&(_ZTV7ee02360[3]),  3,10},
  {&(_tg__ZTV6dd2360__7ee02360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee02360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee02360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee02360[4]),  4,6},
  {&(_ZTV7ee02360[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee02360[];
extern  VTBL_ENTRY _ZTV7ee02360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02360[];
static VTBL_ENTRY alt_thunk_names177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02360 = {  "ee02360", // class name
  bases_ee02360, 4,
  &(vtc_ee02360[0]), // expected_vtbl_contents
  &(vtt_ee02360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02360),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02360),6, //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  ee12360  : virtual dd2360 {
  int e;
  ~ee12360(); // tgen
  ee12360(); // tgen
};
//SIG(1 ee12360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee12360 ::~ee12360(){ note_dtor("ee12360", this);} // tgen
ee12360 ::ee12360(){ note_ctor("ee12360", this);} // tgen

static void Test_ee12360()
{
  extern Class_Descriptor cd_ee12360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12360, buf);
    ee12360 *dp, &lv = *(dp=new (buf) ee12360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee12360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(32,20), "ee12360");
    check_base_class_offset(lv, (cc360*)(dd2360*), ABISELECT(16,8), "ee12360");
    check_base_class_offset(lv, (dd2360*), ABISELECT(16,8), "ee12360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12360.e");
    test_class_info(&lv, &cd_ee12360);
    dp->~ee12360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12360(Test_ee12360, "ee12360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12360C1Ev();
extern void _ZN7ee12360D1Ev();
Name_Map name_map_ee12360[] = {
  NSPAIR(_ZN7ee12360C1Ev),
  NSPAIR(_ZN7ee12360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee12360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12360[];
extern void _ZN6dd23603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12360[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
extern VTBL_ENTRY _ZTV7ee12360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee12360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee12360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee12360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee12360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee12360[] = {
  {&(_ZTV7ee12360[4]),  4,15},
  {&(_ZTV7ee12360[8]),  8,15},
  {&(_ZTV7ee12360[13]),  13,15},
  {&(_tg__ZTV6dd2360__7ee12360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee12360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee12360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee12360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12360[];
extern  VTBL_ENTRY _ZTV7ee12360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12360[];
static VTBL_ENTRY alt_thunk_names178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12360 = {  "ee12360", // class name
  bases_ee12360, 4,
  &(vtc_ee12360[0]), // expected_vtbl_contents
  &(vtt_ee12360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12360),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12360),7, //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  ee22360  : dd2360 {
  int e;
  virtual void  foo(); // _ZN7ee223603fooEv
  ~ee22360(); // tgen
  ee22360(); // tgen
};
//SIG(1 ee22360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee22360 ::foo(){vfunc_called(this, "_ZN7ee223603fooEv");}
ee22360 ::~ee22360(){ note_dtor("ee22360", this);} // tgen
ee22360 ::ee22360(){ note_ctor("ee22360", this);} // tgen

static void Test_ee22360()
{
  extern Class_Descriptor cd_ee22360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22360, buf);
    ee22360 *dp, &lv = *(dp=new (buf) ee22360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee22360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(24,16), "ee22360");
    check_base_class_offset(lv, (cc360*)(dd2360*), 0, "ee22360");
    check_base_class_offset(lv, (dd2360*), 0, "ee22360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22360.e");
    test_class_info(&lv, &cd_ee22360);
    dp->~ee22360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22360(Test_ee22360, "ee22360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22360C1Ev();
extern void _ZN7ee22360D1Ev();
Name_Map name_map_ee22360[] = {
  NSPAIR(_ZN7ee22360C1Ev),
  NSPAIR(_ZN7ee22360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee22360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22360[];
extern void _ZN7ee223603fooEv();
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee223603fooEv,_ZTv0_n16_N7ee223603fooEv)();
extern void ABISELECT(_ZThn24_N7ee223603fooEv,_ZThn16_N7ee223603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22360[0]),
  (VTBL_ENTRY)&_ZN7ee223603fooEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee223603fooEv,_ZTv0_n16_N7ee223603fooEv),
};
extern VTBL_ENTRY _ZTV7ee22360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee22360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee22360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee22360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee22360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee22360[] = {
  {&(_ZTV7ee22360[3]),  3,10},
  {&(_tg__ZTV6dd2360__7ee22360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee22360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee22360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee22360[4]),  4,6},
  {&(_ZTV7ee22360[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee22360[];
extern  VTBL_ENTRY _ZTV7ee22360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22360[];
static VTBL_ENTRY alt_thunk_names179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee223603fooEv,_ZTv0_n16_N7ee223603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee223603fooEv,_ZThn16_N7ee223603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22360 = {  "ee22360", // class name
  bases_ee22360, 4,
  &(vtc_ee22360[0]), // expected_vtbl_contents
  &(vtt_ee22360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22360),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22360),6, //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  ee32360  : virtual dd2360 {
  int e;
  virtual void  foo(); // _ZN7ee323603fooEv
  ~ee32360(); // tgen
  ee32360(); // tgen
};
//SIG(1 ee32360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee32360 ::foo(){vfunc_called(this, "_ZN7ee323603fooEv");}
ee32360 ::~ee32360(){ note_dtor("ee32360", this);} // tgen
ee32360 ::ee32360(){ note_ctor("ee32360", this);} // tgen

static void Test_ee32360()
{
  extern Class_Descriptor cd_ee32360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32360, buf);
    ee32360 *dp, &lv = *(dp=new (buf) ee32360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee32360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(32,20), "ee32360");
    check_base_class_offset(lv, (cc360*)(dd2360*), ABISELECT(16,8), "ee32360");
    check_base_class_offset(lv, (dd2360*), ABISELECT(16,8), "ee32360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32360.e");
    test_class_info(&lv, &cd_ee32360);
    dp->~ee32360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32360(Test_ee32360, "ee32360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32360C1Ev();
extern void _ZN7ee32360D1Ev();
Name_Map name_map_ee32360[] = {
  NSPAIR(_ZN7ee32360C1Ev),
  NSPAIR(_ZN7ee32360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee32360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32360[];
extern void _ZN7ee323603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee323603fooEv,_ZTv0_n16_N7ee323603fooEv)();
extern void ABISELECT(_ZThn16_N7ee323603fooEv,_ZThn8_N7ee323603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee323603fooEv,_ZTv0_n16_N7ee323603fooEv)();
extern void ABISELECT(_ZThn32_N7ee323603fooEv,_ZThn20_N7ee323603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32360[0]),
  (VTBL_ENTRY)&_ZN7ee323603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee323603fooEv,_ZTv0_n16_N7ee323603fooEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee323603fooEv,_ZTv0_n16_N7ee323603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee32360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee32360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee32360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee32360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee32360[] = {
  {&(_ZTV7ee32360[4]),  4,16},
  {&(_ZTV7ee32360[9]),  9,16},
  {&(_ZTV7ee32360[14]),  14,16},
  {&(_tg__ZTV6dd2360__7ee32360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee32360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee32360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee32360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32360[];
extern  VTBL_ENTRY _ZTV7ee32360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32360[];
static VTBL_ENTRY alt_thunk_names180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee323603fooEv,_ZTv0_n16_N7ee323603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee323603fooEv,_ZThn20_N7ee323603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee323603fooEv,_ZThn8_N7ee323603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32360 = {  "ee32360", // class name
  bases_ee32360, 4,
  &(vtc_ee32360[0]), // expected_vtbl_contents
  &(vtt_ee32360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names180,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42360  : dd2360 {
  int e;
  virtual void  bar(); // _ZN7ee423603barEv
  ~ee42360(); // tgen
  ee42360(); // tgen
};
//SIG(1 ee42360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee42360 ::bar(){vfunc_called(this, "_ZN7ee423603barEv");}
ee42360 ::~ee42360(){ note_dtor("ee42360", this);} // tgen
ee42360 ::ee42360(){ note_ctor("ee42360", this);} // tgen

static void Test_ee42360()
{
  extern Class_Descriptor cd_ee42360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42360, buf);
    ee42360 *dp, &lv = *(dp=new (buf) ee42360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee42360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(24,16), "ee42360");
    check_base_class_offset(lv, (cc360*)(dd2360*), 0, "ee42360");
    check_base_class_offset(lv, (dd2360*), 0, "ee42360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42360.e");
    test_class_info(&lv, &cd_ee42360);
    dp->~ee42360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42360(Test_ee42360, "ee42360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42360C1Ev();
extern void _ZN7ee42360D1Ev();
Name_Map name_map_ee42360[] = {
  NSPAIR(_ZN7ee42360C1Ev),
  NSPAIR(_ZN7ee42360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee42360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42360[];
extern void _ZN6dd23603fooEv();
extern void _ZN7ee423603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee423603barEv,_ZTv0_n12_N7ee423603barEv)();
extern void ABISELECT(_ZThn24_N7ee423603barEv,_ZThn16_N7ee423603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
  (VTBL_ENTRY)&_ZN7ee423603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee423603barEv,_ZTv0_n12_N7ee423603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
extern VTBL_ENTRY _ZTV7ee42360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee42360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee42360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee42360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee42360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee42360[] = {
  {&(_ZTV7ee42360[3]),  3,11},
  {&(_tg__ZTV6dd2360__7ee42360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee42360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee42360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee42360[4]),  4,6},
  {&(_ZTV7ee42360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42360[];
extern  VTBL_ENTRY _ZTV7ee42360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42360[];
static VTBL_ENTRY alt_thunk_names181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee423603barEv,_ZTv0_n12_N7ee423603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee423603barEv,_ZThn16_N7ee423603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42360 = {  "ee42360", // class name
  bases_ee42360, 4,
  &(vtc_ee42360[0]), // expected_vtbl_contents
  &(vtt_ee42360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names181,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52360  : virtual dd2360 {
  int e;
  virtual void  bar(); // _ZN7ee523603barEv
  ~ee52360(); // tgen
  ee52360(); // tgen
};
//SIG(1 ee52360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee52360 ::bar(){vfunc_called(this, "_ZN7ee523603barEv");}
ee52360 ::~ee52360(){ note_dtor("ee52360", this);} // tgen
ee52360 ::ee52360(){ note_ctor("ee52360", this);} // tgen

static void Test_ee52360()
{
  extern Class_Descriptor cd_ee52360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52360, buf);
    ee52360 *dp, &lv = *(dp=new (buf) ee52360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee52360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(32,20), "ee52360");
    check_base_class_offset(lv, (cc360*)(dd2360*), ABISELECT(16,8), "ee52360");
    check_base_class_offset(lv, (dd2360*), ABISELECT(16,8), "ee52360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52360.e");
    test_class_info(&lv, &cd_ee52360);
    dp->~ee52360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52360(Test_ee52360, "ee52360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52360C1Ev();
extern void _ZN7ee52360D1Ev();
Name_Map name_map_ee52360[] = {
  NSPAIR(_ZN7ee52360C1Ev),
  NSPAIR(_ZN7ee52360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee52360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52360[];
extern void _ZN7ee523603barEv();
extern void _ZN6dd23603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee523603barEv,_ZTv0_n12_N7ee523603barEv)();
extern void ABISELECT(_ZThn32_N7ee523603barEv,_ZThn20_N7ee523603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52360[0]),
  (VTBL_ENTRY)&_ZN7ee523603barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee523603barEv,_ZTv0_n12_N7ee523603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
extern VTBL_ENTRY _ZTV7ee52360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee52360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee52360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee52360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee52360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee52360[] = {
  {&(_ZTV7ee52360[4]),  4,16},
  {&(_ZTV7ee52360[9]),  9,16},
  {&(_ZTV7ee52360[14]),  14,16},
  {&(_tg__ZTV6dd2360__7ee52360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee52360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee52360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee52360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52360[];
extern  VTBL_ENTRY _ZTV7ee52360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52360[];
static VTBL_ENTRY alt_thunk_names182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee523603barEv,_ZTv0_n12_N7ee523603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee523603barEv,_ZThn20_N7ee523603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52360 = {  "ee52360", // class name
  bases_ee52360, 4,
  &(vtc_ee52360[0]), // expected_vtbl_contents
  &(vtt_ee52360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names182,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62360  : dd2360 {
  int e;
  virtual void  foo(); // _ZN7ee623603fooEv
  virtual void  bar(); // _ZN7ee623603barEv
  ~ee62360(); // tgen
  ee62360(); // tgen
};
//SIG(1 ee62360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee62360 ::foo(){vfunc_called(this, "_ZN7ee623603fooEv");}
void  ee62360 ::bar(){vfunc_called(this, "_ZN7ee623603barEv");}
ee62360 ::~ee62360(){ note_dtor("ee62360", this);} // tgen
ee62360 ::ee62360(){ note_ctor("ee62360", this);} // tgen

static void Test_ee62360()
{
  extern Class_Descriptor cd_ee62360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62360, buf);
    ee62360 *dp, &lv = *(dp=new (buf) ee62360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee62360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(24,16), "ee62360");
    check_base_class_offset(lv, (cc360*)(dd2360*), 0, "ee62360");
    check_base_class_offset(lv, (dd2360*), 0, "ee62360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62360.e");
    test_class_info(&lv, &cd_ee62360);
    dp->~ee62360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62360(Test_ee62360, "ee62360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62360C1Ev();
extern void _ZN7ee62360D1Ev();
Name_Map name_map_ee62360[] = {
  NSPAIR(_ZN7ee62360C1Ev),
  NSPAIR(_ZN7ee62360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee62360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62360[];
extern void _ZN7ee623603fooEv();
extern void _ZN7ee623603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee623603barEv,_ZTv0_n12_N7ee623603barEv)();
extern void ABISELECT(_ZThn24_N7ee623603barEv,_ZThn16_N7ee623603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee623603fooEv,_ZTv0_n16_N7ee623603fooEv)();
extern void ABISELECT(_ZThn24_N7ee623603fooEv,_ZThn16_N7ee623603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62360[0]),
  (VTBL_ENTRY)&_ZN7ee623603fooEv,
  (VTBL_ENTRY)&_ZN7ee623603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee623603barEv,_ZTv0_n12_N7ee623603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee623603fooEv,_ZTv0_n16_N7ee623603fooEv),
};
extern VTBL_ENTRY _ZTV7ee62360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee62360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee62360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee62360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee62360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee62360[] = {
  {&(_ZTV7ee62360[3]),  3,11},
  {&(_tg__ZTV6dd2360__7ee62360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee62360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee62360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee62360[4]),  4,6},
  {&(_ZTV7ee62360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62360[];
extern  VTBL_ENTRY _ZTV7ee62360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62360[];
static VTBL_ENTRY alt_thunk_names183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23603fooEv,_ZThn16_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee623603fooEv,_ZTv0_n16_N7ee623603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee623603fooEv,_ZThn16_N7ee623603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee623603barEv,_ZTv0_n12_N7ee623603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee623603barEv,_ZThn16_N7ee623603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62360 = {  "ee62360", // class name
  bases_ee62360, 4,
  &(vtc_ee62360[0]), // expected_vtbl_contents
  &(vtt_ee62360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names183,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72360  : virtual dd2360 {
  int e;
  virtual void  foo(); // _ZN7ee723603fooEv
  virtual void  bar(); // _ZN7ee723603barEv
  ~ee72360(); // tgen
  ee72360(); // tgen
};
//SIG(1 ee72360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee72360 ::foo(){vfunc_called(this, "_ZN7ee723603fooEv");}
void  ee72360 ::bar(){vfunc_called(this, "_ZN7ee723603barEv");}
ee72360 ::~ee72360(){ note_dtor("ee72360", this);} // tgen
ee72360 ::ee72360(){ note_ctor("ee72360", this);} // tgen

static void Test_ee72360()
{
  extern Class_Descriptor cd_ee72360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72360, buf);
    ee72360 *dp, &lv = *(dp=new (buf) ee72360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee72360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd2360*), ABISELECT(32,20), "ee72360");
    check_base_class_offset(lv, (cc360*)(dd2360*), ABISELECT(16,8), "ee72360");
    check_base_class_offset(lv, (dd2360*), ABISELECT(16,8), "ee72360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72360.e");
    test_class_info(&lv, &cd_ee72360);
    dp->~ee72360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72360(Test_ee72360, "ee72360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72360C1Ev();
extern void _ZN7ee72360D1Ev();
Name_Map name_map_ee72360[] = {
  NSPAIR(_ZN7ee72360C1Ev),
  NSPAIR(_ZN7ee72360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd2360;
extern VTBL_ENTRY _ZTI6dd2360[];
extern  VTBL_ENTRY _ZTV6dd2360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2360[];
static Base_Class bases_ee72360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72360[];
extern void _ZN7ee723603fooEv();
extern void _ZN7ee723603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee723603fooEv,_ZTv0_n16_N7ee723603fooEv)();
extern void ABISELECT(_ZThn16_N7ee723603fooEv,_ZThn8_N7ee723603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee723603barEv,_ZTv0_n12_N7ee723603barEv)();
extern void ABISELECT(_ZThn32_N7ee723603barEv,_ZThn20_N7ee723603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee723603fooEv,_ZTv0_n16_N7ee723603fooEv)();
extern void ABISELECT(_ZThn32_N7ee723603fooEv,_ZThn20_N7ee723603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72360[0]),
  (VTBL_ENTRY)&_ZN7ee723603fooEv,
  (VTBL_ENTRY)&_ZN7ee723603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee723603fooEv,_ZTv0_n16_N7ee723603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee723603barEv,_ZTv0_n12_N7ee723603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee723603fooEv,_ZTv0_n16_N7ee723603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72360[];
extern void _ZN6dd23603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2360__7ee72360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN6dd23603fooEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd2360__7ee72360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd2360__7ee72360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv)();
extern void ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2360__7ee72360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv),
};
static  VTT_ENTRY vtt_ee72360[] = {
  {&(_ZTV7ee72360[4]),  4,17},
  {&(_ZTV7ee72360[10]),  10,17},
  {&(_ZTV7ee72360[15]),  15,17},
  {&(_tg__ZTV6dd2360__7ee72360[3]),  3,4},
  {&(_tg__ZTV5cc3606dd2360__7ee72360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd2360__7ee72360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2360__7ee72360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72360[];
extern  VTBL_ENTRY _ZTV7ee72360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72360[];
static VTBL_ENTRY alt_thunk_names184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd23603fooEv,_ZTv0_n16_N6dd23603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23603fooEv,_ZThn12_N6dd23603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee723603barEv,_ZTv0_n12_N7ee723603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee723603barEv,_ZThn20_N7ee723603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee723603fooEv,_ZTv0_n16_N7ee723603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee723603fooEv,_ZThn20_N7ee723603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee723603fooEv,_ZThn8_N7ee723603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72360 = {  "ee72360", // class name
  bases_ee72360, 4,
  &(vtc_ee72360[0]), // expected_vtbl_contents
  &(vtt_ee72360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names184,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3360  : virtual cc360 {
  int d;
  virtual void  foo(); // _ZN6dd33603fooEv
  ~dd3360(); // tgen
  dd3360(); // tgen
};
//SIG(-1 dd3360) C1{ VBC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd3360 ::foo(){vfunc_called(this, "_ZN6dd33603fooEv");}
dd3360 ::~dd3360(){ note_dtor("dd3360", this);} // tgen
dd3360 ::dd3360(){ note_ctor("dd3360", this);} // tgen

static void Test_dd3360()
{
  extern Class_Descriptor cd_dd3360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3360, buf);
    dd3360 *dp, &lv = *(dp=new (buf) dd3360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd3360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,16), "dd3360");
    check_base_class_offset(lv, (cc360*), ABISELECT(16,8), "dd3360");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3360.d");
    test_class_info(&lv, &cd_dd3360);
    dp->~dd3360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3360(Test_dd3360, "dd3360", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3360C1Ev();
extern void _ZN6dd3360D1Ev();
Name_Map name_map_dd3360[] = {
  NSPAIR(_ZN6dd3360C1Ev),
  NSPAIR(_ZN6dd3360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd3360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3360[];
extern void _ZN6dd33603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd3360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd3360[] = {
  {&(_ZTV6dd3360[4]),  4,16},
  {&(_ZTV6dd3360[9]),  9,16},
  {&(_ZTV6dd3360[14]),  14,16},
  {&(_tg__ZTV5cc360__6dd3360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd3360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static VTBL_ENTRY alt_thunk_names185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3360 = {  "dd3360", // class name
  bases_dd3360, 3,
  &(vtc_dd3360[0]), // expected_vtbl_contents
  &(vtt_dd3360[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3360),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names185,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03360  : dd3360 {
  int e;
  ~ee03360(); // tgen
  ee03360(); // tgen
};
//SIG(1 ee03360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee03360 ::~ee03360(){ note_dtor("ee03360", this);} // tgen
ee03360 ::ee03360(){ note_ctor("ee03360", this);} // tgen

static void Test_ee03360()
{
  extern Class_Descriptor cd_ee03360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03360, buf);
    ee03360 *dp, &lv = *(dp=new (buf) ee03360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee03360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee03360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(16,12), "ee03360");
    check_base_class_offset(lv, (dd3360*), 0, "ee03360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03360.e");
    test_class_info(&lv, &cd_ee03360);
    dp->~ee03360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03360(Test_ee03360, "ee03360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03360C1Ev();
extern void _ZN7ee03360D1Ev();
Name_Map name_map_ee03360[] = {
  NSPAIR(_ZN7ee03360C1Ev),
  NSPAIR(_ZN7ee03360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee03360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03360[];
extern void _ZN6dd33603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee03360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee03360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee03360[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee03360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee03360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee03360[] = {
  {&(_ZTV7ee03360[4]),  4,16},
  {&(_tg__ZTV6dd3360__7ee03360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee03360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee03360[4]),  4,6},
  {&(_ZTV7ee03360[9]),  9,16},
  {&(_ZTV7ee03360[14]),  14,16},
  {&(_tg__ZTV5cc360__7ee03360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee03360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03360[];
extern  VTBL_ENTRY _ZTV7ee03360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03360[];
static VTBL_ENTRY alt_thunk_names186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03360 = {  "ee03360", // class name
  bases_ee03360, 4,
  &(vtc_ee03360[0]), // expected_vtbl_contents
  &(vtt_ee03360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names186,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13360  : virtual dd3360 {
  int e;
  ~ee13360(); // tgen
  ee13360(); // tgen
};
//SIG(1 ee13360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee13360 ::~ee13360(){ note_dtor("ee13360", this);} // tgen
ee13360 ::ee13360(){ note_ctor("ee13360", this);} // tgen

static void Test_ee13360()
{
  extern Class_Descriptor cd_ee13360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13360, buf);
    ee13360 *dp, &lv = *(dp=new (buf) ee13360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee13360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee13360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(32,16), "ee13360");
    check_base_class_offset(lv, (dd3360*), ABISELECT(16,8), "ee13360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13360.e");
    test_class_info(&lv, &cd_ee13360);
    dp->~ee13360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13360(Test_ee13360, "ee13360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13360C1Ev();
extern void _ZN7ee13360D1Ev();
Name_Map name_map_ee13360[] = {
  NSPAIR(_ZN7ee13360C1Ev),
  NSPAIR(_ZN7ee13360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee13360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13360[];
extern void _ZN6dd33603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13360[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee13360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee13360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee13360[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee13360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee13360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee13360[] = {
  {&(_ZTV7ee13360[5]),  5,22},
  {&(_ZTV7ee13360[10]),  10,22},
  {&(_ZTV7ee13360[15]),  15,22},
  {&(_ZTV7ee13360[20]),  20,22},
  {&(_tg__ZTV6dd3360__7ee13360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee13360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee13360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee13360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee13360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13360[];
extern  VTBL_ENTRY _ZTV7ee13360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13360[];
static VTBL_ENTRY alt_thunk_names187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13360 = {  "ee13360", // class name
  bases_ee13360, 4,
  &(vtc_ee13360[0]), // expected_vtbl_contents
  &(vtt_ee13360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13360),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names187,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23360  : dd3360 {
  int e;
  virtual void  foo(); // _ZN7ee233603fooEv
  ~ee23360(); // tgen
  ee23360(); // tgen
};
//SIG(1 ee23360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee23360 ::foo(){vfunc_called(this, "_ZN7ee233603fooEv");}
ee23360 ::~ee23360(){ note_dtor("ee23360", this);} // tgen
ee23360 ::ee23360(){ note_ctor("ee23360", this);} // tgen

static void Test_ee23360()
{
  extern Class_Descriptor cd_ee23360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23360, buf);
    ee23360 *dp, &lv = *(dp=new (buf) ee23360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee23360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee23360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(16,12), "ee23360");
    check_base_class_offset(lv, (dd3360*), 0, "ee23360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23360.e");
    test_class_info(&lv, &cd_ee23360);
    dp->~ee23360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23360(Test_ee23360, "ee23360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23360C1Ev();
extern void _ZN7ee23360D1Ev();
Name_Map name_map_ee23360[] = {
  NSPAIR(_ZN7ee23360C1Ev),
  NSPAIR(_ZN7ee23360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee23360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23360[];
extern void _ZN7ee233603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee233603fooEv,_ZTv0_n16_N7ee233603fooEv)();
extern void ABISELECT(_ZThn16_N7ee233603fooEv,_ZThn12_N7ee233603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee233603fooEv,_ZTv0_n16_N7ee233603fooEv)();
extern void ABISELECT(_ZThn32_N7ee233603fooEv,_ZThn20_N7ee233603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23360[0]),
  (VTBL_ENTRY)&_ZN7ee233603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee233603fooEv,_ZTv0_n16_N7ee233603fooEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee233603fooEv,_ZTv0_n16_N7ee233603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee23360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee23360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee23360[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee23360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee23360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee23360[] = {
  {&(_ZTV7ee23360[4]),  4,16},
  {&(_tg__ZTV6dd3360__7ee23360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee23360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee23360[4]),  4,6},
  {&(_ZTV7ee23360[9]),  9,16},
  {&(_ZTV7ee23360[14]),  14,16},
  {&(_tg__ZTV5cc360__7ee23360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee23360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23360[];
extern  VTBL_ENTRY _ZTV7ee23360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23360[];
static VTBL_ENTRY alt_thunk_names188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee233603fooEv,_ZTv0_n16_N7ee233603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee233603fooEv,_ZThn20_N7ee233603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee233603fooEv,_ZThn12_N7ee233603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23360 = {  "ee23360", // class name
  bases_ee23360, 4,
  &(vtc_ee23360[0]), // expected_vtbl_contents
  &(vtt_ee23360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33360  : virtual dd3360 {
  int e;
  virtual void  foo(); // _ZN7ee333603fooEv
  ~ee33360(); // tgen
  ee33360(); // tgen
};
//SIG(1 ee33360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee33360 ::foo(){vfunc_called(this, "_ZN7ee333603fooEv");}
ee33360 ::~ee33360(){ note_dtor("ee33360", this);} // tgen
ee33360 ::ee33360(){ note_ctor("ee33360", this);} // tgen

static void Test_ee33360()
{
  extern Class_Descriptor cd_ee33360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33360, buf);
    ee33360 *dp, &lv = *(dp=new (buf) ee33360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee33360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee33360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(32,16), "ee33360");
    check_base_class_offset(lv, (dd3360*), ABISELECT(16,8), "ee33360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33360.e");
    test_class_info(&lv, &cd_ee33360);
    dp->~ee33360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33360(Test_ee33360, "ee33360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33360C1Ev();
extern void _ZN7ee33360D1Ev();
Name_Map name_map_ee33360[] = {
  NSPAIR(_ZN7ee33360C1Ev),
  NSPAIR(_ZN7ee33360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee33360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33360[];
extern void _ZN7ee333603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee333603fooEv,_ZTv0_n20_N7ee333603fooEv)();
extern void ABISELECT(_ZThn16_N7ee333603fooEv,_ZThn8_N7ee333603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee333603fooEv,_ZTv0_n16_N7ee333603fooEv)();
extern void ABISELECT(_ZThn32_N7ee333603fooEv,_ZThn16_N7ee333603fooEv)() __attribute__((weak));
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee333603fooEv,_ZTv0_n16_N7ee333603fooEv)();
extern void ABISELECT(_ZThn48_N7ee333603fooEv,_ZThn24_N7ee333603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33360[0]),
  (VTBL_ENTRY)&_ZN7ee333603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee333603fooEv,_ZTv0_n20_N7ee333603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee333603fooEv,_ZTv0_n16_N7ee333603fooEv),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee333603fooEv,_ZTv0_n16_N7ee333603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee33360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee33360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee33360[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee33360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee33360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee33360[] = {
  {&(_ZTV7ee33360[5]),  5,23},
  {&(_ZTV7ee33360[11]),  11,23},
  {&(_ZTV7ee33360[16]),  16,23},
  {&(_ZTV7ee33360[21]),  21,23},
  {&(_tg__ZTV6dd3360__7ee33360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee33360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee33360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee33360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee33360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33360[];
extern  VTBL_ENTRY _ZTV7ee33360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33360[];
static VTBL_ENTRY alt_thunk_names189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee333603fooEv,_ZTv0_n16_N7ee333603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee333603fooEv,_ZThn24_N7ee333603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee333603fooEv,_ZThn16_N7ee333603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee333603fooEv,_ZTv0_n20_N7ee333603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee333603fooEv,_ZThn8_N7ee333603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33360 = {  "ee33360", // class name
  bases_ee33360, 4,
  &(vtc_ee33360[0]), // expected_vtbl_contents
  &(vtt_ee33360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33360),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names189,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43360  : dd3360 {
  int e;
  virtual void  bar(); // _ZN7ee433603barEv
  ~ee43360(); // tgen
  ee43360(); // tgen
};
//SIG(1 ee43360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee43360 ::bar(){vfunc_called(this, "_ZN7ee433603barEv");}
ee43360 ::~ee43360(){ note_dtor("ee43360", this);} // tgen
ee43360 ::ee43360(){ note_ctor("ee43360", this);} // tgen

static void Test_ee43360()
{
  extern Class_Descriptor cd_ee43360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43360, buf);
    ee43360 *dp, &lv = *(dp=new (buf) ee43360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee43360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee43360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(16,12), "ee43360");
    check_base_class_offset(lv, (dd3360*), 0, "ee43360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43360.e");
    test_class_info(&lv, &cd_ee43360);
    dp->~ee43360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43360(Test_ee43360, "ee43360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43360C1Ev();
extern void _ZN7ee43360D1Ev();
Name_Map name_map_ee43360[] = {
  NSPAIR(_ZN7ee43360C1Ev),
  NSPAIR(_ZN7ee43360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee43360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43360[];
extern void _ZN6dd33603fooEv();
extern void _ZN7ee433603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee433603barEv,_ZTv0_n12_N7ee433603barEv)();
extern void ABISELECT(_ZThn32_N7ee433603barEv,_ZThn20_N7ee433603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
  (VTBL_ENTRY)&_ZN7ee433603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee433603barEv,_ZTv0_n12_N7ee433603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee43360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee43360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee43360[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee43360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee43360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee43360[] = {
  {&(_ZTV7ee43360[4]),  4,17},
  {&(_tg__ZTV6dd3360__7ee43360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee43360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee43360[4]),  4,6},
  {&(_ZTV7ee43360[10]),  10,17},
  {&(_ZTV7ee43360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee43360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee43360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43360[];
extern  VTBL_ENTRY _ZTV7ee43360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43360[];
static VTBL_ENTRY alt_thunk_names190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee433603barEv,_ZTv0_n12_N7ee433603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee433603barEv,_ZThn20_N7ee433603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43360 = {  "ee43360", // class name
  bases_ee43360, 4,
  &(vtc_ee43360[0]), // expected_vtbl_contents
  &(vtt_ee43360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names190,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53360  : virtual dd3360 {
  int e;
  virtual void  bar(); // _ZN7ee533603barEv
  ~ee53360(); // tgen
  ee53360(); // tgen
};
//SIG(1 ee53360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee53360 ::bar(){vfunc_called(this, "_ZN7ee533603barEv");}
ee53360 ::~ee53360(){ note_dtor("ee53360", this);} // tgen
ee53360 ::ee53360(){ note_ctor("ee53360", this);} // tgen

static void Test_ee53360()
{
  extern Class_Descriptor cd_ee53360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53360, buf);
    ee53360 *dp, &lv = *(dp=new (buf) ee53360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee53360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee53360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(32,16), "ee53360");
    check_base_class_offset(lv, (dd3360*), ABISELECT(16,8), "ee53360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53360.e");
    test_class_info(&lv, &cd_ee53360);
    dp->~ee53360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53360(Test_ee53360, "ee53360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53360C1Ev();
extern void _ZN7ee53360D1Ev();
Name_Map name_map_ee53360[] = {
  NSPAIR(_ZN7ee53360C1Ev),
  NSPAIR(_ZN7ee53360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee53360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53360[];
extern void _ZN7ee533603barEv();
extern void _ZN6dd33603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee533603barEv,_ZTv0_n12_N7ee533603barEv)();
extern void ABISELECT(_ZThn48_N7ee533603barEv,_ZThn24_N7ee533603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53360[0]),
  (VTBL_ENTRY)&_ZN7ee533603barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee533603barEv,_ZTv0_n12_N7ee533603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee53360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee53360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee53360[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee53360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee53360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee53360[] = {
  {&(_ZTV7ee53360[5]),  5,23},
  {&(_ZTV7ee53360[11]),  11,23},
  {&(_ZTV7ee53360[16]),  16,23},
  {&(_ZTV7ee53360[21]),  21,23},
  {&(_tg__ZTV6dd3360__7ee53360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee53360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee53360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee53360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee53360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53360[];
extern  VTBL_ENTRY _ZTV7ee53360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53360[];
static VTBL_ENTRY alt_thunk_names191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee533603barEv,_ZTv0_n12_N7ee533603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee533603barEv,_ZThn24_N7ee533603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53360 = {  "ee53360", // class name
  bases_ee53360, 4,
  &(vtc_ee53360[0]), // expected_vtbl_contents
  &(vtt_ee53360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53360),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names191,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63360  : dd3360 {
  int e;
  virtual void  foo(); // _ZN7ee633603fooEv
  virtual void  bar(); // _ZN7ee633603barEv
  ~ee63360(); // tgen
  ee63360(); // tgen
};
//SIG(1 ee63360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee63360 ::foo(){vfunc_called(this, "_ZN7ee633603fooEv");}
void  ee63360 ::bar(){vfunc_called(this, "_ZN7ee633603barEv");}
ee63360 ::~ee63360(){ note_dtor("ee63360", this);} // tgen
ee63360 ::ee63360(){ note_ctor("ee63360", this);} // tgen

static void Test_ee63360()
{
  extern Class_Descriptor cd_ee63360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63360, buf);
    ee63360 *dp, &lv = *(dp=new (buf) ee63360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee63360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee63360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(16,12), "ee63360");
    check_base_class_offset(lv, (dd3360*), 0, "ee63360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63360.e");
    test_class_info(&lv, &cd_ee63360);
    dp->~ee63360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63360(Test_ee63360, "ee63360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63360C1Ev();
extern void _ZN7ee63360D1Ev();
Name_Map name_map_ee63360[] = {
  NSPAIR(_ZN7ee63360C1Ev),
  NSPAIR(_ZN7ee63360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee63360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63360[];
extern void _ZN7ee633603fooEv();
extern void _ZN7ee633603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee633603fooEv,_ZTv0_n16_N7ee633603fooEv)();
extern void ABISELECT(_ZThn16_N7ee633603fooEv,_ZThn12_N7ee633603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee633603barEv,_ZTv0_n12_N7ee633603barEv)();
extern void ABISELECT(_ZThn32_N7ee633603barEv,_ZThn20_N7ee633603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee633603fooEv,_ZTv0_n16_N7ee633603fooEv)();
extern void ABISELECT(_ZThn32_N7ee633603fooEv,_ZThn20_N7ee633603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63360[0]),
  (VTBL_ENTRY)&_ZN7ee633603fooEv,
  (VTBL_ENTRY)&_ZN7ee633603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee633603fooEv,_ZTv0_n16_N7ee633603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee633603barEv,_ZTv0_n12_N7ee633603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee633603fooEv,_ZTv0_n16_N7ee633603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee63360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee63360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee63360[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee63360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee63360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee63360[] = {
  {&(_ZTV7ee63360[4]),  4,17},
  {&(_tg__ZTV6dd3360__7ee63360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee63360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee63360[4]),  4,6},
  {&(_ZTV7ee63360[10]),  10,17},
  {&(_ZTV7ee63360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee63360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee63360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63360[];
extern  VTBL_ENTRY _ZTV7ee63360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63360[];
static VTBL_ENTRY alt_thunk_names192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn20_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn12_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee633603barEv,_ZTv0_n12_N7ee633603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee633603barEv,_ZThn20_N7ee633603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee633603fooEv,_ZTv0_n16_N7ee633603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee633603fooEv,_ZThn20_N7ee633603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee633603fooEv,_ZThn12_N7ee633603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63360 = {  "ee63360", // class name
  bases_ee63360, 4,
  &(vtc_ee63360[0]), // expected_vtbl_contents
  &(vtt_ee63360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names192,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73360  : virtual dd3360 {
  int e;
  virtual void  foo(); // _ZN7ee733603fooEv
  virtual void  bar(); // _ZN7ee733603barEv
  ~ee73360(); // tgen
  ee73360(); // tgen
};
//SIG(1 ee73360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee73360 ::foo(){vfunc_called(this, "_ZN7ee733603fooEv");}
void  ee73360 ::bar(){vfunc_called(this, "_ZN7ee733603barEv");}
ee73360 ::~ee73360(){ note_dtor("ee73360", this);} // tgen
ee73360 ::ee73360(){ note_ctor("ee73360", this);} // tgen

static void Test_ee73360()
{
  extern Class_Descriptor cd_ee73360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73360, buf);
    ee73360 *dp, &lv = *(dp=new (buf) ee73360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee73360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee73360");
    check_base_class_offset(lv, (cc360*)(dd3360*), ABISELECT(32,16), "ee73360");
    check_base_class_offset(lv, (dd3360*), ABISELECT(16,8), "ee73360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73360.e");
    test_class_info(&lv, &cd_ee73360);
    dp->~ee73360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73360(Test_ee73360, "ee73360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73360C1Ev();
extern void _ZN7ee73360D1Ev();
Name_Map name_map_ee73360[] = {
  NSPAIR(_ZN7ee73360C1Ev),
  NSPAIR(_ZN7ee73360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd3360;
extern VTBL_ENTRY _ZTI6dd3360[];
extern  VTBL_ENTRY _ZTV6dd3360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3360[];
static Base_Class bases_ee73360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73360[];
extern void _ZN7ee733603fooEv();
extern void _ZN7ee733603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee733603fooEv,_ZTv0_n20_N7ee733603fooEv)();
extern void ABISELECT(_ZThn16_N7ee733603fooEv,_ZThn8_N7ee733603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee733603fooEv,_ZTv0_n16_N7ee733603fooEv)();
extern void ABISELECT(_ZThn32_N7ee733603fooEv,_ZThn16_N7ee733603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee733603barEv,_ZTv0_n12_N7ee733603barEv)();
extern void ABISELECT(_ZThn48_N7ee733603barEv,_ZThn24_N7ee733603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee733603fooEv,_ZTv0_n16_N7ee733603fooEv)();
extern void ABISELECT(_ZThn48_N7ee733603fooEv,_ZThn24_N7ee733603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73360[0]),
  (VTBL_ENTRY)&_ZN7ee733603fooEv,
  (VTBL_ENTRY)&_ZN7ee733603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee733603fooEv,_ZTv0_n20_N7ee733603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee733603fooEv,_ZTv0_n16_N7ee733603fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee733603barEv,_ZTv0_n12_N7ee733603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee733603fooEv,_ZTv0_n16_N7ee733603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73360[];
extern void _ZN6dd33603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3360__7ee73360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN6dd33603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd3360__7ee73360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv)();
extern void ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3360__7ee73360[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee73360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee73360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee73360[] = {
  {&(_ZTV7ee73360[5]),  5,24},
  {&(_ZTV7ee73360[12]),  12,24},
  {&(_ZTV7ee73360[17]),  17,24},
  {&(_ZTV7ee73360[22]),  22,24},
  {&(_tg__ZTV6dd3360__7ee73360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd3360__7ee73360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3360__7ee73360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee73360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee73360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73360[];
extern  VTBL_ENTRY _ZTV7ee73360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73360[];
static VTBL_ENTRY alt_thunk_names193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33603fooEv,_ZTv0_n16_N6dd33603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33603fooEv,_ZThn16_N6dd33603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33603fooEv,_ZThn8_N6dd33603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee733603barEv,_ZTv0_n12_N7ee733603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee733603barEv,_ZThn24_N7ee733603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee733603fooEv,_ZTv0_n16_N7ee733603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee733603fooEv,_ZThn24_N7ee733603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee733603fooEv,_ZThn16_N7ee733603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee733603fooEv,_ZTv0_n20_N7ee733603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee733603fooEv,_ZThn8_N7ee733603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73360 = {  "ee73360", // class name
  bases_ee73360, 4,
  &(vtc_ee73360[0]), // expected_vtbl_contents
  &(vtt_ee73360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73360),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73360),9, //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  dd4360  : cc360 {
  int d;
  virtual void  bar(); // _ZN6dd43603barEv
  ~dd4360(); // tgen
  dd4360(); // tgen
};
//SIG(-1 dd4360) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd4360 ::bar(){vfunc_called(this, "_ZN6dd43603barEv");}
dd4360 ::~dd4360(){ note_dtor("dd4360", this);} // tgen
dd4360 ::dd4360(){ note_ctor("dd4360", this);} // tgen

static void Test_dd4360()
{
  extern Class_Descriptor cd_dd4360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4360, buf);
    dd4360 *dp, &lv = *(dp=new (buf) dd4360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd4360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(16,12), "dd4360");
    check_base_class_offset(lv, (cc360*), 0, "dd4360");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4360.d");
    test_class_info(&lv, &cd_dd4360);
    dp->~dd4360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4360(Test_dd4360, "dd4360", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4360C1Ev();
extern void _ZN6dd4360D1Ev();
Name_Map name_map_dd4360[] = {
  NSPAIR(_ZN6dd4360C1Ev),
  NSPAIR(_ZN6dd4360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd4360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV6dd4360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd4360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd4360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd4360[] = {
  {&(_ZTV6dd4360[3]),  3,11},
  {&(_tg__ZTV5cc360__6dd4360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd4360[4]),  4,6},
  {&(_ZTV6dd4360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static VTBL_ENTRY alt_thunk_names194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4360 = {  "dd4360", // class name
  bases_dd4360, 3,
  &(vtc_dd4360[0]), // expected_vtbl_contents
  &(vtt_dd4360[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4360),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names194,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04360  : dd4360 {
  int e;
  ~ee04360(); // tgen
  ee04360(); // tgen
};
//SIG(1 ee04360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee04360 ::~ee04360(){ note_dtor("ee04360", this);} // tgen
ee04360 ::ee04360(){ note_ctor("ee04360", this);} // tgen

static void Test_ee04360()
{
  extern Class_Descriptor cd_ee04360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04360, buf);
    ee04360 *dp, &lv = *(dp=new (buf) ee04360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee04360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(24,16), "ee04360");
    check_base_class_offset(lv, (cc360*)(dd4360*), 0, "ee04360");
    check_base_class_offset(lv, (dd4360*), 0, "ee04360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04360.e");
    test_class_info(&lv, &cd_ee04360);
    dp->~ee04360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04360(Test_ee04360, "ee04360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04360C1Ev();
extern void _ZN7ee04360D1Ev();
Name_Map name_map_ee04360[] = {
  NSPAIR(_ZN7ee04360C1Ev),
  NSPAIR(_ZN7ee04360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee04360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee04360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee04360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee04360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee04360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee04360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee04360[] = {
  {&(_ZTV7ee04360[3]),  3,11},
  {&(_tg__ZTV6dd4360__7ee04360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee04360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee04360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee04360[4]),  4,6},
  {&(_ZTV7ee04360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee04360[];
extern  VTBL_ENTRY _ZTV7ee04360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04360[];
static VTBL_ENTRY alt_thunk_names195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04360 = {  "ee04360", // class name
  bases_ee04360, 4,
  &(vtc_ee04360[0]), // expected_vtbl_contents
  &(vtt_ee04360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04360),6, //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  ee14360  : virtual dd4360 {
  int e;
  ~ee14360(); // tgen
  ee14360(); // tgen
};
//SIG(1 ee14360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee14360 ::~ee14360(){ note_dtor("ee14360", this);} // tgen
ee14360 ::ee14360(){ note_ctor("ee14360", this);} // tgen

static void Test_ee14360()
{
  extern Class_Descriptor cd_ee14360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14360, buf);
    ee14360 *dp, &lv = *(dp=new (buf) ee14360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee14360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(32,20), "ee14360");
    check_base_class_offset(lv, (cc360*)(dd4360*), ABISELECT(16,8), "ee14360");
    check_base_class_offset(lv, (dd4360*), ABISELECT(16,8), "ee14360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14360.e");
    test_class_info(&lv, &cd_ee14360);
    dp->~ee14360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14360(Test_ee14360, "ee14360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14360C1Ev();
extern void _ZN7ee14360D1Ev();
Name_Map name_map_ee14360[] = {
  NSPAIR(_ZN7ee14360C1Ev),
  NSPAIR(_ZN7ee14360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee14360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14360[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee14360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee14360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee14360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee14360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee14360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee14360[] = {
  {&(_ZTV7ee14360[4]),  4,17},
  {&(_ZTV7ee14360[9]),  9,17},
  {&(_ZTV7ee14360[15]),  15,17},
  {&(_tg__ZTV6dd4360__7ee14360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee14360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee14360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee14360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14360[];
extern  VTBL_ENTRY _ZTV7ee14360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14360[];
static VTBL_ENTRY alt_thunk_names196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14360 = {  "ee14360", // class name
  bases_ee14360, 4,
  &(vtc_ee14360[0]), // expected_vtbl_contents
  &(vtt_ee14360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14360),7, //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  ee24360  : dd4360 {
  int e;
  virtual void  foo(); // _ZN7ee243603fooEv
  ~ee24360(); // tgen
  ee24360(); // tgen
};
//SIG(1 ee24360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee24360 ::foo(){vfunc_called(this, "_ZN7ee243603fooEv");}
ee24360 ::~ee24360(){ note_dtor("ee24360", this);} // tgen
ee24360 ::ee24360(){ note_ctor("ee24360", this);} // tgen

static void Test_ee24360()
{
  extern Class_Descriptor cd_ee24360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24360, buf);
    ee24360 *dp, &lv = *(dp=new (buf) ee24360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee24360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(24,16), "ee24360");
    check_base_class_offset(lv, (cc360*)(dd4360*), 0, "ee24360");
    check_base_class_offset(lv, (dd4360*), 0, "ee24360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24360.e");
    test_class_info(&lv, &cd_ee24360);
    dp->~ee24360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24360(Test_ee24360, "ee24360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24360C1Ev();
extern void _ZN7ee24360D1Ev();
Name_Map name_map_ee24360[] = {
  NSPAIR(_ZN7ee24360C1Ev),
  NSPAIR(_ZN7ee24360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee24360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24360[];
extern void _ZN7ee243603fooEv();
extern void _ZN6dd43603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee243603fooEv,_ZTv0_n16_N7ee243603fooEv)();
extern void ABISELECT(_ZThn24_N7ee243603fooEv,_ZThn16_N7ee243603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24360[0]),
  (VTBL_ENTRY)&_ZN7ee243603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee243603fooEv,_ZTv0_n16_N7ee243603fooEv),
};
extern VTBL_ENTRY _ZTV7ee24360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee24360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee24360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee24360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee24360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee24360[] = {
  {&(_ZTV7ee24360[3]),  3,11},
  {&(_tg__ZTV6dd4360__7ee24360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee24360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee24360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee24360[4]),  4,6},
  {&(_ZTV7ee24360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24360[];
extern  VTBL_ENTRY _ZTV7ee24360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24360[];
static VTBL_ENTRY alt_thunk_names197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee243603fooEv,_ZTv0_n16_N7ee243603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee243603fooEv,_ZThn16_N7ee243603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24360 = {  "ee24360", // class name
  bases_ee24360, 4,
  &(vtc_ee24360[0]), // expected_vtbl_contents
  &(vtt_ee24360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names197,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34360  : virtual dd4360 {
  int e;
  virtual void  foo(); // _ZN7ee343603fooEv
  ~ee34360(); // tgen
  ee34360(); // tgen
};
//SIG(1 ee34360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee34360 ::foo(){vfunc_called(this, "_ZN7ee343603fooEv");}
ee34360 ::~ee34360(){ note_dtor("ee34360", this);} // tgen
ee34360 ::ee34360(){ note_ctor("ee34360", this);} // tgen

static void Test_ee34360()
{
  extern Class_Descriptor cd_ee34360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34360, buf);
    ee34360 *dp, &lv = *(dp=new (buf) ee34360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee34360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(32,20), "ee34360");
    check_base_class_offset(lv, (cc360*)(dd4360*), ABISELECT(16,8), "ee34360");
    check_base_class_offset(lv, (dd4360*), ABISELECT(16,8), "ee34360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34360.e");
    test_class_info(&lv, &cd_ee34360);
    dp->~ee34360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34360(Test_ee34360, "ee34360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34360C1Ev();
extern void _ZN7ee34360D1Ev();
Name_Map name_map_ee34360[] = {
  NSPAIR(_ZN7ee34360C1Ev),
  NSPAIR(_ZN7ee34360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee34360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34360[];
extern void _ZN7ee343603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee343603fooEv,_ZTv0_n16_N7ee343603fooEv)();
extern void ABISELECT(_ZThn16_N7ee343603fooEv,_ZThn8_N7ee343603fooEv)() __attribute__((weak));
extern void _ZN6dd43603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee343603fooEv,_ZTv0_n16_N7ee343603fooEv)();
extern void ABISELECT(_ZThn32_N7ee343603fooEv,_ZThn20_N7ee343603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34360[0]),
  (VTBL_ENTRY)&_ZN7ee343603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee343603fooEv,_ZTv0_n16_N7ee343603fooEv),
  (VTBL_ENTRY)&_ZN6dd43603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee343603fooEv,_ZTv0_n16_N7ee343603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee34360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee34360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee34360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee34360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee34360[] = {
  {&(_ZTV7ee34360[4]),  4,18},
  {&(_ZTV7ee34360[10]),  10,18},
  {&(_ZTV7ee34360[16]),  16,18},
  {&(_tg__ZTV6dd4360__7ee34360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee34360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee34360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee34360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34360[];
extern  VTBL_ENTRY _ZTV7ee34360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34360[];
static VTBL_ENTRY alt_thunk_names198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee343603fooEv,_ZTv0_n16_N7ee343603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee343603fooEv,_ZThn20_N7ee343603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee343603fooEv,_ZThn8_N7ee343603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34360 = {  "ee34360", // class name
  bases_ee34360, 4,
  &(vtc_ee34360[0]), // expected_vtbl_contents
  &(vtt_ee34360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34360),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names198,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44360  : dd4360 {
  int e;
  virtual void  bar(); // _ZN7ee443603barEv
  ~ee44360(); // tgen
  ee44360(); // tgen
};
//SIG(1 ee44360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee44360 ::bar(){vfunc_called(this, "_ZN7ee443603barEv");}
ee44360 ::~ee44360(){ note_dtor("ee44360", this);} // tgen
ee44360 ::ee44360(){ note_ctor("ee44360", this);} // tgen

static void Test_ee44360()
{
  extern Class_Descriptor cd_ee44360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44360, buf);
    ee44360 *dp, &lv = *(dp=new (buf) ee44360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee44360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(24,16), "ee44360");
    check_base_class_offset(lv, (cc360*)(dd4360*), 0, "ee44360");
    check_base_class_offset(lv, (dd4360*), 0, "ee44360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44360.e");
    test_class_info(&lv, &cd_ee44360);
    dp->~ee44360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44360(Test_ee44360, "ee44360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44360C1Ev();
extern void _ZN7ee44360D1Ev();
Name_Map name_map_ee44360[] = {
  NSPAIR(_ZN7ee44360C1Ev),
  NSPAIR(_ZN7ee44360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee44360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44360[];
extern void _ZN5cc3603fooEv();
extern void _ZN7ee443603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee443603barEv,_ZTv0_n12_N7ee443603barEv)();
extern void ABISELECT(_ZThn24_N7ee443603barEv,_ZThn16_N7ee443603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN7ee443603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee443603barEv,_ZTv0_n12_N7ee443603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee44360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee44360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee44360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee44360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee44360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee44360[] = {
  {&(_ZTV7ee44360[3]),  3,11},
  {&(_tg__ZTV6dd4360__7ee44360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee44360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee44360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee44360[4]),  4,6},
  {&(_ZTV7ee44360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee44360[];
extern  VTBL_ENTRY _ZTV7ee44360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44360[];
static VTBL_ENTRY alt_thunk_names199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee443603barEv,_ZTv0_n12_N7ee443603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee443603barEv,_ZThn16_N7ee443603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44360 = {  "ee44360", // class name
  bases_ee44360, 4,
  &(vtc_ee44360[0]), // expected_vtbl_contents
  &(vtt_ee44360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names199,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54360  : virtual dd4360 {
  int e;
  virtual void  bar(); // _ZN7ee543603barEv
  ~ee54360(); // tgen
  ee54360(); // tgen
};
//SIG(1 ee54360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee54360 ::bar(){vfunc_called(this, "_ZN7ee543603barEv");}
ee54360 ::~ee54360(){ note_dtor("ee54360", this);} // tgen
ee54360 ::ee54360(){ note_ctor("ee54360", this);} // tgen

static void Test_ee54360()
{
  extern Class_Descriptor cd_ee54360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54360, buf);
    ee54360 *dp, &lv = *(dp=new (buf) ee54360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee54360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(32,20), "ee54360");
    check_base_class_offset(lv, (cc360*)(dd4360*), ABISELECT(16,8), "ee54360");
    check_base_class_offset(lv, (dd4360*), ABISELECT(16,8), "ee54360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54360.e");
    test_class_info(&lv, &cd_ee54360);
    dp->~ee54360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54360(Test_ee54360, "ee54360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54360C1Ev();
extern void _ZN7ee54360D1Ev();
Name_Map name_map_ee54360[] = {
  NSPAIR(_ZN7ee54360C1Ev),
  NSPAIR(_ZN7ee54360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee54360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54360[];
extern void _ZN7ee543603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee543603barEv,_ZTv0_n20_N7ee543603barEv)();
extern void ABISELECT(_ZThn16_N7ee543603barEv,_ZThn8_N7ee543603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee543603barEv,_ZTv0_n12_N7ee543603barEv)();
extern void ABISELECT(_ZThn32_N7ee543603barEv,_ZThn20_N7ee543603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54360[0]),
  (VTBL_ENTRY)&_ZN7ee543603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee543603barEv,_ZTv0_n20_N7ee543603barEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee543603barEv,_ZTv0_n12_N7ee543603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee54360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee54360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee54360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee54360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee54360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee54360[] = {
  {&(_ZTV7ee54360[4]),  4,18},
  {&(_ZTV7ee54360[10]),  10,18},
  {&(_ZTV7ee54360[16]),  16,18},
  {&(_tg__ZTV6dd4360__7ee54360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee54360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee54360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee54360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54360[];
extern  VTBL_ENTRY _ZTV7ee54360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54360[];
static VTBL_ENTRY alt_thunk_names200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee543603barEv,_ZTv0_n12_N7ee543603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee543603barEv,_ZThn20_N7ee543603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee543603barEv,_ZTv0_n20_N7ee543603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee543603barEv,_ZThn8_N7ee543603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54360 = {  "ee54360", // class name
  bases_ee54360, 4,
  &(vtc_ee54360[0]), // expected_vtbl_contents
  &(vtt_ee54360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54360),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names200,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64360  : dd4360 {
  int e;
  virtual void  foo(); // _ZN7ee643603fooEv
  virtual void  bar(); // _ZN7ee643603barEv
  ~ee64360(); // tgen
  ee64360(); // tgen
};
//SIG(1 ee64360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee64360 ::foo(){vfunc_called(this, "_ZN7ee643603fooEv");}
void  ee64360 ::bar(){vfunc_called(this, "_ZN7ee643603barEv");}
ee64360 ::~ee64360(){ note_dtor("ee64360", this);} // tgen
ee64360 ::ee64360(){ note_ctor("ee64360", this);} // tgen

static void Test_ee64360()
{
  extern Class_Descriptor cd_ee64360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64360, buf);
    ee64360 *dp, &lv = *(dp=new (buf) ee64360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee64360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(24,16), "ee64360");
    check_base_class_offset(lv, (cc360*)(dd4360*), 0, "ee64360");
    check_base_class_offset(lv, (dd4360*), 0, "ee64360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64360.e");
    test_class_info(&lv, &cd_ee64360);
    dp->~ee64360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64360(Test_ee64360, "ee64360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64360C1Ev();
extern void _ZN7ee64360D1Ev();
Name_Map name_map_ee64360[] = {
  NSPAIR(_ZN7ee64360C1Ev),
  NSPAIR(_ZN7ee64360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee64360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64360[];
extern void _ZN7ee643603fooEv();
extern void _ZN7ee643603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee643603barEv,_ZTv0_n12_N7ee643603barEv)();
extern void ABISELECT(_ZThn24_N7ee643603barEv,_ZThn16_N7ee643603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee643603fooEv,_ZTv0_n16_N7ee643603fooEv)();
extern void ABISELECT(_ZThn24_N7ee643603fooEv,_ZThn16_N7ee643603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64360[0]),
  (VTBL_ENTRY)&_ZN7ee643603fooEv,
  (VTBL_ENTRY)&_ZN7ee643603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee643603barEv,_ZTv0_n12_N7ee643603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee643603fooEv,_ZTv0_n16_N7ee643603fooEv),
};
extern VTBL_ENTRY _ZTV7ee64360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee64360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee64360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee64360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee64360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee64360[] = {
  {&(_ZTV7ee64360[3]),  3,11},
  {&(_tg__ZTV6dd4360__7ee64360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee64360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee64360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee64360[4]),  4,6},
  {&(_ZTV7ee64360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64360[];
extern  VTBL_ENTRY _ZTV7ee64360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64360[];
static VTBL_ENTRY alt_thunk_names201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43603barEv,_ZThn16_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee643603fooEv,_ZTv0_n16_N7ee643603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee643603fooEv,_ZThn16_N7ee643603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee643603barEv,_ZTv0_n12_N7ee643603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee643603barEv,_ZThn16_N7ee643603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64360 = {  "ee64360", // class name
  bases_ee64360, 4,
  &(vtc_ee64360[0]), // expected_vtbl_contents
  &(vtt_ee64360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names201,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74360  : virtual dd4360 {
  int e;
  virtual void  foo(); // _ZN7ee743603fooEv
  virtual void  bar(); // _ZN7ee743603barEv
  ~ee74360(); // tgen
  ee74360(); // tgen
};
//SIG(1 ee74360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee74360 ::foo(){vfunc_called(this, "_ZN7ee743603fooEv");}
void  ee74360 ::bar(){vfunc_called(this, "_ZN7ee743603barEv");}
ee74360 ::~ee74360(){ note_dtor("ee74360", this);} // tgen
ee74360 ::ee74360(){ note_ctor("ee74360", this);} // tgen

static void Test_ee74360()
{
  extern Class_Descriptor cd_ee74360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74360, buf);
    ee74360 *dp, &lv = *(dp=new (buf) ee74360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee74360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd4360*), ABISELECT(32,20), "ee74360");
    check_base_class_offset(lv, (cc360*)(dd4360*), ABISELECT(16,8), "ee74360");
    check_base_class_offset(lv, (dd4360*), ABISELECT(16,8), "ee74360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74360.e");
    test_class_info(&lv, &cd_ee74360);
    dp->~ee74360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74360(Test_ee74360, "ee74360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74360C1Ev();
extern void _ZN7ee74360D1Ev();
Name_Map name_map_ee74360[] = {
  NSPAIR(_ZN7ee74360C1Ev),
  NSPAIR(_ZN7ee74360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd4360;
extern VTBL_ENTRY _ZTI6dd4360[];
extern  VTBL_ENTRY _ZTV6dd4360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4360[];
static Base_Class bases_ee74360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74360[];
extern void _ZN7ee743603fooEv();
extern void _ZN7ee743603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee743603fooEv,_ZTv0_n16_N7ee743603fooEv)();
extern void ABISELECT(_ZThn16_N7ee743603fooEv,_ZThn8_N7ee743603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee743603barEv,_ZTv0_n20_N7ee743603barEv)();
extern void ABISELECT(_ZThn16_N7ee743603barEv,_ZThn8_N7ee743603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee743603barEv,_ZTv0_n12_N7ee743603barEv)();
extern void ABISELECT(_ZThn32_N7ee743603barEv,_ZThn20_N7ee743603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee743603fooEv,_ZTv0_n16_N7ee743603fooEv)();
extern void ABISELECT(_ZThn32_N7ee743603fooEv,_ZThn20_N7ee743603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74360[0]),
  (VTBL_ENTRY)&_ZN7ee743603fooEv,
  (VTBL_ENTRY)&_ZN7ee743603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee743603fooEv,_ZTv0_n16_N7ee743603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee743603barEv,_ZTv0_n20_N7ee743603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee743603barEv,_ZTv0_n12_N7ee743603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee743603fooEv,_ZTv0_n16_N7ee743603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74360[];
extern void _ZN5cc3603fooEv();
extern void _ZN6dd43603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4360__7ee74360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  (VTBL_ENTRY)&_ZN6dd43603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd4360__7ee74360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd4360__7ee74360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv)();
extern void ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4360__7ee74360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee74360[] = {
  {&(_ZTV7ee74360[4]),  4,19},
  {&(_ZTV7ee74360[11]),  11,19},
  {&(_ZTV7ee74360[17]),  17,19},
  {&(_tg__ZTV6dd4360__7ee74360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd4360__7ee74360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd4360__7ee74360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4360__7ee74360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74360[];
extern  VTBL_ENTRY _ZTV7ee74360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74360[];
static VTBL_ENTRY alt_thunk_names202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd43603barEv,_ZTv0_n12_N6dd43603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43603barEv,_ZThn12_N6dd43603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee743603barEv,_ZTv0_n12_N7ee743603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee743603barEv,_ZThn20_N7ee743603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee743603barEv,_ZTv0_n20_N7ee743603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee743603barEv,_ZThn8_N7ee743603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee743603fooEv,_ZTv0_n16_N7ee743603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee743603fooEv,_ZThn20_N7ee743603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee743603fooEv,_ZThn8_N7ee743603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74360 = {  "ee74360", // class name
  bases_ee74360, 4,
  &(vtc_ee74360[0]), // expected_vtbl_contents
  &(vtt_ee74360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74360),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74360),7, //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  dd5360  : virtual cc360 {
  int d;
  virtual void  bar(); // _ZN6dd53603barEv
  ~dd5360(); // tgen
  dd5360(); // tgen
};
//SIG(-1 dd5360) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd5360 ::bar(){vfunc_called(this, "_ZN6dd53603barEv");}
dd5360 ::~dd5360(){ note_dtor("dd5360", this);} // tgen
dd5360 ::dd5360(){ note_ctor("dd5360", this);} // tgen

static void Test_dd5360()
{
  extern Class_Descriptor cd_dd5360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5360, buf);
    dd5360 *dp, &lv = *(dp=new (buf) dd5360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd5360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,16), "dd5360");
    check_base_class_offset(lv, (cc360*), ABISELECT(16,8), "dd5360");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5360.d");
    test_class_info(&lv, &cd_dd5360);
    dp->~dd5360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5360(Test_dd5360, "dd5360", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5360C1Ev();
extern void _ZN6dd5360D1Ev();
Name_Map name_map_dd5360[] = {
  NSPAIR(_ZN6dd5360C1Ev),
  NSPAIR(_ZN6dd5360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd5360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5360[];
extern void _ZN6dd53603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV6dd5360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd5360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd5360[] = {
  {&(_ZTV6dd5360[4]),  4,16},
  {&(_ZTV6dd5360[9]),  9,16},
  {&(_ZTV6dd5360[14]),  14,16},
  {&(_tg__ZTV5cc360__6dd5360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd5360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static VTBL_ENTRY alt_thunk_names203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5360 = {  "dd5360", // class name
  bases_dd5360, 3,
  &(vtc_dd5360[0]), // expected_vtbl_contents
  &(vtt_dd5360[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5360),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names203,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05360  : dd5360 {
  int e;
  ~ee05360(); // tgen
  ee05360(); // tgen
};
//SIG(1 ee05360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee05360 ::~ee05360(){ note_dtor("ee05360", this);} // tgen
ee05360 ::ee05360(){ note_ctor("ee05360", this);} // tgen

static void Test_ee05360()
{
  extern Class_Descriptor cd_ee05360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05360, buf);
    ee05360 *dp, &lv = *(dp=new (buf) ee05360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee05360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee05360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(16,12), "ee05360");
    check_base_class_offset(lv, (dd5360*), 0, "ee05360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05360.e");
    test_class_info(&lv, &cd_ee05360);
    dp->~ee05360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05360(Test_ee05360, "ee05360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05360C1Ev();
extern void _ZN7ee05360D1Ev();
Name_Map name_map_ee05360[] = {
  NSPAIR(_ZN7ee05360C1Ev),
  NSPAIR(_ZN7ee05360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee05360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05360[];
extern void _ZN6dd53603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee05360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee05360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee05360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee05360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee05360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee05360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee05360[] = {
  {&(_ZTV7ee05360[4]),  4,16},
  {&(_tg__ZTV6dd5360__7ee05360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee05360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee05360[4]),  4,6},
  {&(_ZTV7ee05360[9]),  9,16},
  {&(_ZTV7ee05360[14]),  14,16},
  {&(_tg__ZTV5cc360__7ee05360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee05360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05360[];
extern  VTBL_ENTRY _ZTV7ee05360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05360[];
static VTBL_ENTRY alt_thunk_names204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05360 = {  "ee05360", // class name
  bases_ee05360, 4,
  &(vtc_ee05360[0]), // expected_vtbl_contents
  &(vtt_ee05360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05360),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  ee15360  : virtual dd5360 {
  int e;
  ~ee15360(); // tgen
  ee15360(); // tgen
};
//SIG(1 ee15360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee15360 ::~ee15360(){ note_dtor("ee15360", this);} // tgen
ee15360 ::ee15360(){ note_ctor("ee15360", this);} // tgen

static void Test_ee15360()
{
  extern Class_Descriptor cd_ee15360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15360, buf);
    ee15360 *dp, &lv = *(dp=new (buf) ee15360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee15360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee15360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(32,16), "ee15360");
    check_base_class_offset(lv, (dd5360*), ABISELECT(16,8), "ee15360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15360.e");
    test_class_info(&lv, &cd_ee15360);
    dp->~ee15360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15360(Test_ee15360, "ee15360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15360C1Ev();
extern void _ZN7ee15360D1Ev();
Name_Map name_map_ee15360[] = {
  NSPAIR(_ZN7ee15360C1Ev),
  NSPAIR(_ZN7ee15360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee15360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15360[];
extern void _ZN6dd53603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15360[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee15360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee15360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee15360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee15360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee15360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee15360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee15360[] = {
  {&(_ZTV7ee15360[5]),  5,22},
  {&(_ZTV7ee15360[10]),  10,22},
  {&(_ZTV7ee15360[15]),  15,22},
  {&(_ZTV7ee15360[20]),  20,22},
  {&(_tg__ZTV6dd5360__7ee15360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee15360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee15360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee15360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee15360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15360[];
extern  VTBL_ENTRY _ZTV7ee15360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15360[];
static VTBL_ENTRY alt_thunk_names205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15360 = {  "ee15360", // class name
  bases_ee15360, 4,
  &(vtc_ee15360[0]), // expected_vtbl_contents
  &(vtt_ee15360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15360),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15360),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  ee25360  : dd5360 {
  int e;
  virtual void  foo(); // _ZN7ee253603fooEv
  ~ee25360(); // tgen
  ee25360(); // tgen
};
//SIG(1 ee25360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee25360 ::foo(){vfunc_called(this, "_ZN7ee253603fooEv");}
ee25360 ::~ee25360(){ note_dtor("ee25360", this);} // tgen
ee25360 ::ee25360(){ note_ctor("ee25360", this);} // tgen

static void Test_ee25360()
{
  extern Class_Descriptor cd_ee25360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25360, buf);
    ee25360 *dp, &lv = *(dp=new (buf) ee25360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee25360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee25360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(16,12), "ee25360");
    check_base_class_offset(lv, (dd5360*), 0, "ee25360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25360.e");
    test_class_info(&lv, &cd_ee25360);
    dp->~ee25360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25360(Test_ee25360, "ee25360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25360C1Ev();
extern void _ZN7ee25360D1Ev();
Name_Map name_map_ee25360[] = {
  NSPAIR(_ZN7ee25360C1Ev),
  NSPAIR(_ZN7ee25360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee25360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25360[];
extern void _ZN6dd53603barEv();
extern void _ZN7ee253603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee253603fooEv,_ZTv0_n16_N7ee253603fooEv)();
extern void ABISELECT(_ZThn16_N7ee253603fooEv,_ZThn12_N7ee253603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee253603fooEv,_ZTv0_n16_N7ee253603fooEv)();
extern void ABISELECT(_ZThn32_N7ee253603fooEv,_ZThn20_N7ee253603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
  (VTBL_ENTRY)&_ZN7ee253603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee253603fooEv,_ZTv0_n16_N7ee253603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee253603fooEv,_ZTv0_n16_N7ee253603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee25360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee25360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee25360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee25360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee25360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee25360[] = {
  {&(_ZTV7ee25360[4]),  4,17},
  {&(_tg__ZTV6dd5360__7ee25360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee25360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee25360[4]),  4,6},
  {&(_ZTV7ee25360[10]),  10,17},
  {&(_ZTV7ee25360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee25360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee25360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25360[];
extern  VTBL_ENTRY _ZTV7ee25360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25360[];
static VTBL_ENTRY alt_thunk_names206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee253603fooEv,_ZTv0_n16_N7ee253603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee253603fooEv,_ZThn20_N7ee253603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee253603fooEv,_ZThn12_N7ee253603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25360 = {  "ee25360", // class name
  bases_ee25360, 4,
  &(vtc_ee25360[0]), // expected_vtbl_contents
  &(vtt_ee25360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names206,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35360  : virtual dd5360 {
  int e;
  virtual void  foo(); // _ZN7ee353603fooEv
  ~ee35360(); // tgen
  ee35360(); // tgen
};
//SIG(1 ee35360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee35360 ::foo(){vfunc_called(this, "_ZN7ee353603fooEv");}
ee35360 ::~ee35360(){ note_dtor("ee35360", this);} // tgen
ee35360 ::ee35360(){ note_ctor("ee35360", this);} // tgen

static void Test_ee35360()
{
  extern Class_Descriptor cd_ee35360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35360, buf);
    ee35360 *dp, &lv = *(dp=new (buf) ee35360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee35360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee35360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(32,16), "ee35360");
    check_base_class_offset(lv, (dd5360*), ABISELECT(16,8), "ee35360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35360.e");
    test_class_info(&lv, &cd_ee35360);
    dp->~ee35360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35360(Test_ee35360, "ee35360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35360C1Ev();
extern void _ZN7ee35360D1Ev();
Name_Map name_map_ee35360[] = {
  NSPAIR(_ZN7ee35360C1Ev),
  NSPAIR(_ZN7ee35360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee35360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35360[];
extern void _ZN7ee353603fooEv();
extern void _ZN6dd53603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee353603fooEv,_ZTv0_n16_N7ee353603fooEv)();
extern void ABISELECT(_ZThn32_N7ee353603fooEv,_ZThn16_N7ee353603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee353603fooEv,_ZTv0_n16_N7ee353603fooEv)();
extern void ABISELECT(_ZThn48_N7ee353603fooEv,_ZThn24_N7ee353603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35360[0]),
  (VTBL_ENTRY)&_ZN7ee353603fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee353603fooEv,_ZTv0_n16_N7ee353603fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee353603fooEv,_ZTv0_n16_N7ee353603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee35360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee35360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee35360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee35360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee35360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee35360[] = {
  {&(_ZTV7ee35360[5]),  5,23},
  {&(_ZTV7ee35360[11]),  11,23},
  {&(_ZTV7ee35360[16]),  16,23},
  {&(_ZTV7ee35360[21]),  21,23},
  {&(_tg__ZTV6dd5360__7ee35360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee35360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee35360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee35360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee35360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35360[];
extern  VTBL_ENTRY _ZTV7ee35360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35360[];
static VTBL_ENTRY alt_thunk_names207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee353603fooEv,_ZTv0_n16_N7ee353603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee353603fooEv,_ZThn24_N7ee353603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee353603fooEv,_ZThn16_N7ee353603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35360 = {  "ee35360", // class name
  bases_ee35360, 4,
  &(vtc_ee35360[0]), // expected_vtbl_contents
  &(vtt_ee35360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35360),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names207,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45360  : dd5360 {
  int e;
  virtual void  bar(); // _ZN7ee453603barEv
  ~ee45360(); // tgen
  ee45360(); // tgen
};
//SIG(1 ee45360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee45360 ::bar(){vfunc_called(this, "_ZN7ee453603barEv");}
ee45360 ::~ee45360(){ note_dtor("ee45360", this);} // tgen
ee45360 ::ee45360(){ note_ctor("ee45360", this);} // tgen

static void Test_ee45360()
{
  extern Class_Descriptor cd_ee45360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45360, buf);
    ee45360 *dp, &lv = *(dp=new (buf) ee45360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee45360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee45360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(16,12), "ee45360");
    check_base_class_offset(lv, (dd5360*), 0, "ee45360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45360.e");
    test_class_info(&lv, &cd_ee45360);
    dp->~ee45360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45360(Test_ee45360, "ee45360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45360C1Ev();
extern void _ZN7ee45360D1Ev();
Name_Map name_map_ee45360[] = {
  NSPAIR(_ZN7ee45360C1Ev),
  NSPAIR(_ZN7ee45360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee45360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45360[];
extern void _ZN7ee453603barEv();
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee453603barEv,_ZTv0_n12_N7ee453603barEv)();
extern void ABISELECT(_ZThn32_N7ee453603barEv,_ZThn20_N7ee453603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45360[0]),
  (VTBL_ENTRY)&_ZN7ee453603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee453603barEv,_ZTv0_n12_N7ee453603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee45360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee45360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee45360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee45360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee45360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee45360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee45360[] = {
  {&(_ZTV7ee45360[4]),  4,16},
  {&(_tg__ZTV6dd5360__7ee45360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee45360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee45360[4]),  4,6},
  {&(_ZTV7ee45360[9]),  9,16},
  {&(_ZTV7ee45360[14]),  14,16},
  {&(_tg__ZTV5cc360__7ee45360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee45360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45360[];
extern  VTBL_ENTRY _ZTV7ee45360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45360[];
static VTBL_ENTRY alt_thunk_names208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee453603barEv,_ZTv0_n12_N7ee453603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee453603barEv,_ZThn20_N7ee453603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45360 = {  "ee45360", // class name
  bases_ee45360, 4,
  &(vtc_ee45360[0]), // expected_vtbl_contents
  &(vtt_ee45360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45360),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names208,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55360  : virtual dd5360 {
  int e;
  virtual void  bar(); // _ZN7ee553603barEv
  ~ee55360(); // tgen
  ee55360(); // tgen
};
//SIG(1 ee55360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee55360 ::bar(){vfunc_called(this, "_ZN7ee553603barEv");}
ee55360 ::~ee55360(){ note_dtor("ee55360", this);} // tgen
ee55360 ::ee55360(){ note_ctor("ee55360", this);} // tgen

static void Test_ee55360()
{
  extern Class_Descriptor cd_ee55360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55360, buf);
    ee55360 *dp, &lv = *(dp=new (buf) ee55360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee55360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee55360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(32,16), "ee55360");
    check_base_class_offset(lv, (dd5360*), ABISELECT(16,8), "ee55360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55360.e");
    test_class_info(&lv, &cd_ee55360);
    dp->~ee55360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55360(Test_ee55360, "ee55360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55360C1Ev();
extern void _ZN7ee55360D1Ev();
Name_Map name_map_ee55360[] = {
  NSPAIR(_ZN7ee55360C1Ev),
  NSPAIR(_ZN7ee55360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee55360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55360[];
extern void _ZN7ee553603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee553603barEv,_ZTv0_n20_N7ee553603barEv)();
extern void ABISELECT(_ZThn16_N7ee553603barEv,_ZThn8_N7ee553603barEv)() __attribute__((weak));
extern void _ZN5cc3603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee553603barEv,_ZTv0_n12_N7ee553603barEv)();
extern void ABISELECT(_ZThn48_N7ee553603barEv,_ZThn24_N7ee553603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55360[0]),
  (VTBL_ENTRY)&_ZN7ee553603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee553603barEv,_ZTv0_n20_N7ee553603barEv),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee553603barEv,_ZTv0_n12_N7ee553603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern VTBL_ENTRY _ZTV7ee55360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee55360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee55360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee55360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee55360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee55360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee55360[] = {
  {&(_ZTV7ee55360[5]),  5,23},
  {&(_ZTV7ee55360[11]),  11,23},
  {&(_ZTV7ee55360[16]),  16,23},
  {&(_ZTV7ee55360[21]),  21,23},
  {&(_tg__ZTV6dd5360__7ee55360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee55360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee55360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee55360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee55360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55360[];
extern  VTBL_ENTRY _ZTV7ee55360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55360[];
static VTBL_ENTRY alt_thunk_names209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee553603barEv,_ZTv0_n12_N7ee553603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee553603barEv,_ZThn24_N7ee553603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee553603barEv,_ZTv0_n20_N7ee553603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee553603barEv,_ZThn8_N7ee553603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55360 = {  "ee55360", // class name
  bases_ee55360, 4,
  &(vtc_ee55360[0]), // expected_vtbl_contents
  &(vtt_ee55360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55360),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names209,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65360  : dd5360 {
  int e;
  virtual void  foo(); // _ZN7ee653603fooEv
  virtual void  bar(); // _ZN7ee653603barEv
  ~ee65360(); // tgen
  ee65360(); // tgen
};
//SIG(1 ee65360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee65360 ::foo(){vfunc_called(this, "_ZN7ee653603fooEv");}
void  ee65360 ::bar(){vfunc_called(this, "_ZN7ee653603barEv");}
ee65360 ::~ee65360(){ note_dtor("ee65360", this);} // tgen
ee65360 ::ee65360(){ note_ctor("ee65360", this);} // tgen

static void Test_ee65360()
{
  extern Class_Descriptor cd_ee65360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65360, buf);
    ee65360 *dp, &lv = *(dp=new (buf) ee65360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee65360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee65360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(16,12), "ee65360");
    check_base_class_offset(lv, (dd5360*), 0, "ee65360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65360.e");
    test_class_info(&lv, &cd_ee65360);
    dp->~ee65360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65360(Test_ee65360, "ee65360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65360C1Ev();
extern void _ZN7ee65360D1Ev();
Name_Map name_map_ee65360[] = {
  NSPAIR(_ZN7ee65360C1Ev),
  NSPAIR(_ZN7ee65360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee65360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65360[];
extern void _ZN7ee653603barEv();
extern void _ZN7ee653603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee653603fooEv,_ZTv0_n16_N7ee653603fooEv)();
extern void ABISELECT(_ZThn16_N7ee653603fooEv,_ZThn12_N7ee653603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee653603barEv,_ZTv0_n12_N7ee653603barEv)();
extern void ABISELECT(_ZThn32_N7ee653603barEv,_ZThn20_N7ee653603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee653603fooEv,_ZTv0_n16_N7ee653603fooEv)();
extern void ABISELECT(_ZThn32_N7ee653603fooEv,_ZThn20_N7ee653603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65360[0]),
  (VTBL_ENTRY)&_ZN7ee653603barEv,
  (VTBL_ENTRY)&_ZN7ee653603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee653603fooEv,_ZTv0_n16_N7ee653603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee653603barEv,_ZTv0_n12_N7ee653603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee653603fooEv,_ZTv0_n16_N7ee653603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee65360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee65360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee65360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee65360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee65360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee65360[] = {
  {&(_ZTV7ee65360[4]),  4,17},
  {&(_tg__ZTV6dd5360__7ee65360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee65360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee65360[4]),  4,6},
  {&(_ZTV7ee65360[10]),  10,17},
  {&(_ZTV7ee65360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee65360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee65360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65360[];
extern  VTBL_ENTRY _ZTV7ee65360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65360[];
static VTBL_ENTRY alt_thunk_names210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn20_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee653603barEv,_ZTv0_n12_N7ee653603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee653603barEv,_ZThn20_N7ee653603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee653603fooEv,_ZTv0_n16_N7ee653603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee653603fooEv,_ZThn20_N7ee653603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee653603fooEv,_ZThn12_N7ee653603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65360 = {  "ee65360", // class name
  bases_ee65360, 4,
  &(vtc_ee65360[0]), // expected_vtbl_contents
  &(vtt_ee65360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names210,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75360  : virtual dd5360 {
  int e;
  virtual void  foo(); // _ZN7ee753603fooEv
  virtual void  bar(); // _ZN7ee753603barEv
  ~ee75360(); // tgen
  ee75360(); // tgen
};
//SIG(1 ee75360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee75360 ::foo(){vfunc_called(this, "_ZN7ee753603fooEv");}
void  ee75360 ::bar(){vfunc_called(this, "_ZN7ee753603barEv");}
ee75360 ::~ee75360(){ note_dtor("ee75360", this);} // tgen
ee75360 ::ee75360(){ note_ctor("ee75360", this);} // tgen

static void Test_ee75360()
{
  extern Class_Descriptor cd_ee75360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75360, buf);
    ee75360 *dp, &lv = *(dp=new (buf) ee75360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee75360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee75360");
    check_base_class_offset(lv, (cc360*)(dd5360*), ABISELECT(32,16), "ee75360");
    check_base_class_offset(lv, (dd5360*), ABISELECT(16,8), "ee75360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75360.e");
    test_class_info(&lv, &cd_ee75360);
    dp->~ee75360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75360(Test_ee75360, "ee75360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75360C1Ev();
extern void _ZN7ee75360D1Ev();
Name_Map name_map_ee75360[] = {
  NSPAIR(_ZN7ee75360C1Ev),
  NSPAIR(_ZN7ee75360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd5360;
extern VTBL_ENTRY _ZTI6dd5360[];
extern  VTBL_ENTRY _ZTV6dd5360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5360[];
static Base_Class bases_ee75360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75360[];
extern void _ZN7ee753603fooEv();
extern void _ZN7ee753603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee753603barEv,_ZTv0_n20_N7ee753603barEv)();
extern void ABISELECT(_ZThn16_N7ee753603barEv,_ZThn8_N7ee753603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee753603fooEv,_ZTv0_n16_N7ee753603fooEv)();
extern void ABISELECT(_ZThn32_N7ee753603fooEv,_ZThn16_N7ee753603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee753603barEv,_ZTv0_n12_N7ee753603barEv)();
extern void ABISELECT(_ZThn48_N7ee753603barEv,_ZThn24_N7ee753603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee753603fooEv,_ZTv0_n16_N7ee753603fooEv)();
extern void ABISELECT(_ZThn48_N7ee753603fooEv,_ZThn24_N7ee753603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75360[0]),
  (VTBL_ENTRY)&_ZN7ee753603fooEv,
  (VTBL_ENTRY)&_ZN7ee753603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee753603barEv,_ZTv0_n20_N7ee753603barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee753603fooEv,_ZTv0_n16_N7ee753603fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee753603barEv,_ZTv0_n12_N7ee753603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee753603fooEv,_ZTv0_n16_N7ee753603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75360[];
extern void _ZN6dd53603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5360__7ee75360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN6dd53603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd5360__7ee75360[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv)();
extern void ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5360__7ee75360[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee75360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee75360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee75360[] = {
  {&(_ZTV7ee75360[5]),  5,24},
  {&(_ZTV7ee75360[12]),  12,24},
  {&(_ZTV7ee75360[17]),  17,24},
  {&(_ZTV7ee75360[22]),  22,24},
  {&(_tg__ZTV6dd5360__7ee75360[4]),  4,5},
  {&(_tg__ZTV5cc360__6dd5360__7ee75360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5360__7ee75360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee75360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee75360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75360[];
extern  VTBL_ENTRY _ZTV7ee75360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75360[];
static VTBL_ENTRY alt_thunk_names211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd53603barEv,_ZTv0_n12_N6dd53603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53603barEv,_ZThn16_N6dd53603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee753603barEv,_ZTv0_n12_N7ee753603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee753603barEv,_ZThn24_N7ee753603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee753603fooEv,_ZTv0_n16_N7ee753603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee753603fooEv,_ZThn24_N7ee753603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee753603fooEv,_ZThn16_N7ee753603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee753603barEv,_ZTv0_n20_N7ee753603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee753603barEv,_ZThn8_N7ee753603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75360 = {  "ee75360", // class name
  bases_ee75360, 4,
  &(vtc_ee75360[0]), // expected_vtbl_contents
  &(vtt_ee75360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75360),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75360),9, //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  dd6360  : cc360 {
  int d;
  virtual void  bar(); // _ZN6dd63603barEv
  virtual void  foo(); // _ZN6dd63603fooEv
  ~dd6360(); // tgen
  dd6360(); // tgen
};
//SIG(-1 dd6360) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd6360 ::bar(){vfunc_called(this, "_ZN6dd63603barEv");}
void  dd6360 ::foo(){vfunc_called(this, "_ZN6dd63603fooEv");}
dd6360 ::~dd6360(){ note_dtor("dd6360", this);} // tgen
dd6360 ::dd6360(){ note_ctor("dd6360", this);} // tgen

static void Test_dd6360()
{
  extern Class_Descriptor cd_dd6360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6360, buf);
    dd6360 *dp, &lv = *(dp=new (buf) dd6360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd6360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(16,12), "dd6360");
    check_base_class_offset(lv, (cc360*), 0, "dd6360");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6360.d");
    test_class_info(&lv, &cd_dd6360);
    dp->~dd6360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6360(Test_dd6360, "dd6360", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6360C1Ev();
extern void _ZN6dd6360D1Ev();
Name_Map name_map_dd6360[] = {
  NSPAIR(_ZN6dd6360C1Ev),
  NSPAIR(_ZN6dd6360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd6360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
extern VTBL_ENTRY _ZTV6dd6360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd6360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd6360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd6360[] = {
  {&(_ZTV6dd6360[3]),  3,11},
  {&(_tg__ZTV5cc360__6dd6360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd6360[4]),  4,6},
  {&(_ZTV6dd6360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static VTBL_ENTRY alt_thunk_names212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6360 = {  "dd6360", // class name
  bases_dd6360, 3,
  &(vtc_dd6360[0]), // expected_vtbl_contents
  &(vtt_dd6360[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6360),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names212,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06360  : dd6360 {
  int e;
  ~ee06360(); // tgen
  ee06360(); // tgen
};
//SIG(1 ee06360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee06360 ::~ee06360(){ note_dtor("ee06360", this);} // tgen
ee06360 ::ee06360(){ note_ctor("ee06360", this);} // tgen

static void Test_ee06360()
{
  extern Class_Descriptor cd_ee06360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06360, buf);
    ee06360 *dp, &lv = *(dp=new (buf) ee06360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee06360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(24,16), "ee06360");
    check_base_class_offset(lv, (cc360*)(dd6360*), 0, "ee06360");
    check_base_class_offset(lv, (dd6360*), 0, "ee06360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06360.e");
    test_class_info(&lv, &cd_ee06360);
    dp->~ee06360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06360(Test_ee06360, "ee06360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06360C1Ev();
extern void _ZN7ee06360D1Ev();
Name_Map name_map_ee06360[] = {
  NSPAIR(_ZN7ee06360C1Ev),
  NSPAIR(_ZN7ee06360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee06360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
extern VTBL_ENTRY _ZTV7ee06360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee06360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee06360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee06360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee06360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee06360[] = {
  {&(_ZTV7ee06360[3]),  3,11},
  {&(_tg__ZTV6dd6360__7ee06360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee06360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee06360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee06360[4]),  4,6},
  {&(_ZTV7ee06360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06360[];
extern  VTBL_ENTRY _ZTV7ee06360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06360[];
static VTBL_ENTRY alt_thunk_names213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06360 = {  "ee06360", // class name
  bases_ee06360, 4,
  &(vtc_ee06360[0]), // expected_vtbl_contents
  &(vtt_ee06360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06360),6, //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  ee16360  : virtual dd6360 {
  int e;
  ~ee16360(); // tgen
  ee16360(); // tgen
};
//SIG(1 ee16360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee16360 ::~ee16360(){ note_dtor("ee16360", this);} // tgen
ee16360 ::ee16360(){ note_ctor("ee16360", this);} // tgen

static void Test_ee16360()
{
  extern Class_Descriptor cd_ee16360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16360, buf);
    ee16360 *dp, &lv = *(dp=new (buf) ee16360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee16360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(32,20), "ee16360");
    check_base_class_offset(lv, (cc360*)(dd6360*), ABISELECT(16,8), "ee16360");
    check_base_class_offset(lv, (dd6360*), ABISELECT(16,8), "ee16360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16360.e");
    test_class_info(&lv, &cd_ee16360);
    dp->~ee16360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16360(Test_ee16360, "ee16360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16360C1Ev();
extern void _ZN7ee16360D1Ev();
Name_Map name_map_ee16360[] = {
  NSPAIR(_ZN7ee16360C1Ev),
  NSPAIR(_ZN7ee16360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee16360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16360[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
extern VTBL_ENTRY _ZTV7ee16360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee16360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee16360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee16360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee16360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee16360[] = {
  {&(_ZTV7ee16360[4]),  4,17},
  {&(_ZTV7ee16360[9]),  9,17},
  {&(_ZTV7ee16360[15]),  15,17},
  {&(_tg__ZTV6dd6360__7ee16360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee16360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee16360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee16360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16360[];
extern  VTBL_ENTRY _ZTV7ee16360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16360[];
static VTBL_ENTRY alt_thunk_names214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16360 = {  "ee16360", // class name
  bases_ee16360, 4,
  &(vtc_ee16360[0]), // expected_vtbl_contents
  &(vtt_ee16360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16360),7, //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  ee26360  : dd6360 {
  int e;
  virtual void  foo(); // _ZN7ee263603fooEv
  ~ee26360(); // tgen
  ee26360(); // tgen
};
//SIG(1 ee26360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee26360 ::foo(){vfunc_called(this, "_ZN7ee263603fooEv");}
ee26360 ::~ee26360(){ note_dtor("ee26360", this);} // tgen
ee26360 ::ee26360(){ note_ctor("ee26360", this);} // tgen

static void Test_ee26360()
{
  extern Class_Descriptor cd_ee26360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26360, buf);
    ee26360 *dp, &lv = *(dp=new (buf) ee26360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee26360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(24,16), "ee26360");
    check_base_class_offset(lv, (cc360*)(dd6360*), 0, "ee26360");
    check_base_class_offset(lv, (dd6360*), 0, "ee26360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26360.e");
    test_class_info(&lv, &cd_ee26360);
    dp->~ee26360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26360(Test_ee26360, "ee26360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26360C1Ev();
extern void _ZN7ee26360D1Ev();
Name_Map name_map_ee26360[] = {
  NSPAIR(_ZN7ee26360C1Ev),
  NSPAIR(_ZN7ee26360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee26360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26360[];
extern void _ZN7ee263603fooEv();
extern void _ZN6dd63603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee263603fooEv,_ZTv0_n16_N7ee263603fooEv)();
extern void ABISELECT(_ZThn24_N7ee263603fooEv,_ZThn16_N7ee263603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26360[0]),
  (VTBL_ENTRY)&_ZN7ee263603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee263603fooEv,_ZTv0_n16_N7ee263603fooEv),
};
extern VTBL_ENTRY _ZTV7ee26360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee26360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee26360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee26360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee26360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee26360[] = {
  {&(_ZTV7ee26360[3]),  3,11},
  {&(_tg__ZTV6dd6360__7ee26360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee26360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee26360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee26360[4]),  4,6},
  {&(_ZTV7ee26360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26360[];
extern  VTBL_ENTRY _ZTV7ee26360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26360[];
static VTBL_ENTRY alt_thunk_names215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee263603fooEv,_ZTv0_n16_N7ee263603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee263603fooEv,_ZThn16_N7ee263603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26360 = {  "ee26360", // class name
  bases_ee26360, 4,
  &(vtc_ee26360[0]), // expected_vtbl_contents
  &(vtt_ee26360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26360),6, //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  ee36360  : virtual dd6360 {
  int e;
  virtual void  foo(); // _ZN7ee363603fooEv
  ~ee36360(); // tgen
  ee36360(); // tgen
};
//SIG(1 ee36360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee36360 ::foo(){vfunc_called(this, "_ZN7ee363603fooEv");}
ee36360 ::~ee36360(){ note_dtor("ee36360", this);} // tgen
ee36360 ::ee36360(){ note_ctor("ee36360", this);} // tgen

static void Test_ee36360()
{
  extern Class_Descriptor cd_ee36360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36360, buf);
    ee36360 *dp, &lv = *(dp=new (buf) ee36360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee36360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(32,20), "ee36360");
    check_base_class_offset(lv, (cc360*)(dd6360*), ABISELECT(16,8), "ee36360");
    check_base_class_offset(lv, (dd6360*), ABISELECT(16,8), "ee36360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36360.e");
    test_class_info(&lv, &cd_ee36360);
    dp->~ee36360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36360(Test_ee36360, "ee36360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36360C1Ev();
extern void _ZN7ee36360D1Ev();
Name_Map name_map_ee36360[] = {
  NSPAIR(_ZN7ee36360C1Ev),
  NSPAIR(_ZN7ee36360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee36360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36360[];
extern void _ZN7ee363603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee363603fooEv,_ZTv0_n16_N7ee363603fooEv)();
extern void ABISELECT(_ZThn16_N7ee363603fooEv,_ZThn8_N7ee363603fooEv)() __attribute__((weak));
extern void _ZN6dd63603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee363603fooEv,_ZTv0_n16_N7ee363603fooEv)();
extern void ABISELECT(_ZThn32_N7ee363603fooEv,_ZThn20_N7ee363603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36360[0]),
  (VTBL_ENTRY)&_ZN7ee363603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee363603fooEv,_ZTv0_n16_N7ee363603fooEv),
  (VTBL_ENTRY)&_ZN6dd63603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee363603fooEv,_ZTv0_n16_N7ee363603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee36360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee36360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee36360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee36360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee36360[] = {
  {&(_ZTV7ee36360[4]),  4,18},
  {&(_ZTV7ee36360[10]),  10,18},
  {&(_ZTV7ee36360[16]),  16,18},
  {&(_tg__ZTV6dd6360__7ee36360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee36360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee36360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee36360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36360[];
extern  VTBL_ENTRY _ZTV7ee36360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36360[];
static VTBL_ENTRY alt_thunk_names216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee363603fooEv,_ZTv0_n16_N7ee363603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee363603fooEv,_ZThn20_N7ee363603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee363603fooEv,_ZThn8_N7ee363603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36360 = {  "ee36360", // class name
  bases_ee36360, 4,
  &(vtc_ee36360[0]), // expected_vtbl_contents
  &(vtt_ee36360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36360),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names216,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46360  : dd6360 {
  int e;
  virtual void  bar(); // _ZN7ee463603barEv
  ~ee46360(); // tgen
  ee46360(); // tgen
};
//SIG(1 ee46360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee46360 ::bar(){vfunc_called(this, "_ZN7ee463603barEv");}
ee46360 ::~ee46360(){ note_dtor("ee46360", this);} // tgen
ee46360 ::ee46360(){ note_ctor("ee46360", this);} // tgen

static void Test_ee46360()
{
  extern Class_Descriptor cd_ee46360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46360, buf);
    ee46360 *dp, &lv = *(dp=new (buf) ee46360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee46360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(24,16), "ee46360");
    check_base_class_offset(lv, (cc360*)(dd6360*), 0, "ee46360");
    check_base_class_offset(lv, (dd6360*), 0, "ee46360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46360.e");
    test_class_info(&lv, &cd_ee46360);
    dp->~ee46360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46360(Test_ee46360, "ee46360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46360C1Ev();
extern void _ZN7ee46360D1Ev();
Name_Map name_map_ee46360[] = {
  NSPAIR(_ZN7ee46360C1Ev),
  NSPAIR(_ZN7ee46360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee46360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46360[];
extern void _ZN6dd63603fooEv();
extern void _ZN7ee463603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee463603barEv,_ZTv0_n12_N7ee463603barEv)();
extern void ABISELECT(_ZThn24_N7ee463603barEv,_ZThn16_N7ee463603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN7ee463603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee463603barEv,_ZTv0_n12_N7ee463603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
extern VTBL_ENTRY _ZTV7ee46360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee46360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee46360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee46360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee46360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee46360[] = {
  {&(_ZTV7ee46360[3]),  3,11},
  {&(_tg__ZTV6dd6360__7ee46360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee46360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee46360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee46360[4]),  4,6},
  {&(_ZTV7ee46360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46360[];
extern  VTBL_ENTRY _ZTV7ee46360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46360[];
static VTBL_ENTRY alt_thunk_names217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee463603barEv,_ZTv0_n12_N7ee463603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee463603barEv,_ZThn16_N7ee463603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46360 = {  "ee46360", // class name
  bases_ee46360, 4,
  &(vtc_ee46360[0]), // expected_vtbl_contents
  &(vtt_ee46360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names217,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56360  : virtual dd6360 {
  int e;
  virtual void  bar(); // _ZN7ee563603barEv
  ~ee56360(); // tgen
  ee56360(); // tgen
};
//SIG(1 ee56360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee56360 ::bar(){vfunc_called(this, "_ZN7ee563603barEv");}
ee56360 ::~ee56360(){ note_dtor("ee56360", this);} // tgen
ee56360 ::ee56360(){ note_ctor("ee56360", this);} // tgen

static void Test_ee56360()
{
  extern Class_Descriptor cd_ee56360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56360, buf);
    ee56360 *dp, &lv = *(dp=new (buf) ee56360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee56360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(32,20), "ee56360");
    check_base_class_offset(lv, (cc360*)(dd6360*), ABISELECT(16,8), "ee56360");
    check_base_class_offset(lv, (dd6360*), ABISELECT(16,8), "ee56360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56360.e");
    test_class_info(&lv, &cd_ee56360);
    dp->~ee56360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56360(Test_ee56360, "ee56360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56360C1Ev();
extern void _ZN7ee56360D1Ev();
Name_Map name_map_ee56360[] = {
  NSPAIR(_ZN7ee56360C1Ev),
  NSPAIR(_ZN7ee56360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee56360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56360[];
extern void _ZN7ee563603barEv();
extern void _ZN6dd63603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee563603barEv,_ZTv0_n20_N7ee563603barEv)();
extern void ABISELECT(_ZThn16_N7ee563603barEv,_ZThn8_N7ee563603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee563603barEv,_ZTv0_n12_N7ee563603barEv)();
extern void ABISELECT(_ZThn32_N7ee563603barEv,_ZThn20_N7ee563603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56360[0]),
  (VTBL_ENTRY)&_ZN7ee563603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee563603barEv,_ZTv0_n20_N7ee563603barEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee563603barEv,_ZTv0_n12_N7ee563603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
extern VTBL_ENTRY _ZTV7ee56360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee56360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee56360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee56360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee56360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee56360[] = {
  {&(_ZTV7ee56360[4]),  4,18},
  {&(_ZTV7ee56360[10]),  10,18},
  {&(_ZTV7ee56360[16]),  16,18},
  {&(_tg__ZTV6dd6360__7ee56360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee56360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee56360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee56360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56360[];
extern  VTBL_ENTRY _ZTV7ee56360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56360[];
static VTBL_ENTRY alt_thunk_names218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee563603barEv,_ZTv0_n12_N7ee563603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee563603barEv,_ZThn20_N7ee563603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee563603barEv,_ZTv0_n20_N7ee563603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee563603barEv,_ZThn8_N7ee563603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56360 = {  "ee56360", // class name
  bases_ee56360, 4,
  &(vtc_ee56360[0]), // expected_vtbl_contents
  &(vtt_ee56360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56360),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names218,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66360  : dd6360 {
  int e;
  virtual void  foo(); // _ZN7ee663603fooEv
  virtual void  bar(); // _ZN7ee663603barEv
  ~ee66360(); // tgen
  ee66360(); // tgen
};
//SIG(1 ee66360) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66360 ::foo(){vfunc_called(this, "_ZN7ee663603fooEv");}
void  ee66360 ::bar(){vfunc_called(this, "_ZN7ee663603barEv");}
ee66360 ::~ee66360(){ note_dtor("ee66360", this);} // tgen
ee66360 ::ee66360(){ note_ctor("ee66360", this);} // tgen

static void Test_ee66360()
{
  extern Class_Descriptor cd_ee66360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66360, buf);
    ee66360 *dp, &lv = *(dp=new (buf) ee66360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee66360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(24,16), "ee66360");
    check_base_class_offset(lv, (cc360*)(dd6360*), 0, "ee66360");
    check_base_class_offset(lv, (dd6360*), 0, "ee66360");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66360.e");
    test_class_info(&lv, &cd_ee66360);
    dp->~ee66360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66360(Test_ee66360, "ee66360", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66360C1Ev();
extern void _ZN7ee66360D1Ev();
Name_Map name_map_ee66360[] = {
  NSPAIR(_ZN7ee66360C1Ev),
  NSPAIR(_ZN7ee66360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee66360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66360[];
extern void _ZN7ee663603fooEv();
extern void _ZN7ee663603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee663603barEv,_ZTv0_n12_N7ee663603barEv)();
extern void ABISELECT(_ZThn24_N7ee663603barEv,_ZThn16_N7ee663603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee663603fooEv,_ZTv0_n16_N7ee663603fooEv)();
extern void ABISELECT(_ZThn24_N7ee663603fooEv,_ZThn16_N7ee663603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66360[0]),
  (VTBL_ENTRY)&_ZN7ee663603fooEv,
  (VTBL_ENTRY)&_ZN7ee663603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee663603barEv,_ZTv0_n12_N7ee663603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee663603fooEv,_ZTv0_n16_N7ee663603fooEv),
};
extern VTBL_ENTRY _ZTV7ee66360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee66360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee66360[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee66360[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee66360[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee66360[] = {
  {&(_ZTV7ee66360[3]),  3,11},
  {&(_tg__ZTV6dd6360__7ee66360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee66360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee66360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee66360[4]),  4,6},
  {&(_ZTV7ee66360[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66360[];
extern  VTBL_ENTRY _ZTV7ee66360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66360[];
static VTBL_ENTRY alt_thunk_names219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603fooEv,_ZThn16_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63603barEv,_ZThn16_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3603fooEv,_ZThn16_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee663603fooEv,_ZTv0_n16_N7ee663603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee663603fooEv,_ZThn16_N7ee663603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee663603barEv,_ZTv0_n12_N7ee663603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee663603barEv,_ZThn16_N7ee663603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66360 = {  "ee66360", // class name
  bases_ee66360, 4,
  &(vtc_ee66360[0]), // expected_vtbl_contents
  &(vtt_ee66360[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66360),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66360),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names219,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76360  : virtual dd6360 {
  int e;
  virtual void  foo(); // _ZN7ee763603fooEv
  virtual void  bar(); // _ZN7ee763603barEv
  ~ee76360(); // tgen
  ee76360(); // tgen
};
//SIG(1 ee76360) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76360 ::foo(){vfunc_called(this, "_ZN7ee763603fooEv");}
void  ee76360 ::bar(){vfunc_called(this, "_ZN7ee763603barEv");}
ee76360 ::~ee76360(){ note_dtor("ee76360", this);} // tgen
ee76360 ::ee76360(){ note_ctor("ee76360", this);} // tgen

static void Test_ee76360()
{
  extern Class_Descriptor cd_ee76360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76360, buf);
    ee76360 *dp, &lv = *(dp=new (buf) ee76360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee76360");
    check_base_class_offset(lv, (bb60*)(cc360*)(dd6360*), ABISELECT(32,20), "ee76360");
    check_base_class_offset(lv, (cc360*)(dd6360*), ABISELECT(16,8), "ee76360");
    check_base_class_offset(lv, (dd6360*), ABISELECT(16,8), "ee76360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76360.e");
    test_class_info(&lv, &cd_ee76360);
    dp->~ee76360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76360(Test_ee76360, "ee76360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76360C1Ev();
extern void _ZN7ee76360D1Ev();
Name_Map name_map_ee76360[] = {
  NSPAIR(_ZN7ee76360C1Ev),
  NSPAIR(_ZN7ee76360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd6360;
extern VTBL_ENTRY _ZTI6dd6360[];
extern  VTBL_ENTRY _ZTV6dd6360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6360[];
static Base_Class bases_ee76360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76360[];
extern void _ZN7ee763603fooEv();
extern void _ZN7ee763603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee763603fooEv,_ZTv0_n16_N7ee763603fooEv)();
extern void ABISELECT(_ZThn16_N7ee763603fooEv,_ZThn8_N7ee763603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee763603barEv,_ZTv0_n20_N7ee763603barEv)();
extern void ABISELECT(_ZThn16_N7ee763603barEv,_ZThn8_N7ee763603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee763603barEv,_ZTv0_n12_N7ee763603barEv)();
extern void ABISELECT(_ZThn32_N7ee763603barEv,_ZThn20_N7ee763603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee763603fooEv,_ZTv0_n16_N7ee763603fooEv)();
extern void ABISELECT(_ZThn32_N7ee763603fooEv,_ZThn20_N7ee763603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76360[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76360[0]),
  (VTBL_ENTRY)&_ZN7ee763603fooEv,
  (VTBL_ENTRY)&_ZN7ee763603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee763603fooEv,_ZTv0_n16_N7ee763603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee763603barEv,_ZTv0_n20_N7ee763603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee763603barEv,_ZTv0_n12_N7ee763603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee763603fooEv,_ZTv0_n16_N7ee763603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76360[];
extern void _ZN6dd63603fooEv();
extern void _ZN6dd63603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6360__7ee76360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&_ZN6dd63603fooEv,
  (VTBL_ENTRY)&_ZN6dd63603barEv,
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3606dd6360__7ee76360[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc3606dd6360__7ee76360[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv)();
extern void ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv)();
extern void ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6360__7ee76360[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv),
};
static  VTT_ENTRY vtt_ee76360[] = {
  {&(_ZTV7ee76360[4]),  4,19},
  {&(_ZTV7ee76360[11]),  11,19},
  {&(_ZTV7ee76360[17]),  17,19},
  {&(_tg__ZTV6dd6360__7ee76360[3]),  3,5},
  {&(_tg__ZTV5cc3606dd6360__7ee76360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc3606dd6360__7ee76360[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6360__7ee76360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76360[];
extern  VTBL_ENTRY _ZTV7ee76360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76360[];
static VTBL_ENTRY alt_thunk_names220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63603fooEv,_ZTv0_n16_N6dd63603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603fooEv,_ZThn12_N6dd63603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63603barEv,_ZTv0_n12_N6dd63603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63603barEv,_ZThn12_N6dd63603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn12_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee763603barEv,_ZTv0_n12_N7ee763603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee763603barEv,_ZThn20_N7ee763603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee763603barEv,_ZTv0_n20_N7ee763603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee763603barEv,_ZThn8_N7ee763603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee763603fooEv,_ZTv0_n16_N7ee763603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee763603fooEv,_ZThn20_N7ee763603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee763603fooEv,_ZThn8_N7ee763603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76360 = {  "ee76360", // class name
  bases_ee76360, 4,
  &(vtc_ee76360[0]), // expected_vtbl_contents
  &(vtt_ee76360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76360),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76360),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names220,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7360  : virtual cc360 {
  int d;
  virtual void  bar(); // _ZN6dd73603barEv
  virtual void  foo(); // _ZN6dd73603fooEv
  ~dd7360(); // tgen
  dd7360(); // tgen
};
//SIG(-1 dd7360) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd7360 ::bar(){vfunc_called(this, "_ZN6dd73603barEv");}
void  dd7360 ::foo(){vfunc_called(this, "_ZN6dd73603fooEv");}
dd7360 ::~dd7360(){ note_dtor("dd7360", this);} // tgen
dd7360 ::dd7360(){ note_ctor("dd7360", this);} // tgen

static void Test_dd7360()
{
  extern Class_Descriptor cd_dd7360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7360, buf);
    dd7360 *dp, &lv = *(dp=new (buf) dd7360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd7360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,16), "dd7360");
    check_base_class_offset(lv, (cc360*), ABISELECT(16,8), "dd7360");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7360.d");
    test_class_info(&lv, &cd_dd7360);
    dp->~dd7360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7360(Test_dd7360, "dd7360", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7360C1Ev();
extern void _ZN6dd7360D1Ev();
Name_Map name_map_dd7360[] = {
  NSPAIR(_ZN6dd7360C1Ev),
  NSPAIR(_ZN6dd7360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
static Base_Class bases_dd7360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7360[];
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__6dd7360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_dd7360[] = {
  {&(_ZTV6dd7360[4]),  4,17},
  {&(_ZTV6dd7360[10]),  10,17},
  {&(_ZTV6dd7360[15]),  15,17},
  {&(_tg__ZTV5cc360__6dd7360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__6dd7360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static VTBL_ENTRY alt_thunk_names221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7360 = {  "dd7360", // class name
  bases_dd7360, 3,
  &(vtc_dd7360[0]), // expected_vtbl_contents
  &(vtt_dd7360[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7360),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names221,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07360  : dd7360 {
  int e;
  ~ee07360(); // tgen
  ee07360(); // tgen
};
//SIG(1 ee07360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee07360 ::~ee07360(){ note_dtor("ee07360", this);} // tgen
ee07360 ::ee07360(){ note_ctor("ee07360", this);} // tgen

static void Test_ee07360()
{
  extern Class_Descriptor cd_ee07360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07360, buf);
    ee07360 *dp, &lv = *(dp=new (buf) ee07360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee07360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee07360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(16,12), "ee07360");
    check_base_class_offset(lv, (dd7360*), 0, "ee07360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07360.e");
    test_class_info(&lv, &cd_ee07360);
    dp->~ee07360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07360(Test_ee07360, "ee07360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07360C1Ev();
extern void _ZN7ee07360D1Ev();
Name_Map name_map_ee07360[] = {
  NSPAIR(_ZN7ee07360C1Ev),
  NSPAIR(_ZN7ee07360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee07360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee07360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee07360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee07360[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee07360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee07360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee07360[] = {
  {&(_ZTV7ee07360[4]),  4,17},
  {&(_tg__ZTV6dd7360__7ee07360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee07360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee07360[4]),  4,6},
  {&(_ZTV7ee07360[10]),  10,17},
  {&(_ZTV7ee07360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee07360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee07360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07360[];
extern  VTBL_ENTRY _ZTV7ee07360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07360[];
static VTBL_ENTRY alt_thunk_names222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07360 = {  "ee07360", // class name
  bases_ee07360, 4,
  &(vtc_ee07360[0]), // expected_vtbl_contents
  &(vtt_ee07360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names222,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17360  : virtual dd7360 {
  int e;
  ~ee17360(); // tgen
  ee17360(); // tgen
};
//SIG(1 ee17360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee17360 ::~ee17360(){ note_dtor("ee17360", this);} // tgen
ee17360 ::ee17360(){ note_ctor("ee17360", this);} // tgen

static void Test_ee17360()
{
  extern Class_Descriptor cd_ee17360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17360, buf);
    ee17360 *dp, &lv = *(dp=new (buf) ee17360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee17360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee17360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(32,16), "ee17360");
    check_base_class_offset(lv, (dd7360*), ABISELECT(16,8), "ee17360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17360.e");
    test_class_info(&lv, &cd_ee17360);
    dp->~ee17360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17360(Test_ee17360, "ee17360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17360C1Ev();
extern void _ZN7ee17360D1Ev();
Name_Map name_map_ee17360[] = {
  NSPAIR(_ZN7ee17360C1Ev),
  NSPAIR(_ZN7ee17360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee17360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17360[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee17360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee17360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee17360[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee17360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee17360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee17360[] = {
  {&(_ZTV7ee17360[5]),  5,24},
  {&(_ZTV7ee17360[11]),  11,24},
  {&(_ZTV7ee17360[17]),  17,24},
  {&(_ZTV7ee17360[22]),  22,24},
  {&(_tg__ZTV6dd7360__7ee17360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee17360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee17360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee17360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee17360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17360[];
extern  VTBL_ENTRY _ZTV7ee17360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17360[];
static VTBL_ENTRY alt_thunk_names223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17360 = {  "ee17360", // class name
  bases_ee17360, 4,
  &(vtc_ee17360[0]), // expected_vtbl_contents
  &(vtt_ee17360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17360),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names223,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27360  : dd7360 {
  int e;
  virtual void  foo(); // _ZN7ee273603fooEv
  ~ee27360(); // tgen
  ee27360(); // tgen
};
//SIG(1 ee27360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee27360 ::foo(){vfunc_called(this, "_ZN7ee273603fooEv");}
ee27360 ::~ee27360(){ note_dtor("ee27360", this);} // tgen
ee27360 ::ee27360(){ note_ctor("ee27360", this);} // tgen

static void Test_ee27360()
{
  extern Class_Descriptor cd_ee27360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27360, buf);
    ee27360 *dp, &lv = *(dp=new (buf) ee27360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee27360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee27360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(16,12), "ee27360");
    check_base_class_offset(lv, (dd7360*), 0, "ee27360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27360.e");
    test_class_info(&lv, &cd_ee27360);
    dp->~ee27360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27360(Test_ee27360, "ee27360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27360C1Ev();
extern void _ZN7ee27360D1Ev();
Name_Map name_map_ee27360[] = {
  NSPAIR(_ZN7ee27360C1Ev),
  NSPAIR(_ZN7ee27360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee27360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27360[];
extern void _ZN6dd73603barEv();
extern void _ZN7ee273603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee273603fooEv,_ZTv0_n16_N7ee273603fooEv)();
extern void ABISELECT(_ZThn16_N7ee273603fooEv,_ZThn12_N7ee273603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee273603fooEv,_ZTv0_n16_N7ee273603fooEv)();
extern void ABISELECT(_ZThn32_N7ee273603fooEv,_ZThn20_N7ee273603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN7ee273603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee273603fooEv,_ZTv0_n16_N7ee273603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee273603fooEv,_ZTv0_n16_N7ee273603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee27360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee27360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee27360[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee27360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee27360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee27360[] = {
  {&(_ZTV7ee27360[4]),  4,17},
  {&(_tg__ZTV6dd7360__7ee27360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee27360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee27360[4]),  4,6},
  {&(_ZTV7ee27360[10]),  10,17},
  {&(_ZTV7ee27360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee27360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee27360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27360[];
extern  VTBL_ENTRY _ZTV7ee27360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27360[];
static VTBL_ENTRY alt_thunk_names224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee273603fooEv,_ZTv0_n16_N7ee273603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee273603fooEv,_ZThn20_N7ee273603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee273603fooEv,_ZThn12_N7ee273603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27360 = {  "ee27360", // class name
  bases_ee27360, 4,
  &(vtc_ee27360[0]), // expected_vtbl_contents
  &(vtt_ee27360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names224,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37360  : virtual dd7360 {
  int e;
  virtual void  foo(); // _ZN7ee373603fooEv
  ~ee37360(); // tgen
  ee37360(); // tgen
};
//SIG(1 ee37360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee37360 ::foo(){vfunc_called(this, "_ZN7ee373603fooEv");}
ee37360 ::~ee37360(){ note_dtor("ee37360", this);} // tgen
ee37360 ::ee37360(){ note_ctor("ee37360", this);} // tgen

static void Test_ee37360()
{
  extern Class_Descriptor cd_ee37360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37360, buf);
    ee37360 *dp, &lv = *(dp=new (buf) ee37360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee37360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee37360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(32,16), "ee37360");
    check_base_class_offset(lv, (dd7360*), ABISELECT(16,8), "ee37360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37360.e");
    test_class_info(&lv, &cd_ee37360);
    dp->~ee37360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37360(Test_ee37360, "ee37360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37360C1Ev();
extern void _ZN7ee37360D1Ev();
Name_Map name_map_ee37360[] = {
  NSPAIR(_ZN7ee37360C1Ev),
  NSPAIR(_ZN7ee37360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee37360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37360[];
extern void _ZN7ee373603fooEv();
extern void _ZN6dd73603barEv();
extern void ABISELECT(_ZTv0_n48_N7ee373603fooEv,_ZTv0_n24_N7ee373603fooEv)();
extern void ABISELECT(_ZThn16_N7ee373603fooEv,_ZThn8_N7ee373603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee373603fooEv,_ZTv0_n16_N7ee373603fooEv)();
extern void ABISELECT(_ZThn32_N7ee373603fooEv,_ZThn16_N7ee373603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee373603fooEv,_ZTv0_n16_N7ee373603fooEv)();
extern void ABISELECT(_ZThn48_N7ee373603fooEv,_ZThn24_N7ee373603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37360[0]),
  (VTBL_ENTRY)&_ZN7ee373603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee373603fooEv,_ZTv0_n24_N7ee373603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee373603fooEv,_ZTv0_n16_N7ee373603fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee373603fooEv,_ZTv0_n16_N7ee373603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee37360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee37360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee37360[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee37360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee37360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee37360[] = {
  {&(_ZTV7ee37360[5]),  5,25},
  {&(_ZTV7ee37360[12]),  12,25},
  {&(_ZTV7ee37360[18]),  18,25},
  {&(_ZTV7ee37360[23]),  23,25},
  {&(_tg__ZTV6dd7360__7ee37360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee37360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee37360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee37360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee37360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37360[];
extern  VTBL_ENTRY _ZTV7ee37360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37360[];
static VTBL_ENTRY alt_thunk_names225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee373603fooEv,_ZTv0_n16_N7ee373603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee373603fooEv,_ZThn24_N7ee373603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee373603fooEv,_ZThn16_N7ee373603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee373603fooEv,_ZTv0_n24_N7ee373603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee373603fooEv,_ZThn8_N7ee373603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37360 = {  "ee37360", // class name
  bases_ee37360, 4,
  &(vtc_ee37360[0]), // expected_vtbl_contents
  &(vtt_ee37360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37360),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names225,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47360  : dd7360 {
  int e;
  virtual void  bar(); // _ZN7ee473603barEv
  ~ee47360(); // tgen
  ee47360(); // tgen
};
//SIG(1 ee47360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee47360 ::bar(){vfunc_called(this, "_ZN7ee473603barEv");}
ee47360 ::~ee47360(){ note_dtor("ee47360", this);} // tgen
ee47360 ::ee47360(){ note_ctor("ee47360", this);} // tgen

static void Test_ee47360()
{
  extern Class_Descriptor cd_ee47360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47360, buf);
    ee47360 *dp, &lv = *(dp=new (buf) ee47360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee47360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee47360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(16,12), "ee47360");
    check_base_class_offset(lv, (dd7360*), 0, "ee47360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47360.e");
    test_class_info(&lv, &cd_ee47360);
    dp->~ee47360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47360(Test_ee47360, "ee47360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47360C1Ev();
extern void _ZN7ee47360D1Ev();
Name_Map name_map_ee47360[] = {
  NSPAIR(_ZN7ee47360C1Ev),
  NSPAIR(_ZN7ee47360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee47360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47360[];
extern void _ZN7ee473603barEv();
extern void _ZN6dd73603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee473603barEv,_ZTv0_n12_N7ee473603barEv)();
extern void ABISELECT(_ZThn32_N7ee473603barEv,_ZThn20_N7ee473603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47360[0]),
  (VTBL_ENTRY)&_ZN7ee473603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee473603barEv,_ZTv0_n12_N7ee473603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee47360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee47360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee47360[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee47360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee47360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee47360[] = {
  {&(_ZTV7ee47360[4]),  4,17},
  {&(_tg__ZTV6dd7360__7ee47360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee47360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee47360[4]),  4,6},
  {&(_ZTV7ee47360[10]),  10,17},
  {&(_ZTV7ee47360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee47360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee47360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47360[];
extern  VTBL_ENTRY _ZTV7ee47360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47360[];
static VTBL_ENTRY alt_thunk_names226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee473603barEv,_ZTv0_n12_N7ee473603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee473603barEv,_ZThn20_N7ee473603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47360 = {  "ee47360", // class name
  bases_ee47360, 4,
  &(vtc_ee47360[0]), // expected_vtbl_contents
  &(vtt_ee47360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names226,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57360  : virtual dd7360 {
  int e;
  virtual void  bar(); // _ZN7ee573603barEv
  ~ee57360(); // tgen
  ee57360(); // tgen
};
//SIG(1 ee57360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee57360 ::bar(){vfunc_called(this, "_ZN7ee573603barEv");}
ee57360 ::~ee57360(){ note_dtor("ee57360", this);} // tgen
ee57360 ::ee57360(){ note_ctor("ee57360", this);} // tgen

static void Test_ee57360()
{
  extern Class_Descriptor cd_ee57360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57360, buf);
    ee57360 *dp, &lv = *(dp=new (buf) ee57360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee57360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee57360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(32,16), "ee57360");
    check_base_class_offset(lv, (dd7360*), ABISELECT(16,8), "ee57360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57360.e");
    test_class_info(&lv, &cd_ee57360);
    dp->~ee57360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57360(Test_ee57360, "ee57360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57360C1Ev();
extern void _ZN7ee57360D1Ev();
Name_Map name_map_ee57360[] = {
  NSPAIR(_ZN7ee57360C1Ev),
  NSPAIR(_ZN7ee57360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee57360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57360[];
extern void _ZN7ee573603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee573603barEv,_ZTv0_n20_N7ee573603barEv)();
extern void ABISELECT(_ZThn16_N7ee573603barEv,_ZThn8_N7ee573603barEv)() __attribute__((weak));
extern void _ZN6dd73603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee573603barEv,_ZTv0_n12_N7ee573603barEv)();
extern void ABISELECT(_ZThn48_N7ee573603barEv,_ZThn24_N7ee573603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57360[0]),
  (VTBL_ENTRY)&_ZN7ee573603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee573603barEv,_ZTv0_n20_N7ee573603barEv),
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee573603barEv,_ZTv0_n12_N7ee573603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee57360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee57360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee57360[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee57360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee57360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee57360[] = {
  {&(_ZTV7ee57360[5]),  5,25},
  {&(_ZTV7ee57360[12]),  12,25},
  {&(_ZTV7ee57360[18]),  18,25},
  {&(_ZTV7ee57360[23]),  23,25},
  {&(_tg__ZTV6dd7360__7ee57360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee57360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee57360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee57360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee57360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57360[];
extern  VTBL_ENTRY _ZTV7ee57360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57360[];
static VTBL_ENTRY alt_thunk_names227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee573603barEv,_ZTv0_n12_N7ee573603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee573603barEv,_ZThn24_N7ee573603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee573603barEv,_ZTv0_n20_N7ee573603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee573603barEv,_ZThn8_N7ee573603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57360 = {  "ee57360", // class name
  bases_ee57360, 4,
  &(vtc_ee57360[0]), // expected_vtbl_contents
  &(vtt_ee57360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57360),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57360),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names227,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67360  : dd7360 {
  int e;
  virtual void  foo(); // _ZN7ee673603fooEv
  virtual void  bar(); // _ZN7ee673603barEv
  ~ee67360(); // tgen
  ee67360(); // tgen
};
//SIG(1 ee67360) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67360 ::foo(){vfunc_called(this, "_ZN7ee673603fooEv");}
void  ee67360 ::bar(){vfunc_called(this, "_ZN7ee673603barEv");}
ee67360 ::~ee67360(){ note_dtor("ee67360", this);} // tgen
ee67360 ::ee67360(){ note_ctor("ee67360", this);} // tgen

static void Test_ee67360()
{
  extern Class_Descriptor cd_ee67360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67360, buf);
    ee67360 *dp, &lv = *(dp=new (buf) ee67360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee67360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(32,20), "ee67360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(16,12), "ee67360");
    check_base_class_offset(lv, (dd7360*), 0, "ee67360");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67360.e");
    test_class_info(&lv, &cd_ee67360);
    dp->~ee67360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67360(Test_ee67360, "ee67360", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67360C1Ev();
extern void _ZN7ee67360D1Ev();
Name_Map name_map_ee67360[] = {
  NSPAIR(_ZN7ee67360C1Ev),
  NSPAIR(_ZN7ee67360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee67360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67360[];
extern void _ZN7ee673603barEv();
extern void _ZN7ee673603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee673603fooEv,_ZTv0_n16_N7ee673603fooEv)();
extern void ABISELECT(_ZThn16_N7ee673603fooEv,_ZThn12_N7ee673603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee673603barEv,_ZTv0_n12_N7ee673603barEv)();
extern void ABISELECT(_ZThn32_N7ee673603barEv,_ZThn20_N7ee673603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee673603fooEv,_ZTv0_n16_N7ee673603fooEv)();
extern void ABISELECT(_ZThn32_N7ee673603fooEv,_ZThn20_N7ee673603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67360[0]),
  (VTBL_ENTRY)&_ZN7ee673603barEv,
  (VTBL_ENTRY)&_ZN7ee673603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee673603fooEv,_ZTv0_n16_N7ee673603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee673603barEv,_ZTv0_n12_N7ee673603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee673603fooEv,_ZTv0_n16_N7ee673603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee67360[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee67360[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee67360[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee67360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee67360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee67360[] = {
  {&(_ZTV7ee67360[4]),  4,17},
  {&(_tg__ZTV6dd7360__7ee67360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee67360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee67360[4]),  4,6},
  {&(_ZTV7ee67360[10]),  10,17},
  {&(_ZTV7ee67360[15]),  15,17},
  {&(_tg__ZTV5cc360__7ee67360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee67360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67360[];
extern  VTBL_ENTRY _ZTV7ee67360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67360[];
static VTBL_ENTRY alt_thunk_names228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn20_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn20_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn12_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee673603barEv,_ZTv0_n12_N7ee673603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee673603barEv,_ZThn20_N7ee673603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee673603fooEv,_ZTv0_n16_N7ee673603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee673603fooEv,_ZThn20_N7ee673603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee673603fooEv,_ZThn12_N7ee673603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67360 = {  "ee67360", // class name
  bases_ee67360, 4,
  &(vtc_ee67360[0]), // expected_vtbl_contents
  &(vtt_ee67360[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67360),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67360),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67360),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names228,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77360  : virtual dd7360 {
  int e;
  virtual void  foo(); // _ZN7ee773603fooEv
  virtual void  bar(); // _ZN7ee773603barEv
  ~ee77360(); // tgen
  ee77360(); // tgen
};
//SIG(1 ee77360) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77360 ::foo(){vfunc_called(this, "_ZN7ee773603fooEv");}
void  ee77360 ::bar(){vfunc_called(this, "_ZN7ee773603barEv");}
ee77360 ::~ee77360(){ note_dtor("ee77360", this);} // tgen
ee77360 ::ee77360(){ note_ctor("ee77360", this);} // tgen

static void Test_ee77360()
{
  extern Class_Descriptor cd_ee77360;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77360, buf);
    ee77360 *dp, &lv = *(dp=new (buf) ee77360());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77360)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77360)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee77360");
    check_base_class_offset(lv, (bb60*)(cc360*), ABISELECT(48,24), "ee77360");
    check_base_class_offset(lv, (cc360*)(dd7360*), ABISELECT(32,16), "ee77360");
    check_base_class_offset(lv, (dd7360*), ABISELECT(16,8), "ee77360");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77360.e");
    test_class_info(&lv, &cd_ee77360);
    dp->~ee77360();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77360(Test_ee77360, "ee77360", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77360C1Ev();
extern void _ZN7ee77360D1Ev();
Name_Map name_map_ee77360[] = {
  NSPAIR(_ZN7ee77360C1Ev),
  NSPAIR(_ZN7ee77360D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc360;
extern VTBL_ENTRY _ZTI5cc360[];
extern  VTBL_ENTRY _ZTV5cc360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc360[];
extern Class_Descriptor cd_dd7360;
extern VTBL_ENTRY _ZTI6dd7360[];
extern  VTBL_ENTRY _ZTV6dd7360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7360[];
static Base_Class bases_ee77360[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc360,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7360,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77360[];
extern void _ZN7ee773603fooEv();
extern void _ZN7ee773603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee773603barEv,_ZTv0_n20_N7ee773603barEv)();
extern void ABISELECT(_ZThn16_N7ee773603barEv,_ZThn8_N7ee773603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee773603fooEv,_ZTv0_n24_N7ee773603fooEv)();
extern void ABISELECT(_ZThn16_N7ee773603fooEv,_ZThn8_N7ee773603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee773603fooEv,_ZTv0_n16_N7ee773603fooEv)();
extern void ABISELECT(_ZThn32_N7ee773603fooEv,_ZThn16_N7ee773603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee773603barEv,_ZTv0_n12_N7ee773603barEv)();
extern void ABISELECT(_ZThn48_N7ee773603barEv,_ZThn24_N7ee773603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee773603fooEv,_ZTv0_n16_N7ee773603fooEv)();
extern void ABISELECT(_ZThn48_N7ee773603fooEv,_ZThn24_N7ee773603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77360[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77360[0]),
  (VTBL_ENTRY)&_ZN7ee773603fooEv,
  (VTBL_ENTRY)&_ZN7ee773603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee773603barEv,_ZTv0_n20_N7ee773603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee773603fooEv,_ZTv0_n24_N7ee773603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee773603fooEv,_ZTv0_n16_N7ee773603fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee773603barEv,_ZTv0_n12_N7ee773603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee773603fooEv,_ZTv0_n16_N7ee773603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77360[];
extern void _ZN6dd73603barEv();
extern void _ZN6dd73603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7360__7ee77360[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&_ZN6dd73603barEv,
  (VTBL_ENTRY)&_ZN6dd73603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc360__6dd7360__7ee77360[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv)();
extern void ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv)();
extern void ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7360__7ee77360[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7360[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv),
};
extern void _ZN5cc3603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc360__7ee77360[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN5cc3603fooEv,
};
extern void _ZN4bb603barEv();
extern void ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv)();
extern void ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc360__7ee77360[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc360[0]),
  (VTBL_ENTRY)&_ZN4bb603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv),
};
static  VTT_ENTRY vtt_ee77360[] = {
  {&(_ZTV7ee77360[5]),  5,26},
  {&(_ZTV7ee77360[13]),  13,26},
  {&(_ZTV7ee77360[19]),  19,26},
  {&(_ZTV7ee77360[24]),  24,26},
  {&(_tg__ZTV6dd7360__7ee77360[4]),  4,6},
  {&(_tg__ZTV5cc360__6dd7360__7ee77360[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7360__7ee77360[4]),  4,6},
  {&(_tg__ZTV5cc360__7ee77360[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc360__7ee77360[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77360[];
extern  VTBL_ENTRY _ZTV7ee77360[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77360[];
static VTBL_ENTRY alt_thunk_names229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc3603fooEv,_ZTv0_n16_N5cc3603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3603fooEv,_ZThn8_N5cc3603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73603barEv,_ZTv0_n12_N6dd73603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603barEv,_ZThn16_N6dd73603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73603fooEv,_ZTv0_n16_N6dd73603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73603fooEv,_ZThn16_N6dd73603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73603fooEv,_ZThn8_N6dd73603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee773603barEv,_ZTv0_n12_N7ee773603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee773603barEv,_ZThn24_N7ee773603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee773603fooEv,_ZTv0_n16_N7ee773603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee773603fooEv,_ZThn24_N7ee773603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee773603fooEv,_ZThn16_N7ee773603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee773603fooEv,_ZTv0_n24_N7ee773603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee773603fooEv,_ZThn8_N7ee773603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee773603barEv,_ZTv0_n20_N7ee773603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee773603barEv,_ZThn8_N7ee773603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77360 = {  "ee77360", // class name
  bases_ee77360, 4,
  &(vtc_ee77360[0]), // expected_vtbl_contents
  &(vtt_ee77360[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77360),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77360),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77360),9, //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  cc460  : bb60 {
  int c;
  virtual void  bar(); // _ZN5cc4603barEv
  ~cc460(); // tgen
  cc460(); // tgen
};
//SIG(-1 cc460) C1{ BC2{ BC3{ Fi} v1 v2 Fi} v1 Fi}


void  cc460 ::bar(){vfunc_called(this, "_ZN5cc4603barEv");}
cc460 ::~cc460(){ note_dtor("cc460", this);} // tgen
cc460 ::cc460(){ note_ctor("cc460", this);} // tgen

static void Test_cc460()
{
  extern Class_Descriptor cd_cc460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc460, buf);
    cc460 *dp, &lv = *(dp=new (buf) cc460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc460)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(8,4), "cc460");
    check_base_class_offset(lv, (bb60*), 0, "cc460");
    check_field_offset(lv, c, ABISELECT(16,12), "cc460.c");
    test_class_info(&lv, &cd_cc460);
    dp->~cc460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc460(Test_cc460, "cc460", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc460C1Ev();
extern void _ZN5cc460D1Ev();
Name_Map name_map_cc460[] = {
  NSPAIR(_ZN5cc460C1Ev),
  NSPAIR(_ZN5cc460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5cc460[];
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_cc460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
Class_Descriptor cd_cc460 = {  "cc460", // class name
  bases_cc460, 2,
  &(vtc_cc460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc460),4, //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  dd0460  : cc460 {
  int d;
  ~dd0460(); // tgen
  dd0460(); // tgen
};
//SIG(-1 dd0460) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} Fi}


dd0460 ::~dd0460(){ note_dtor("dd0460", this);} // tgen
dd0460 ::dd0460(){ note_ctor("dd0460", this);} // tgen

static void Test_dd0460()
{
  extern Class_Descriptor cd_dd0460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0460, buf);
    dd0460 *dp, &lv = *(dp=new (buf) dd0460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(8,4), "dd0460");
    check_base_class_offset(lv, (bb60*)(cc460*), 0, "dd0460");
    check_base_class_offset(lv, (cc460*), 0, "dd0460");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0460.d");
    test_class_info(&lv, &cd_dd0460);
    dp->~dd0460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0460(Test_dd0460, "dd0460", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0460C1Ev();
extern void _ZN6dd0460D1Ev();
Name_Map name_map_dd0460[] = {
  NSPAIR(_ZN6dd0460C1Ev),
  NSPAIR(_ZN6dd0460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd0460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0460[];
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd0460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
Class_Descriptor cd_dd0460 = {  "dd0460", // class name
  bases_dd0460, 3,
  &(vtc_dd0460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0460),4, //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  ee00460  : dd0460 {
  int e;
  ~ee00460(); // tgen
  ee00460(); // tgen
};
//SIG(1 ee00460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee00460 ::~ee00460(){ note_dtor("ee00460", this);} // tgen
ee00460 ::ee00460(){ note_ctor("ee00460", this);} // tgen

static void Test_ee00460()
{
  extern Class_Descriptor cd_ee00460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00460, buf);
    ee00460 *dp, &lv = *(dp=new (buf) ee00460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(8,4), "ee00460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), 0, "ee00460");
    check_base_class_offset(lv, (cc460*)(dd0460*), 0, "ee00460");
    check_base_class_offset(lv, (dd0460*), 0, "ee00460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00460.e");
    test_class_info(&lv, &cd_ee00460);
    dp->~ee00460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00460(Test_ee00460, "ee00460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00460C1Ev();
extern void _ZN7ee00460D1Ev();
Name_Map name_map_ee00460[] = {
  NSPAIR(_ZN7ee00460C1Ev),
  NSPAIR(_ZN7ee00460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee00460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee00460[];
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee00460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee00460[];
extern  VTBL_ENTRY _ZTV7ee00460[];
Class_Descriptor cd_ee00460 = {  "ee00460", // class name
  bases_ee00460, 4,
  &(vtc_ee00460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00460),4, //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  ee10460  : virtual dd0460 {
  int e;
  ~ee10460(); // tgen
  ee10460(); // tgen
};
//SIG(1 ee10460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee10460 ::~ee10460(){ note_dtor("ee10460", this);} // tgen
ee10460 ::ee10460(){ note_ctor("ee10460", this);} // tgen

static void Test_ee10460()
{
  extern Class_Descriptor cd_ee10460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10460, buf);
    ee10460 *dp, &lv = *(dp=new (buf) ee10460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(24,12), "ee10460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), ABISELECT(16,8), "ee10460");
    check_base_class_offset(lv, (cc460*)(dd0460*), ABISELECT(16,8), "ee10460");
    check_base_class_offset(lv, (dd0460*), ABISELECT(16,8), "ee10460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10460.e");
    test_class_info(&lv, &cd_ee10460);
    dp->~ee10460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10460(Test_ee10460, "ee10460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10460C1Ev();
extern void _ZN7ee10460D1Ev();
Name_Map name_map_ee10460[] = {
  NSPAIR(_ZN7ee10460C1Ev),
  NSPAIR(_ZN7ee10460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee10460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10460[];
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee10460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10460[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee10460[];
static  VTT_ENTRY vtt_ee10460[] = {
  {&(_ZTV7ee10460[3]),  3,9},
  {&(_ZTV7ee10460[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10460[];
extern  VTBL_ENTRY _ZTV7ee10460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10460[];
Class_Descriptor cd_ee10460 = {  "ee10460", // class name
  bases_ee10460, 4,
  &(vtc_ee10460[0]), // expected_vtbl_contents
  &(vtt_ee10460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10460),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10460),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  ee20460  : dd0460 {
  int e;
  virtual void  foo(); // _ZN7ee204603fooEv
  ~ee20460(); // tgen
  ee20460(); // tgen
};
//SIG(1 ee20460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee20460 ::foo(){vfunc_called(this, "_ZN7ee204603fooEv");}
ee20460 ::~ee20460(){ note_dtor("ee20460", this);} // tgen
ee20460 ::ee20460(){ note_ctor("ee20460", this);} // tgen

static void Test_ee20460()
{
  extern Class_Descriptor cd_ee20460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20460, buf);
    ee20460 *dp, &lv = *(dp=new (buf) ee20460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(8,4), "ee20460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), 0, "ee20460");
    check_base_class_offset(lv, (cc460*)(dd0460*), 0, "ee20460");
    check_base_class_offset(lv, (dd0460*), 0, "ee20460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20460.e");
    test_class_info(&lv, &cd_ee20460);
    dp->~ee20460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20460(Test_ee20460, "ee20460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20460C1Ev();
extern void _ZN7ee20460D1Ev();
Name_Map name_map_ee20460[] = {
  NSPAIR(_ZN7ee20460C1Ev),
  NSPAIR(_ZN7ee20460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee20460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee20460[];
extern void _ZN5cc4603barEv();
extern void _ZN7ee204603fooEv();
static  VTBL_ENTRY vtc_ee20460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN7ee204603fooEv,
};
extern VTBL_ENTRY _ZTI7ee20460[];
extern  VTBL_ENTRY _ZTV7ee20460[];
Class_Descriptor cd_ee20460 = {  "ee20460", // class name
  bases_ee20460, 4,
  &(vtc_ee20460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20460),4, //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  ee30460  : virtual dd0460 {
  int e;
  virtual void  foo(); // _ZN7ee304603fooEv
  ~ee30460(); // tgen
  ee30460(); // tgen
};
//SIG(1 ee30460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee30460 ::foo(){vfunc_called(this, "_ZN7ee304603fooEv");}
ee30460 ::~ee30460(){ note_dtor("ee30460", this);} // tgen
ee30460 ::ee30460(){ note_ctor("ee30460", this);} // tgen

static void Test_ee30460()
{
  extern Class_Descriptor cd_ee30460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30460, buf);
    ee30460 *dp, &lv = *(dp=new (buf) ee30460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(24,12), "ee30460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), ABISELECT(16,8), "ee30460");
    check_base_class_offset(lv, (cc460*)(dd0460*), ABISELECT(16,8), "ee30460");
    check_base_class_offset(lv, (dd0460*), ABISELECT(16,8), "ee30460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30460.e");
    test_class_info(&lv, &cd_ee30460);
    dp->~ee30460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30460(Test_ee30460, "ee30460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30460C1Ev();
extern void _ZN7ee30460D1Ev();
Name_Map name_map_ee30460[] = {
  NSPAIR(_ZN7ee30460C1Ev),
  NSPAIR(_ZN7ee30460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee30460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30460[];
extern void _ZN7ee304603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee304603fooEv,_ZTv0_n16_N7ee304603fooEv)();
extern void ABISELECT(_ZThn16_N7ee304603fooEv,_ZThn8_N7ee304603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30460[0]),
  (VTBL_ENTRY)&_ZN7ee304603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee304603fooEv,_ZTv0_n16_N7ee304603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30460[];
static  VTT_ENTRY vtt_ee30460[] = {
  {&(_ZTV7ee30460[3]),  3,10},
  {&(_ZTV7ee30460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30460[];
extern  VTBL_ENTRY _ZTV7ee30460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30460[];
static VTBL_ENTRY alt_thunk_names230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee304603fooEv,_ZTv0_n16_N7ee304603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee304603fooEv,_ZThn8_N7ee304603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30460 = {  "ee30460", // class name
  bases_ee30460, 4,
  &(vtc_ee30460[0]), // expected_vtbl_contents
  &(vtt_ee30460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30460),2, //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  ee40460  : dd0460 {
  int e;
  virtual void  bar(); // _ZN7ee404603barEv
  ~ee40460(); // tgen
  ee40460(); // tgen
};
//SIG(1 ee40460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee40460 ::bar(){vfunc_called(this, "_ZN7ee404603barEv");}
ee40460 ::~ee40460(){ note_dtor("ee40460", this);} // tgen
ee40460 ::ee40460(){ note_ctor("ee40460", this);} // tgen

static void Test_ee40460()
{
  extern Class_Descriptor cd_ee40460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40460, buf);
    ee40460 *dp, &lv = *(dp=new (buf) ee40460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(8,4), "ee40460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), 0, "ee40460");
    check_base_class_offset(lv, (cc460*)(dd0460*), 0, "ee40460");
    check_base_class_offset(lv, (dd0460*), 0, "ee40460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40460.e");
    test_class_info(&lv, &cd_ee40460);
    dp->~ee40460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40460(Test_ee40460, "ee40460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40460C1Ev();
extern void _ZN7ee40460D1Ev();
Name_Map name_map_ee40460[] = {
  NSPAIR(_ZN7ee40460C1Ev),
  NSPAIR(_ZN7ee40460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee40460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee40460[];
extern void _ZN7ee404603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee40460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40460[0]),
  (VTBL_ENTRY)&_ZN7ee404603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee40460[];
extern  VTBL_ENTRY _ZTV7ee40460[];
Class_Descriptor cd_ee40460 = {  "ee40460", // class name
  bases_ee40460, 4,
  &(vtc_ee40460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40460),4, //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  ee50460  : virtual dd0460 {
  int e;
  virtual void  bar(); // _ZN7ee504603barEv
  ~ee50460(); // tgen
  ee50460(); // tgen
};
//SIG(1 ee50460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee50460 ::bar(){vfunc_called(this, "_ZN7ee504603barEv");}
ee50460 ::~ee50460(){ note_dtor("ee50460", this);} // tgen
ee50460 ::ee50460(){ note_ctor("ee50460", this);} // tgen

static void Test_ee50460()
{
  extern Class_Descriptor cd_ee50460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50460, buf);
    ee50460 *dp, &lv = *(dp=new (buf) ee50460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(24,12), "ee50460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), ABISELECT(16,8), "ee50460");
    check_base_class_offset(lv, (cc460*)(dd0460*), ABISELECT(16,8), "ee50460");
    check_base_class_offset(lv, (dd0460*), ABISELECT(16,8), "ee50460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50460.e");
    test_class_info(&lv, &cd_ee50460);
    dp->~ee50460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50460(Test_ee50460, "ee50460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50460C1Ev();
extern void _ZN7ee50460D1Ev();
Name_Map name_map_ee50460[] = {
  NSPAIR(_ZN7ee50460C1Ev),
  NSPAIR(_ZN7ee50460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee50460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50460[];
extern void _ZN7ee504603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee504603barEv,_ZTv0_n12_N7ee504603barEv)();
extern void ABISELECT(_ZThn16_N7ee504603barEv,_ZThn8_N7ee504603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee50460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50460[0]),
  (VTBL_ENTRY)&_ZN7ee504603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee504603barEv,_ZTv0_n12_N7ee504603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee50460[];
static  VTT_ENTRY vtt_ee50460[] = {
  {&(_ZTV7ee50460[3]),  3,10},
  {&(_ZTV7ee50460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50460[];
extern  VTBL_ENTRY _ZTV7ee50460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50460[];
static VTBL_ENTRY alt_thunk_names231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee504603barEv,_ZTv0_n12_N7ee504603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee504603barEv,_ZThn8_N7ee504603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50460 = {  "ee50460", // class name
  bases_ee50460, 4,
  &(vtc_ee50460[0]), // expected_vtbl_contents
  &(vtt_ee50460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50460),2, //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  ee60460  : dd0460 {
  int e;
  virtual void  foo(); // _ZN7ee604603fooEv
  virtual void  bar(); // _ZN7ee604603barEv
  ~ee60460(); // tgen
  ee60460(); // tgen
};
//SIG(1 ee60460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee60460 ::foo(){vfunc_called(this, "_ZN7ee604603fooEv");}
void  ee60460 ::bar(){vfunc_called(this, "_ZN7ee604603barEv");}
ee60460 ::~ee60460(){ note_dtor("ee60460", this);} // tgen
ee60460 ::ee60460(){ note_ctor("ee60460", this);} // tgen

static void Test_ee60460()
{
  extern Class_Descriptor cd_ee60460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60460, buf);
    ee60460 *dp, &lv = *(dp=new (buf) ee60460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(8,4), "ee60460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), 0, "ee60460");
    check_base_class_offset(lv, (cc460*)(dd0460*), 0, "ee60460");
    check_base_class_offset(lv, (dd0460*), 0, "ee60460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60460.e");
    test_class_info(&lv, &cd_ee60460);
    dp->~ee60460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60460(Test_ee60460, "ee60460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60460C1Ev();
extern void _ZN7ee60460D1Ev();
Name_Map name_map_ee60460[] = {
  NSPAIR(_ZN7ee60460C1Ev),
  NSPAIR(_ZN7ee60460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee60460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee60460[];
extern void _ZN7ee604603barEv();
extern void _ZN7ee604603fooEv();
static  VTBL_ENTRY vtc_ee60460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60460[0]),
  (VTBL_ENTRY)&_ZN7ee604603barEv,
  (VTBL_ENTRY)&_ZN7ee604603fooEv,
};
extern VTBL_ENTRY _ZTI7ee60460[];
extern  VTBL_ENTRY _ZTV7ee60460[];
Class_Descriptor cd_ee60460 = {  "ee60460", // class name
  bases_ee60460, 4,
  &(vtc_ee60460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60460),4, //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  ee70460  : virtual dd0460 {
  int e;
  virtual void  foo(); // _ZN7ee704603fooEv
  virtual void  bar(); // _ZN7ee704603barEv
  ~ee70460(); // tgen
  ee70460(); // tgen
};
//SIG(1 ee70460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee70460 ::foo(){vfunc_called(this, "_ZN7ee704603fooEv");}
void  ee70460 ::bar(){vfunc_called(this, "_ZN7ee704603barEv");}
ee70460 ::~ee70460(){ note_dtor("ee70460", this);} // tgen
ee70460 ::ee70460(){ note_ctor("ee70460", this);} // tgen

static void Test_ee70460()
{
  extern Class_Descriptor cd_ee70460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70460, buf);
    ee70460 *dp, &lv = *(dp=new (buf) ee70460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd0460*), ABISELECT(24,12), "ee70460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd0460*), ABISELECT(16,8), "ee70460");
    check_base_class_offset(lv, (cc460*)(dd0460*), ABISELECT(16,8), "ee70460");
    check_base_class_offset(lv, (dd0460*), ABISELECT(16,8), "ee70460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70460.e");
    test_class_info(&lv, &cd_ee70460);
    dp->~ee70460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70460(Test_ee70460, "ee70460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70460C1Ev();
extern void _ZN7ee70460D1Ev();
Name_Map name_map_ee70460[] = {
  NSPAIR(_ZN7ee70460C1Ev),
  NSPAIR(_ZN7ee70460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd0460;
extern VTBL_ENTRY _ZTI6dd0460[];
extern  VTBL_ENTRY _ZTV6dd0460[];
static Base_Class bases_ee70460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0460,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70460[];
extern void _ZN7ee704603fooEv();
extern void _ZN7ee704603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee704603barEv,_ZTv0_n12_N7ee704603barEv)();
extern void ABISELECT(_ZThn16_N7ee704603barEv,_ZThn8_N7ee704603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee704603fooEv,_ZTv0_n16_N7ee704603fooEv)();
extern void ABISELECT(_ZThn16_N7ee704603fooEv,_ZThn8_N7ee704603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70460[0]),
  (VTBL_ENTRY)&_ZN7ee704603fooEv,
  (VTBL_ENTRY)&_ZN7ee704603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee704603barEv,_ZTv0_n12_N7ee704603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee704603fooEv,_ZTv0_n16_N7ee704603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70460[];
static  VTT_ENTRY vtt_ee70460[] = {
  {&(_ZTV7ee70460[3]),  3,11},
  {&(_ZTV7ee70460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70460[];
extern  VTBL_ENTRY _ZTV7ee70460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70460[];
static VTBL_ENTRY alt_thunk_names232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee704603fooEv,_ZTv0_n16_N7ee704603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee704603fooEv,_ZThn8_N7ee704603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee704603barEv,_ZTv0_n12_N7ee704603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee704603barEv,_ZThn8_N7ee704603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70460 = {  "ee70460", // class name
  bases_ee70460, 4,
  &(vtc_ee70460[0]), // expected_vtbl_contents
  &(vtt_ee70460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70460),2, //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  dd1460  : virtual cc460 {
  int d;
  ~dd1460(); // tgen
  dd1460(); // tgen
};
//SIG(-1 dd1460) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} Fi}


dd1460 ::~dd1460(){ note_dtor("dd1460", this);} // tgen
dd1460 ::dd1460(){ note_ctor("dd1460", this);} // tgen

static void Test_dd1460()
{
  extern Class_Descriptor cd_dd1460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1460, buf);
    dd1460 *dp, &lv = *(dp=new (buf) dd1460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,12), "dd1460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,8), "dd1460");
    check_base_class_offset(lv, (cc460*), ABISELECT(16,8), "dd1460");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1460.d");
    test_class_info(&lv, &cd_dd1460);
    dp->~dd1460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1460(Test_dd1460, "dd1460", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1460C1Ev();
extern void _ZN6dd1460D1Ev();
Name_Map name_map_dd1460[] = {
  NSPAIR(_ZN6dd1460C1Ev),
  NSPAIR(_ZN6dd1460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd1460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1460[];
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd1460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd1460[];
static  VTT_ENTRY vtt_dd1460[] = {
  {&(_ZTV6dd1460[3]),  3,9},
  {&(_ZTV6dd1460[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
Class_Descriptor cd_dd1460 = {  "dd1460", // class name
  bases_dd1460, 3,
  &(vtc_dd1460[0]), // expected_vtbl_contents
  &(vtt_dd1460[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1460),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1460),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  ee01460  : dd1460 {
  int e;
  ~ee01460(); // tgen
  ee01460(); // tgen
};
//SIG(1 ee01460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee01460 ::~ee01460(){ note_dtor("ee01460", this);} // tgen
ee01460 ::ee01460(){ note_ctor("ee01460", this);} // tgen

static void Test_ee01460()
{
  extern Class_Descriptor cd_ee01460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01460, buf);
    ee01460 *dp, &lv = *(dp=new (buf) ee01460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee01460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee01460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(16,12), "ee01460");
    check_base_class_offset(lv, (dd1460*), 0, "ee01460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01460.e");
    test_class_info(&lv, &cd_ee01460);
    dp->~ee01460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01460(Test_ee01460, "ee01460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01460C1Ev();
extern void _ZN7ee01460D1Ev();
Name_Map name_map_ee01460[] = {
  NSPAIR(_ZN7ee01460C1Ev),
  NSPAIR(_ZN7ee01460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee01460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01460[];
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee01460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01460[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee01460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee01460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee01460[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee01460[] = {
  {&(_ZTV7ee01460[3]),  3,9},
  {&(_tg__ZTV6dd1460__7ee01460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee01460[4]),  4,6},
  {&(_ZTV7ee01460[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01460[];
extern  VTBL_ENTRY _ZTV7ee01460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01460[];
Class_Descriptor cd_ee01460 = {  "ee01460", // class name
  bases_ee01460, 4,
  &(vtc_ee01460[0]), // expected_vtbl_contents
  &(vtt_ee01460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01460),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01460),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  ee11460  : virtual dd1460 {
  int e;
  ~ee11460(); // tgen
  ee11460(); // tgen
};
//SIG(1 ee11460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee11460 ::~ee11460(){ note_dtor("ee11460", this);} // tgen
ee11460 ::ee11460(){ note_ctor("ee11460", this);} // tgen

static void Test_ee11460()
{
  extern Class_Descriptor cd_ee11460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11460, buf);
    ee11460 *dp, &lv = *(dp=new (buf) ee11460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee11460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee11460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(32,16), "ee11460");
    check_base_class_offset(lv, (dd1460*), ABISELECT(16,8), "ee11460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11460.e");
    test_class_info(&lv, &cd_ee11460);
    dp->~ee11460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11460(Test_ee11460, "ee11460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11460C1Ev();
extern void _ZN7ee11460D1Ev();
Name_Map name_map_ee11460[] = {
  NSPAIR(_ZN7ee11460C1Ev),
  NSPAIR(_ZN7ee11460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee11460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11460[];
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee11460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11460[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11460[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee11460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee11460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee11460[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee11460[] = {
  {&(_ZTV7ee11460[4]),  4,13},
  {&(_ZTV7ee11460[7]),  7,13},
  {&(_ZTV7ee11460[11]),  11,13},
  {&(_tg__ZTV6dd1460__7ee11460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee11460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11460[];
extern  VTBL_ENTRY _ZTV7ee11460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11460[];
Class_Descriptor cd_ee11460 = {  "ee11460", // class name
  bases_ee11460, 4,
  &(vtc_ee11460[0]), // expected_vtbl_contents
  &(vtt_ee11460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11460),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11460),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  ee21460  : dd1460 {
  int e;
  virtual void  foo(); // _ZN7ee214603fooEv
  ~ee21460(); // tgen
  ee21460(); // tgen
};
//SIG(1 ee21460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee21460 ::foo(){vfunc_called(this, "_ZN7ee214603fooEv");}
ee21460 ::~ee21460(){ note_dtor("ee21460", this);} // tgen
ee21460 ::ee21460(){ note_ctor("ee21460", this);} // tgen

static void Test_ee21460()
{
  extern Class_Descriptor cd_ee21460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21460, buf);
    ee21460 *dp, &lv = *(dp=new (buf) ee21460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee21460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee21460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(16,12), "ee21460");
    check_base_class_offset(lv, (dd1460*), 0, "ee21460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21460.e");
    test_class_info(&lv, &cd_ee21460);
    dp->~ee21460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21460(Test_ee21460, "ee21460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21460C1Ev();
extern void _ZN7ee21460D1Ev();
Name_Map name_map_ee21460[] = {
  NSPAIR(_ZN7ee21460C1Ev),
  NSPAIR(_ZN7ee21460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee21460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21460[];
extern void _ZN7ee214603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee214603fooEv,_ZTv0_n16_N7ee214603fooEv)();
extern void ABISELECT(_ZThn16_N7ee214603fooEv,_ZThn12_N7ee214603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21460[0]),
  (VTBL_ENTRY)&_ZN7ee214603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee214603fooEv,_ZTv0_n16_N7ee214603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee21460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee21460[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee21460[] = {
  {&(_ZTV7ee21460[3]),  3,10},
  {&(_tg__ZTV6dd1460__7ee21460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee21460[4]),  4,6},
  {&(_ZTV7ee21460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21460[];
extern  VTBL_ENTRY _ZTV7ee21460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21460[];
static VTBL_ENTRY alt_thunk_names233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee214603fooEv,_ZTv0_n16_N7ee214603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee214603fooEv,_ZThn12_N7ee214603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21460 = {  "ee21460", // class name
  bases_ee21460, 4,
  &(vtc_ee21460[0]), // expected_vtbl_contents
  &(vtt_ee21460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21460),4, //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  ee31460  : virtual dd1460 {
  int e;
  virtual void  foo(); // _ZN7ee314603fooEv
  ~ee31460(); // tgen
  ee31460(); // tgen
};
//SIG(1 ee31460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee31460 ::foo(){vfunc_called(this, "_ZN7ee314603fooEv");}
ee31460 ::~ee31460(){ note_dtor("ee31460", this);} // tgen
ee31460 ::ee31460(){ note_ctor("ee31460", this);} // tgen

static void Test_ee31460()
{
  extern Class_Descriptor cd_ee31460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31460, buf);
    ee31460 *dp, &lv = *(dp=new (buf) ee31460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee31460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee31460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(32,16), "ee31460");
    check_base_class_offset(lv, (dd1460*), ABISELECT(16,8), "ee31460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31460.e");
    test_class_info(&lv, &cd_ee31460);
    dp->~ee31460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31460(Test_ee31460, "ee31460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31460C1Ev();
extern void _ZN7ee31460D1Ev();
Name_Map name_map_ee31460[] = {
  NSPAIR(_ZN7ee31460C1Ev),
  NSPAIR(_ZN7ee31460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee31460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31460[];
extern void _ZN7ee314603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee314603fooEv,_ZTv0_n16_N7ee314603fooEv)();
extern void ABISELECT(_ZThn32_N7ee314603fooEv,_ZThn16_N7ee314603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31460[0]),
  (VTBL_ENTRY)&_ZN7ee314603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31460[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee314603fooEv,_ZTv0_n16_N7ee314603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee31460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee31460[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee31460[] = {
  {&(_ZTV7ee31460[4]),  4,14},
  {&(_ZTV7ee31460[8]),  8,14},
  {&(_ZTV7ee31460[12]),  12,14},
  {&(_tg__ZTV6dd1460__7ee31460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee31460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31460[];
extern  VTBL_ENTRY _ZTV7ee31460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31460[];
static VTBL_ENTRY alt_thunk_names234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee314603fooEv,_ZTv0_n16_N7ee314603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee314603fooEv,_ZThn16_N7ee314603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31460 = {  "ee31460", // class name
  bases_ee31460, 4,
  &(vtc_ee31460[0]), // expected_vtbl_contents
  &(vtt_ee31460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31460),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names234,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41460  : dd1460 {
  int e;
  virtual void  bar(); // _ZN7ee414603barEv
  ~ee41460(); // tgen
  ee41460(); // tgen
};
//SIG(1 ee41460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee41460 ::bar(){vfunc_called(this, "_ZN7ee414603barEv");}
ee41460 ::~ee41460(){ note_dtor("ee41460", this);} // tgen
ee41460 ::ee41460(){ note_ctor("ee41460", this);} // tgen

static void Test_ee41460()
{
  extern Class_Descriptor cd_ee41460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41460, buf);
    ee41460 *dp, &lv = *(dp=new (buf) ee41460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee41460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee41460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(16,12), "ee41460");
    check_base_class_offset(lv, (dd1460*), 0, "ee41460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41460.e");
    test_class_info(&lv, &cd_ee41460);
    dp->~ee41460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41460(Test_ee41460, "ee41460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41460C1Ev();
extern void _ZN7ee41460D1Ev();
Name_Map name_map_ee41460[] = {
  NSPAIR(_ZN7ee41460C1Ev),
  NSPAIR(_ZN7ee41460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee41460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41460[];
extern void _ZN7ee414603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee414603barEv,_ZTv0_n12_N7ee414603barEv)();
extern void ABISELECT(_ZThn16_N7ee414603barEv,_ZThn12_N7ee414603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee41460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41460[0]),
  (VTBL_ENTRY)&_ZN7ee414603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee414603barEv,_ZTv0_n12_N7ee414603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee41460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee41460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee41460[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee41460[] = {
  {&(_ZTV7ee41460[3]),  3,10},
  {&(_tg__ZTV6dd1460__7ee41460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee41460[4]),  4,6},
  {&(_ZTV7ee41460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41460[];
extern  VTBL_ENTRY _ZTV7ee41460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41460[];
static VTBL_ENTRY alt_thunk_names235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee414603barEv,_ZTv0_n12_N7ee414603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee414603barEv,_ZThn12_N7ee414603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41460 = {  "ee41460", // class name
  bases_ee41460, 4,
  &(vtc_ee41460[0]), // expected_vtbl_contents
  &(vtt_ee41460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names235,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51460  : virtual dd1460 {
  int e;
  virtual void  bar(); // _ZN7ee514603barEv
  ~ee51460(); // tgen
  ee51460(); // tgen
};
//SIG(1 ee51460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee51460 ::bar(){vfunc_called(this, "_ZN7ee514603barEv");}
ee51460 ::~ee51460(){ note_dtor("ee51460", this);} // tgen
ee51460 ::ee51460(){ note_ctor("ee51460", this);} // tgen

static void Test_ee51460()
{
  extern Class_Descriptor cd_ee51460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51460, buf);
    ee51460 *dp, &lv = *(dp=new (buf) ee51460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee51460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee51460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(32,16), "ee51460");
    check_base_class_offset(lv, (dd1460*), ABISELECT(16,8), "ee51460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51460.e");
    test_class_info(&lv, &cd_ee51460);
    dp->~ee51460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51460(Test_ee51460, "ee51460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51460C1Ev();
extern void _ZN7ee51460D1Ev();
Name_Map name_map_ee51460[] = {
  NSPAIR(_ZN7ee51460C1Ev),
  NSPAIR(_ZN7ee51460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee51460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51460[];
extern void _ZN7ee514603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee514603barEv,_ZTv0_n12_N7ee514603barEv)();
extern void ABISELECT(_ZThn32_N7ee514603barEv,_ZThn16_N7ee514603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee51460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51460[0]),
  (VTBL_ENTRY)&_ZN7ee514603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51460[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee514603barEv,_ZTv0_n12_N7ee514603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee51460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee51460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee51460[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee51460[] = {
  {&(_ZTV7ee51460[4]),  4,14},
  {&(_ZTV7ee51460[8]),  8,14},
  {&(_ZTV7ee51460[12]),  12,14},
  {&(_tg__ZTV6dd1460__7ee51460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee51460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51460[];
extern  VTBL_ENTRY _ZTV7ee51460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51460[];
static VTBL_ENTRY alt_thunk_names236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee514603barEv,_ZTv0_n12_N7ee514603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee514603barEv,_ZThn16_N7ee514603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51460 = {  "ee51460", // class name
  bases_ee51460, 4,
  &(vtc_ee51460[0]), // expected_vtbl_contents
  &(vtt_ee51460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51460),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names236,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61460  : dd1460 {
  int e;
  virtual void  foo(); // _ZN7ee614603fooEv
  virtual void  bar(); // _ZN7ee614603barEv
  ~ee61460(); // tgen
  ee61460(); // tgen
};
//SIG(1 ee61460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee61460 ::foo(){vfunc_called(this, "_ZN7ee614603fooEv");}
void  ee61460 ::bar(){vfunc_called(this, "_ZN7ee614603barEv");}
ee61460 ::~ee61460(){ note_dtor("ee61460", this);} // tgen
ee61460 ::ee61460(){ note_ctor("ee61460", this);} // tgen

static void Test_ee61460()
{
  extern Class_Descriptor cd_ee61460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61460, buf);
    ee61460 *dp, &lv = *(dp=new (buf) ee61460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee61460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee61460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(16,12), "ee61460");
    check_base_class_offset(lv, (dd1460*), 0, "ee61460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61460.e");
    test_class_info(&lv, &cd_ee61460);
    dp->~ee61460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61460(Test_ee61460, "ee61460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61460C1Ev();
extern void _ZN7ee61460D1Ev();
Name_Map name_map_ee61460[] = {
  NSPAIR(_ZN7ee61460C1Ev),
  NSPAIR(_ZN7ee61460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee61460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61460[];
extern void _ZN7ee614603fooEv();
extern void _ZN7ee614603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee614603barEv,_ZTv0_n12_N7ee614603barEv)();
extern void ABISELECT(_ZThn16_N7ee614603barEv,_ZThn12_N7ee614603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee614603fooEv,_ZTv0_n16_N7ee614603fooEv)();
extern void ABISELECT(_ZThn16_N7ee614603fooEv,_ZThn12_N7ee614603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61460[0]),
  (VTBL_ENTRY)&_ZN7ee614603fooEv,
  (VTBL_ENTRY)&_ZN7ee614603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee614603barEv,_ZTv0_n12_N7ee614603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee614603fooEv,_ZTv0_n16_N7ee614603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee61460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee61460[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee61460[] = {
  {&(_ZTV7ee61460[3]),  3,11},
  {&(_tg__ZTV6dd1460__7ee61460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee61460[4]),  4,6},
  {&(_ZTV7ee61460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61460[];
extern  VTBL_ENTRY _ZTV7ee61460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61460[];
static VTBL_ENTRY alt_thunk_names237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee614603fooEv,_ZTv0_n16_N7ee614603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee614603fooEv,_ZThn12_N7ee614603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee614603barEv,_ZTv0_n12_N7ee614603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee614603barEv,_ZThn12_N7ee614603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61460 = {  "ee61460", // class name
  bases_ee61460, 4,
  &(vtc_ee61460[0]), // expected_vtbl_contents
  &(vtt_ee61460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names237,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71460  : virtual dd1460 {
  int e;
  virtual void  foo(); // _ZN7ee714603fooEv
  virtual void  bar(); // _ZN7ee714603barEv
  ~ee71460(); // tgen
  ee71460(); // tgen
};
//SIG(1 ee71460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee71460 ::foo(){vfunc_called(this, "_ZN7ee714603fooEv");}
void  ee71460 ::bar(){vfunc_called(this, "_ZN7ee714603barEv");}
ee71460 ::~ee71460(){ note_dtor("ee71460", this);} // tgen
ee71460 ::ee71460(){ note_ctor("ee71460", this);} // tgen

static void Test_ee71460()
{
  extern Class_Descriptor cd_ee71460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71460, buf);
    ee71460 *dp, &lv = *(dp=new (buf) ee71460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee71460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee71460");
    check_base_class_offset(lv, (cc460*)(dd1460*), ABISELECT(32,16), "ee71460");
    check_base_class_offset(lv, (dd1460*), ABISELECT(16,8), "ee71460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71460.e");
    test_class_info(&lv, &cd_ee71460);
    dp->~ee71460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71460(Test_ee71460, "ee71460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71460C1Ev();
extern void _ZN7ee71460D1Ev();
Name_Map name_map_ee71460[] = {
  NSPAIR(_ZN7ee71460C1Ev),
  NSPAIR(_ZN7ee71460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd1460;
extern VTBL_ENTRY _ZTI6dd1460[];
extern  VTBL_ENTRY _ZTV6dd1460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1460[];
static Base_Class bases_ee71460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1460,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71460[];
extern void _ZN7ee714603fooEv();
extern void _ZN7ee714603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee714603barEv,_ZTv0_n12_N7ee714603barEv)();
extern void ABISELECT(_ZThn32_N7ee714603barEv,_ZThn16_N7ee714603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee714603fooEv,_ZTv0_n16_N7ee714603fooEv)();
extern void ABISELECT(_ZThn32_N7ee714603fooEv,_ZThn16_N7ee714603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71460[0]),
  (VTBL_ENTRY)&_ZN7ee714603fooEv,
  (VTBL_ENTRY)&_ZN7ee714603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71460[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee714603barEv,_ZTv0_n12_N7ee714603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee714603fooEv,_ZTv0_n16_N7ee714603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71460[];
static  VTBL_ENTRY _tg__ZTV6dd1460__7ee71460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
};
extern void _ZN5cc4603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd1460__7ee71460[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee71460[] = {
  {&(_ZTV7ee71460[4]),  4,15},
  {&(_ZTV7ee71460[9]),  9,15},
  {&(_ZTV7ee71460[13]),  13,15},
  {&(_tg__ZTV6dd1460__7ee71460[3]),  3,3},
  {&(_tg__ZTV5cc460__6dd1460__7ee71460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71460[];
extern  VTBL_ENTRY _ZTV7ee71460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71460[];
static VTBL_ENTRY alt_thunk_names238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee714603fooEv,_ZTv0_n16_N7ee714603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee714603fooEv,_ZThn16_N7ee714603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee714603barEv,_ZTv0_n12_N7ee714603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee714603barEv,_ZThn16_N7ee714603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71460 = {  "ee71460", // class name
  bases_ee71460, 4,
  &(vtc_ee71460[0]), // expected_vtbl_contents
  &(vtt_ee71460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71460),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names238,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2460  : cc460 {
  int d;
  virtual void  foo(); // _ZN6dd24603fooEv
  ~dd2460(); // tgen
  dd2460(); // tgen
};
//SIG(-1 dd2460) C1{ BC2{ BC3{ BC4{ Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd2460 ::foo(){vfunc_called(this, "_ZN6dd24603fooEv");}
dd2460 ::~dd2460(){ note_dtor("dd2460", this);} // tgen
dd2460 ::dd2460(){ note_ctor("dd2460", this);} // tgen

static void Test_dd2460()
{
  extern Class_Descriptor cd_dd2460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2460, buf);
    dd2460 *dp, &lv = *(dp=new (buf) dd2460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(8,4), "dd2460");
    check_base_class_offset(lv, (bb60*)(cc460*), 0, "dd2460");
    check_base_class_offset(lv, (cc460*), 0, "dd2460");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2460.d");
    test_class_info(&lv, &cd_dd2460);
    dp->~dd2460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2460(Test_dd2460, "dd2460", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2460C1Ev();
extern void _ZN6dd2460D1Ev();
Name_Map name_map_dd2460[] = {
  NSPAIR(_ZN6dd2460C1Ev),
  NSPAIR(_ZN6dd2460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd2460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd2460[];
extern void _ZN5cc4603barEv();
extern void _ZN6dd24603fooEv();
static  VTBL_ENTRY vtc_dd2460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN6dd24603fooEv,
};
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
Class_Descriptor cd_dd2460 = {  "dd2460", // class name
  bases_dd2460, 3,
  &(vtc_dd2460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2460),4, //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  ee02460  : dd2460 {
  int e;
  ~ee02460(); // tgen
  ee02460(); // tgen
};
//SIG(1 ee02460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee02460 ::~ee02460(){ note_dtor("ee02460", this);} // tgen
ee02460 ::ee02460(){ note_ctor("ee02460", this);} // tgen

static void Test_ee02460()
{
  extern Class_Descriptor cd_ee02460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02460, buf);
    ee02460 *dp, &lv = *(dp=new (buf) ee02460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(8,4), "ee02460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), 0, "ee02460");
    check_base_class_offset(lv, (cc460*)(dd2460*), 0, "ee02460");
    check_base_class_offset(lv, (dd2460*), 0, "ee02460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02460.e");
    test_class_info(&lv, &cd_ee02460);
    dp->~ee02460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02460(Test_ee02460, "ee02460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02460C1Ev();
extern void _ZN7ee02460D1Ev();
Name_Map name_map_ee02460[] = {
  NSPAIR(_ZN7ee02460C1Ev),
  NSPAIR(_ZN7ee02460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee02460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02460[];
extern void _ZN5cc4603barEv();
extern void _ZN6dd24603fooEv();
static  VTBL_ENTRY vtc_ee02460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN6dd24603fooEv,
};
extern VTBL_ENTRY _ZTI7ee02460[];
extern  VTBL_ENTRY _ZTV7ee02460[];
Class_Descriptor cd_ee02460 = {  "ee02460", // class name
  bases_ee02460, 4,
  &(vtc_ee02460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02460),4, //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  ee12460  : virtual dd2460 {
  int e;
  ~ee12460(); // tgen
  ee12460(); // tgen
};
//SIG(1 ee12460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee12460 ::~ee12460(){ note_dtor("ee12460", this);} // tgen
ee12460 ::ee12460(){ note_ctor("ee12460", this);} // tgen

static void Test_ee12460()
{
  extern Class_Descriptor cd_ee12460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12460, buf);
    ee12460 *dp, &lv = *(dp=new (buf) ee12460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(24,12), "ee12460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), ABISELECT(16,8), "ee12460");
    check_base_class_offset(lv, (cc460*)(dd2460*), ABISELECT(16,8), "ee12460");
    check_base_class_offset(lv, (dd2460*), ABISELECT(16,8), "ee12460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12460.e");
    test_class_info(&lv, &cd_ee12460);
    dp->~ee12460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12460(Test_ee12460, "ee12460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12460C1Ev();
extern void _ZN7ee12460D1Ev();
Name_Map name_map_ee12460[] = {
  NSPAIR(_ZN7ee12460C1Ev),
  NSPAIR(_ZN7ee12460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee12460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12460[];
extern void _ZN5cc4603barEv();
extern void _ZN6dd24603fooEv();
static  VTBL_ENTRY vtc_ee12460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12460[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN6dd24603fooEv,
};
extern VTBL_ENTRY _ZTV7ee12460[];
static  VTT_ENTRY vtt_ee12460[] = {
  {&(_ZTV7ee12460[3]),  3,9},
  {&(_ZTV7ee12460[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12460[];
extern  VTBL_ENTRY _ZTV7ee12460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12460[];
Class_Descriptor cd_ee12460 = {  "ee12460", // class name
  bases_ee12460, 4,
  &(vtc_ee12460[0]), // expected_vtbl_contents
  &(vtt_ee12460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12460),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12460),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  ee22460  : dd2460 {
  int e;
  virtual void  foo(); // _ZN7ee224603fooEv
  ~ee22460(); // tgen
  ee22460(); // tgen
};
//SIG(1 ee22460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee22460 ::foo(){vfunc_called(this, "_ZN7ee224603fooEv");}
ee22460 ::~ee22460(){ note_dtor("ee22460", this);} // tgen
ee22460 ::ee22460(){ note_ctor("ee22460", this);} // tgen

static void Test_ee22460()
{
  extern Class_Descriptor cd_ee22460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22460, buf);
    ee22460 *dp, &lv = *(dp=new (buf) ee22460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(8,4), "ee22460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), 0, "ee22460");
    check_base_class_offset(lv, (cc460*)(dd2460*), 0, "ee22460");
    check_base_class_offset(lv, (dd2460*), 0, "ee22460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22460.e");
    test_class_info(&lv, &cd_ee22460);
    dp->~ee22460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22460(Test_ee22460, "ee22460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22460C1Ev();
extern void _ZN7ee22460D1Ev();
Name_Map name_map_ee22460[] = {
  NSPAIR(_ZN7ee22460C1Ev),
  NSPAIR(_ZN7ee22460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee22460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee22460[];
extern void _ZN5cc4603barEv();
extern void _ZN7ee224603fooEv();
static  VTBL_ENTRY vtc_ee22460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&_ZN7ee224603fooEv,
};
extern VTBL_ENTRY _ZTI7ee22460[];
extern  VTBL_ENTRY _ZTV7ee22460[];
Class_Descriptor cd_ee22460 = {  "ee22460", // class name
  bases_ee22460, 4,
  &(vtc_ee22460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22460),4, //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  ee32460  : virtual dd2460 {
  int e;
  virtual void  foo(); // _ZN7ee324603fooEv
  ~ee32460(); // tgen
  ee32460(); // tgen
};
//SIG(1 ee32460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee32460 ::foo(){vfunc_called(this, "_ZN7ee324603fooEv");}
ee32460 ::~ee32460(){ note_dtor("ee32460", this);} // tgen
ee32460 ::ee32460(){ note_ctor("ee32460", this);} // tgen

static void Test_ee32460()
{
  extern Class_Descriptor cd_ee32460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32460, buf);
    ee32460 *dp, &lv = *(dp=new (buf) ee32460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(24,12), "ee32460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), ABISELECT(16,8), "ee32460");
    check_base_class_offset(lv, (cc460*)(dd2460*), ABISELECT(16,8), "ee32460");
    check_base_class_offset(lv, (dd2460*), ABISELECT(16,8), "ee32460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32460.e");
    test_class_info(&lv, &cd_ee32460);
    dp->~ee32460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32460(Test_ee32460, "ee32460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32460C1Ev();
extern void _ZN7ee32460D1Ev();
Name_Map name_map_ee32460[] = {
  NSPAIR(_ZN7ee32460C1Ev),
  NSPAIR(_ZN7ee32460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee32460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32460[];
extern void _ZN7ee324603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee324603fooEv,_ZTv0_n16_N7ee324603fooEv)();
extern void ABISELECT(_ZThn16_N7ee324603fooEv,_ZThn8_N7ee324603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32460[0]),
  (VTBL_ENTRY)&_ZN7ee324603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee324603fooEv,_ZTv0_n16_N7ee324603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32460[];
static  VTT_ENTRY vtt_ee32460[] = {
  {&(_ZTV7ee32460[3]),  3,10},
  {&(_ZTV7ee32460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32460[];
extern  VTBL_ENTRY _ZTV7ee32460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32460[];
static VTBL_ENTRY alt_thunk_names239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee324603fooEv,_ZTv0_n16_N7ee324603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee324603fooEv,_ZThn8_N7ee324603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32460 = {  "ee32460", // class name
  bases_ee32460, 4,
  &(vtc_ee32460[0]), // expected_vtbl_contents
  &(vtt_ee32460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32460),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names239,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42460  : dd2460 {
  int e;
  virtual void  bar(); // _ZN7ee424603barEv
  ~ee42460(); // tgen
  ee42460(); // tgen
};
//SIG(1 ee42460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee42460 ::bar(){vfunc_called(this, "_ZN7ee424603barEv");}
ee42460 ::~ee42460(){ note_dtor("ee42460", this);} // tgen
ee42460 ::ee42460(){ note_ctor("ee42460", this);} // tgen

static void Test_ee42460()
{
  extern Class_Descriptor cd_ee42460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42460, buf);
    ee42460 *dp, &lv = *(dp=new (buf) ee42460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(8,4), "ee42460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), 0, "ee42460");
    check_base_class_offset(lv, (cc460*)(dd2460*), 0, "ee42460");
    check_base_class_offset(lv, (dd2460*), 0, "ee42460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42460.e");
    test_class_info(&lv, &cd_ee42460);
    dp->~ee42460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42460(Test_ee42460, "ee42460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42460C1Ev();
extern void _ZN7ee42460D1Ev();
Name_Map name_map_ee42460[] = {
  NSPAIR(_ZN7ee42460C1Ev),
  NSPAIR(_ZN7ee42460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee42460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee42460[];
extern void _ZN7ee424603barEv();
extern void _ZN6dd24603fooEv();
static  VTBL_ENTRY vtc_ee42460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42460[0]),
  (VTBL_ENTRY)&_ZN7ee424603barEv,
  (VTBL_ENTRY)&_ZN6dd24603fooEv,
};
extern VTBL_ENTRY _ZTI7ee42460[];
extern  VTBL_ENTRY _ZTV7ee42460[];
Class_Descriptor cd_ee42460 = {  "ee42460", // class name
  bases_ee42460, 4,
  &(vtc_ee42460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42460),4, //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  ee52460  : virtual dd2460 {
  int e;
  virtual void  bar(); // _ZN7ee524603barEv
  ~ee52460(); // tgen
  ee52460(); // tgen
};
//SIG(1 ee52460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee52460 ::bar(){vfunc_called(this, "_ZN7ee524603barEv");}
ee52460 ::~ee52460(){ note_dtor("ee52460", this);} // tgen
ee52460 ::ee52460(){ note_ctor("ee52460", this);} // tgen

static void Test_ee52460()
{
  extern Class_Descriptor cd_ee52460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52460, buf);
    ee52460 *dp, &lv = *(dp=new (buf) ee52460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(24,12), "ee52460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), ABISELECT(16,8), "ee52460");
    check_base_class_offset(lv, (cc460*)(dd2460*), ABISELECT(16,8), "ee52460");
    check_base_class_offset(lv, (dd2460*), ABISELECT(16,8), "ee52460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52460.e");
    test_class_info(&lv, &cd_ee52460);
    dp->~ee52460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52460(Test_ee52460, "ee52460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52460C1Ev();
extern void _ZN7ee52460D1Ev();
Name_Map name_map_ee52460[] = {
  NSPAIR(_ZN7ee52460C1Ev),
  NSPAIR(_ZN7ee52460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee52460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52460[];
extern void _ZN7ee524603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee524603barEv,_ZTv0_n12_N7ee524603barEv)();
extern void ABISELECT(_ZThn16_N7ee524603barEv,_ZThn8_N7ee524603barEv)() __attribute__((weak));
extern void _ZN6dd24603fooEv();
static  VTBL_ENTRY vtc_ee52460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52460[0]),
  (VTBL_ENTRY)&_ZN7ee524603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee524603barEv,_ZTv0_n12_N7ee524603barEv),
  (VTBL_ENTRY)&_ZN6dd24603fooEv,
};
extern VTBL_ENTRY _ZTV7ee52460[];
static  VTT_ENTRY vtt_ee52460[] = {
  {&(_ZTV7ee52460[3]),  3,10},
  {&(_ZTV7ee52460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52460[];
extern  VTBL_ENTRY _ZTV7ee52460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52460[];
static VTBL_ENTRY alt_thunk_names240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee524603barEv,_ZTv0_n12_N7ee524603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee524603barEv,_ZThn8_N7ee524603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52460 = {  "ee52460", // class name
  bases_ee52460, 4,
  &(vtc_ee52460[0]), // expected_vtbl_contents
  &(vtt_ee52460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52460),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names240,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62460  : dd2460 {
  int e;
  virtual void  foo(); // _ZN7ee624603fooEv
  virtual void  bar(); // _ZN7ee624603barEv
  ~ee62460(); // tgen
  ee62460(); // tgen
};
//SIG(1 ee62460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62460 ::foo(){vfunc_called(this, "_ZN7ee624603fooEv");}
void  ee62460 ::bar(){vfunc_called(this, "_ZN7ee624603barEv");}
ee62460 ::~ee62460(){ note_dtor("ee62460", this);} // tgen
ee62460 ::ee62460(){ note_ctor("ee62460", this);} // tgen

static void Test_ee62460()
{
  extern Class_Descriptor cd_ee62460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62460, buf);
    ee62460 *dp, &lv = *(dp=new (buf) ee62460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(8,4), "ee62460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), 0, "ee62460");
    check_base_class_offset(lv, (cc460*)(dd2460*), 0, "ee62460");
    check_base_class_offset(lv, (dd2460*), 0, "ee62460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62460.e");
    test_class_info(&lv, &cd_ee62460);
    dp->~ee62460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62460(Test_ee62460, "ee62460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62460C1Ev();
extern void _ZN7ee62460D1Ev();
Name_Map name_map_ee62460[] = {
  NSPAIR(_ZN7ee62460C1Ev),
  NSPAIR(_ZN7ee62460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee62460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee62460[];
extern void _ZN7ee624603barEv();
extern void _ZN7ee624603fooEv();
static  VTBL_ENTRY vtc_ee62460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62460[0]),
  (VTBL_ENTRY)&_ZN7ee624603barEv,
  (VTBL_ENTRY)&_ZN7ee624603fooEv,
};
extern VTBL_ENTRY _ZTI7ee62460[];
extern  VTBL_ENTRY _ZTV7ee62460[];
Class_Descriptor cd_ee62460 = {  "ee62460", // class name
  bases_ee62460, 4,
  &(vtc_ee62460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62460),4, //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  ee72460  : virtual dd2460 {
  int e;
  virtual void  foo(); // _ZN7ee724603fooEv
  virtual void  bar(); // _ZN7ee724603barEv
  ~ee72460(); // tgen
  ee72460(); // tgen
};
//SIG(1 ee72460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72460 ::foo(){vfunc_called(this, "_ZN7ee724603fooEv");}
void  ee72460 ::bar(){vfunc_called(this, "_ZN7ee724603barEv");}
ee72460 ::~ee72460(){ note_dtor("ee72460", this);} // tgen
ee72460 ::ee72460(){ note_ctor("ee72460", this);} // tgen

static void Test_ee72460()
{
  extern Class_Descriptor cd_ee72460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72460, buf);
    ee72460 *dp, &lv = *(dp=new (buf) ee72460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd2460*), ABISELECT(24,12), "ee72460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd2460*), ABISELECT(16,8), "ee72460");
    check_base_class_offset(lv, (cc460*)(dd2460*), ABISELECT(16,8), "ee72460");
    check_base_class_offset(lv, (dd2460*), ABISELECT(16,8), "ee72460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72460.e");
    test_class_info(&lv, &cd_ee72460);
    dp->~ee72460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72460(Test_ee72460, "ee72460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72460C1Ev();
extern void _ZN7ee72460D1Ev();
Name_Map name_map_ee72460[] = {
  NSPAIR(_ZN7ee72460C1Ev),
  NSPAIR(_ZN7ee72460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd2460;
extern VTBL_ENTRY _ZTI6dd2460[];
extern  VTBL_ENTRY _ZTV6dd2460[];
static Base_Class bases_ee72460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2460,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72460[];
extern void _ZN7ee724603fooEv();
extern void _ZN7ee724603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee724603barEv,_ZTv0_n12_N7ee724603barEv)();
extern void ABISELECT(_ZThn16_N7ee724603barEv,_ZThn8_N7ee724603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee724603fooEv,_ZTv0_n16_N7ee724603fooEv)();
extern void ABISELECT(_ZThn16_N7ee724603fooEv,_ZThn8_N7ee724603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72460[0]),
  (VTBL_ENTRY)&_ZN7ee724603fooEv,
  (VTBL_ENTRY)&_ZN7ee724603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee724603barEv,_ZTv0_n12_N7ee724603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee724603fooEv,_ZTv0_n16_N7ee724603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72460[];
static  VTT_ENTRY vtt_ee72460[] = {
  {&(_ZTV7ee72460[3]),  3,11},
  {&(_ZTV7ee72460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72460[];
extern  VTBL_ENTRY _ZTV7ee72460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72460[];
static VTBL_ENTRY alt_thunk_names241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee724603fooEv,_ZTv0_n16_N7ee724603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee724603fooEv,_ZThn8_N7ee724603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee724603barEv,_ZTv0_n12_N7ee724603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee724603barEv,_ZThn8_N7ee724603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72460 = {  "ee72460", // class name
  bases_ee72460, 4,
  &(vtc_ee72460[0]), // expected_vtbl_contents
  &(vtt_ee72460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72460),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names241,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3460  : virtual cc460 {
  int d;
  virtual void  foo(); // _ZN6dd34603fooEv
  ~dd3460(); // tgen
  dd3460(); // tgen
};
//SIG(-1 dd3460) C1{ VBC2{ BC3{ BC4{ Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd3460 ::foo(){vfunc_called(this, "_ZN6dd34603fooEv");}
dd3460 ::~dd3460(){ note_dtor("dd3460", this);} // tgen
dd3460 ::dd3460(){ note_ctor("dd3460", this);} // tgen

static void Test_dd3460()
{
  extern Class_Descriptor cd_dd3460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3460, buf);
    dd3460 *dp, &lv = *(dp=new (buf) dd3460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,12), "dd3460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,8), "dd3460");
    check_base_class_offset(lv, (cc460*), ABISELECT(16,8), "dd3460");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3460.d");
    test_class_info(&lv, &cd_dd3460);
    dp->~dd3460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3460(Test_dd3460, "dd3460", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3460C1Ev();
extern void _ZN6dd3460D1Ev();
Name_Map name_map_dd3460[] = {
  NSPAIR(_ZN6dd3460C1Ev),
  NSPAIR(_ZN6dd3460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd3460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3460[];
extern void _ZN6dd34603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3460[];
static  VTT_ENTRY vtt_dd3460[] = {
  {&(_ZTV6dd3460[3]),  3,10},
  {&(_ZTV6dd3460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static VTBL_ENTRY alt_thunk_names242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3460 = {  "dd3460", // class name
  bases_dd3460, 3,
  &(vtc_dd3460[0]), // expected_vtbl_contents
  &(vtt_dd3460[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3460),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names242,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03460  : dd3460 {
  int e;
  ~ee03460(); // tgen
  ee03460(); // tgen
};
//SIG(1 ee03460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee03460 ::~ee03460(){ note_dtor("ee03460", this);} // tgen
ee03460 ::ee03460(){ note_ctor("ee03460", this);} // tgen

static void Test_ee03460()
{
  extern Class_Descriptor cd_ee03460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03460, buf);
    ee03460 *dp, &lv = *(dp=new (buf) ee03460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee03460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee03460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(16,12), "ee03460");
    check_base_class_offset(lv, (dd3460*), 0, "ee03460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03460.e");
    test_class_info(&lv, &cd_ee03460);
    dp->~ee03460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03460(Test_ee03460, "ee03460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03460C1Ev();
extern void _ZN7ee03460D1Ev();
Name_Map name_map_ee03460[] = {
  NSPAIR(_ZN7ee03460C1Ev),
  NSPAIR(_ZN7ee03460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee03460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03460[];
extern void _ZN6dd34603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee03460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee03460[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee03460[] = {
  {&(_ZTV7ee03460[3]),  3,10},
  {&(_tg__ZTV6dd3460__7ee03460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee03460[4]),  4,6},
  {&(_ZTV7ee03460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03460[];
extern  VTBL_ENTRY _ZTV7ee03460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03460[];
static VTBL_ENTRY alt_thunk_names243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03460 = {  "ee03460", // class name
  bases_ee03460, 4,
  &(vtc_ee03460[0]), // expected_vtbl_contents
  &(vtt_ee03460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03460),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  ee13460  : virtual dd3460 {
  int e;
  ~ee13460(); // tgen
  ee13460(); // tgen
};
//SIG(1 ee13460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee13460 ::~ee13460(){ note_dtor("ee13460", this);} // tgen
ee13460 ::ee13460(){ note_ctor("ee13460", this);} // tgen

static void Test_ee13460()
{
  extern Class_Descriptor cd_ee13460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13460, buf);
    ee13460 *dp, &lv = *(dp=new (buf) ee13460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee13460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee13460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(32,16), "ee13460");
    check_base_class_offset(lv, (dd3460*), ABISELECT(16,8), "ee13460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13460.e");
    test_class_info(&lv, &cd_ee13460);
    dp->~ee13460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13460(Test_ee13460, "ee13460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13460C1Ev();
extern void _ZN7ee13460D1Ev();
Name_Map name_map_ee13460[] = {
  NSPAIR(_ZN7ee13460C1Ev),
  NSPAIR(_ZN7ee13460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee13460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13460[];
extern void _ZN6dd34603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13460[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee13460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee13460[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee13460[] = {
  {&(_ZTV7ee13460[4]),  4,15},
  {&(_ZTV7ee13460[8]),  8,15},
  {&(_ZTV7ee13460[13]),  13,15},
  {&(_tg__ZTV6dd3460__7ee13460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee13460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13460[];
extern  VTBL_ENTRY _ZTV7ee13460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13460[];
static VTBL_ENTRY alt_thunk_names244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13460 = {  "ee13460", // class name
  bases_ee13460, 4,
  &(vtc_ee13460[0]), // expected_vtbl_contents
  &(vtt_ee13460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13460),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13460),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  ee23460  : dd3460 {
  int e;
  virtual void  foo(); // _ZN7ee234603fooEv
  ~ee23460(); // tgen
  ee23460(); // tgen
};
//SIG(1 ee23460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee23460 ::foo(){vfunc_called(this, "_ZN7ee234603fooEv");}
ee23460 ::~ee23460(){ note_dtor("ee23460", this);} // tgen
ee23460 ::ee23460(){ note_ctor("ee23460", this);} // tgen

static void Test_ee23460()
{
  extern Class_Descriptor cd_ee23460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23460, buf);
    ee23460 *dp, &lv = *(dp=new (buf) ee23460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee23460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee23460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(16,12), "ee23460");
    check_base_class_offset(lv, (dd3460*), 0, "ee23460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23460.e");
    test_class_info(&lv, &cd_ee23460);
    dp->~ee23460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23460(Test_ee23460, "ee23460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23460C1Ev();
extern void _ZN7ee23460D1Ev();
Name_Map name_map_ee23460[] = {
  NSPAIR(_ZN7ee23460C1Ev),
  NSPAIR(_ZN7ee23460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee23460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23460[];
extern void _ZN7ee234603fooEv();
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee234603fooEv,_ZTv0_n16_N7ee234603fooEv)();
extern void ABISELECT(_ZThn16_N7ee234603fooEv,_ZThn12_N7ee234603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23460[0]),
  (VTBL_ENTRY)&_ZN7ee234603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee234603fooEv,_ZTv0_n16_N7ee234603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee23460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee23460[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee23460[] = {
  {&(_ZTV7ee23460[3]),  3,10},
  {&(_tg__ZTV6dd3460__7ee23460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee23460[4]),  4,6},
  {&(_ZTV7ee23460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23460[];
extern  VTBL_ENTRY _ZTV7ee23460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23460[];
static VTBL_ENTRY alt_thunk_names245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee234603fooEv,_ZTv0_n16_N7ee234603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee234603fooEv,_ZThn12_N7ee234603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23460 = {  "ee23460", // class name
  bases_ee23460, 4,
  &(vtc_ee23460[0]), // expected_vtbl_contents
  &(vtt_ee23460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23460),4, //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  ee33460  : virtual dd3460 {
  int e;
  virtual void  foo(); // _ZN7ee334603fooEv
  ~ee33460(); // tgen
  ee33460(); // tgen
};
//SIG(1 ee33460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee33460 ::foo(){vfunc_called(this, "_ZN7ee334603fooEv");}
ee33460 ::~ee33460(){ note_dtor("ee33460", this);} // tgen
ee33460 ::ee33460(){ note_ctor("ee33460", this);} // tgen

static void Test_ee33460()
{
  extern Class_Descriptor cd_ee33460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33460, buf);
    ee33460 *dp, &lv = *(dp=new (buf) ee33460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee33460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee33460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(32,16), "ee33460");
    check_base_class_offset(lv, (dd3460*), ABISELECT(16,8), "ee33460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33460.e");
    test_class_info(&lv, &cd_ee33460);
    dp->~ee33460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33460(Test_ee33460, "ee33460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33460C1Ev();
extern void _ZN7ee33460D1Ev();
Name_Map name_map_ee33460[] = {
  NSPAIR(_ZN7ee33460C1Ev),
  NSPAIR(_ZN7ee33460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee33460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33460[];
extern void _ZN7ee334603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee334603fooEv,_ZTv0_n16_N7ee334603fooEv)();
extern void ABISELECT(_ZThn16_N7ee334603fooEv,_ZThn8_N7ee334603fooEv)() __attribute__((weak));
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee334603fooEv,_ZTv0_n16_N7ee334603fooEv)();
extern void ABISELECT(_ZThn32_N7ee334603fooEv,_ZThn16_N7ee334603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33460[0]),
  (VTBL_ENTRY)&_ZN7ee334603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee334603fooEv,_ZTv0_n16_N7ee334603fooEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee334603fooEv,_ZTv0_n16_N7ee334603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee33460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee33460[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee33460[] = {
  {&(_ZTV7ee33460[4]),  4,16},
  {&(_ZTV7ee33460[9]),  9,16},
  {&(_ZTV7ee33460[14]),  14,16},
  {&(_tg__ZTV6dd3460__7ee33460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee33460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33460[];
extern  VTBL_ENTRY _ZTV7ee33460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33460[];
static VTBL_ENTRY alt_thunk_names246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee334603fooEv,_ZTv0_n16_N7ee334603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee334603fooEv,_ZThn16_N7ee334603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee334603fooEv,_ZThn8_N7ee334603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33460 = {  "ee33460", // class name
  bases_ee33460, 4,
  &(vtc_ee33460[0]), // expected_vtbl_contents
  &(vtt_ee33460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33460),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33460),5, //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  ee43460  : dd3460 {
  int e;
  virtual void  bar(); // _ZN7ee434603barEv
  ~ee43460(); // tgen
  ee43460(); // tgen
};
//SIG(1 ee43460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee43460 ::bar(){vfunc_called(this, "_ZN7ee434603barEv");}
ee43460 ::~ee43460(){ note_dtor("ee43460", this);} // tgen
ee43460 ::ee43460(){ note_ctor("ee43460", this);} // tgen

static void Test_ee43460()
{
  extern Class_Descriptor cd_ee43460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43460, buf);
    ee43460 *dp, &lv = *(dp=new (buf) ee43460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee43460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee43460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(16,12), "ee43460");
    check_base_class_offset(lv, (dd3460*), 0, "ee43460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43460.e");
    test_class_info(&lv, &cd_ee43460);
    dp->~ee43460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43460(Test_ee43460, "ee43460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43460C1Ev();
extern void _ZN7ee43460D1Ev();
Name_Map name_map_ee43460[] = {
  NSPAIR(_ZN7ee43460C1Ev),
  NSPAIR(_ZN7ee43460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee43460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43460[];
extern void _ZN6dd34603fooEv();
extern void _ZN7ee434603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee434603barEv,_ZTv0_n12_N7ee434603barEv)();
extern void ABISELECT(_ZThn16_N7ee434603barEv,_ZThn12_N7ee434603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
  (VTBL_ENTRY)&_ZN7ee434603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee434603barEv,_ZTv0_n12_N7ee434603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee43460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee43460[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee43460[] = {
  {&(_ZTV7ee43460[3]),  3,11},
  {&(_tg__ZTV6dd3460__7ee43460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee43460[4]),  4,6},
  {&(_ZTV7ee43460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43460[];
extern  VTBL_ENTRY _ZTV7ee43460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43460[];
static VTBL_ENTRY alt_thunk_names247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee434603barEv,_ZTv0_n12_N7ee434603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee434603barEv,_ZThn12_N7ee434603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43460 = {  "ee43460", // class name
  bases_ee43460, 4,
  &(vtc_ee43460[0]), // expected_vtbl_contents
  &(vtt_ee43460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names247,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53460  : virtual dd3460 {
  int e;
  virtual void  bar(); // _ZN7ee534603barEv
  ~ee53460(); // tgen
  ee53460(); // tgen
};
//SIG(1 ee53460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee53460 ::bar(){vfunc_called(this, "_ZN7ee534603barEv");}
ee53460 ::~ee53460(){ note_dtor("ee53460", this);} // tgen
ee53460 ::ee53460(){ note_ctor("ee53460", this);} // tgen

static void Test_ee53460()
{
  extern Class_Descriptor cd_ee53460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53460, buf);
    ee53460 *dp, &lv = *(dp=new (buf) ee53460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee53460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee53460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(32,16), "ee53460");
    check_base_class_offset(lv, (dd3460*), ABISELECT(16,8), "ee53460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53460.e");
    test_class_info(&lv, &cd_ee53460);
    dp->~ee53460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53460(Test_ee53460, "ee53460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53460C1Ev();
extern void _ZN7ee53460D1Ev();
Name_Map name_map_ee53460[] = {
  NSPAIR(_ZN7ee53460C1Ev),
  NSPAIR(_ZN7ee53460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee53460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53460[];
extern void _ZN7ee534603barEv();
extern void _ZN6dd34603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee534603barEv,_ZTv0_n12_N7ee534603barEv)();
extern void ABISELECT(_ZThn32_N7ee534603barEv,_ZThn16_N7ee534603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53460[0]),
  (VTBL_ENTRY)&_ZN7ee534603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee534603barEv,_ZTv0_n12_N7ee534603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee53460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee53460[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee53460[] = {
  {&(_ZTV7ee53460[4]),  4,16},
  {&(_ZTV7ee53460[9]),  9,16},
  {&(_ZTV7ee53460[14]),  14,16},
  {&(_tg__ZTV6dd3460__7ee53460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee53460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53460[];
extern  VTBL_ENTRY _ZTV7ee53460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53460[];
static VTBL_ENTRY alt_thunk_names248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee534603barEv,_ZTv0_n12_N7ee534603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee534603barEv,_ZThn16_N7ee534603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53460 = {  "ee53460", // class name
  bases_ee53460, 4,
  &(vtc_ee53460[0]), // expected_vtbl_contents
  &(vtt_ee53460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53460),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names248,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63460  : dd3460 {
  int e;
  virtual void  foo(); // _ZN7ee634603fooEv
  virtual void  bar(); // _ZN7ee634603barEv
  ~ee63460(); // tgen
  ee63460(); // tgen
};
//SIG(1 ee63460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63460 ::foo(){vfunc_called(this, "_ZN7ee634603fooEv");}
void  ee63460 ::bar(){vfunc_called(this, "_ZN7ee634603barEv");}
ee63460 ::~ee63460(){ note_dtor("ee63460", this);} // tgen
ee63460 ::ee63460(){ note_ctor("ee63460", this);} // tgen

static void Test_ee63460()
{
  extern Class_Descriptor cd_ee63460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63460, buf);
    ee63460 *dp, &lv = *(dp=new (buf) ee63460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee63460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee63460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(16,12), "ee63460");
    check_base_class_offset(lv, (dd3460*), 0, "ee63460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63460.e");
    test_class_info(&lv, &cd_ee63460);
    dp->~ee63460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63460(Test_ee63460, "ee63460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63460C1Ev();
extern void _ZN7ee63460D1Ev();
Name_Map name_map_ee63460[] = {
  NSPAIR(_ZN7ee63460C1Ev),
  NSPAIR(_ZN7ee63460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee63460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63460[];
extern void _ZN7ee634603fooEv();
extern void _ZN7ee634603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee634603barEv,_ZTv0_n12_N7ee634603barEv)();
extern void ABISELECT(_ZThn16_N7ee634603barEv,_ZThn12_N7ee634603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee634603fooEv,_ZTv0_n16_N7ee634603fooEv)();
extern void ABISELECT(_ZThn16_N7ee634603fooEv,_ZThn12_N7ee634603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63460[0]),
  (VTBL_ENTRY)&_ZN7ee634603fooEv,
  (VTBL_ENTRY)&_ZN7ee634603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee634603barEv,_ZTv0_n12_N7ee634603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee634603fooEv,_ZTv0_n16_N7ee634603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee63460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee63460[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee63460[] = {
  {&(_ZTV7ee63460[3]),  3,11},
  {&(_tg__ZTV6dd3460__7ee63460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee63460[4]),  4,6},
  {&(_ZTV7ee63460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63460[];
extern  VTBL_ENTRY _ZTV7ee63460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63460[];
static VTBL_ENTRY alt_thunk_names249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn12_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee634603fooEv,_ZTv0_n16_N7ee634603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee634603fooEv,_ZThn12_N7ee634603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee634603barEv,_ZTv0_n12_N7ee634603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee634603barEv,_ZThn12_N7ee634603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63460 = {  "ee63460", // class name
  bases_ee63460, 4,
  &(vtc_ee63460[0]), // expected_vtbl_contents
  &(vtt_ee63460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names249,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73460  : virtual dd3460 {
  int e;
  virtual void  foo(); // _ZN7ee734603fooEv
  virtual void  bar(); // _ZN7ee734603barEv
  ~ee73460(); // tgen
  ee73460(); // tgen
};
//SIG(1 ee73460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73460 ::foo(){vfunc_called(this, "_ZN7ee734603fooEv");}
void  ee73460 ::bar(){vfunc_called(this, "_ZN7ee734603barEv");}
ee73460 ::~ee73460(){ note_dtor("ee73460", this);} // tgen
ee73460 ::ee73460(){ note_ctor("ee73460", this);} // tgen

static void Test_ee73460()
{
  extern Class_Descriptor cd_ee73460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73460, buf);
    ee73460 *dp, &lv = *(dp=new (buf) ee73460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee73460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee73460");
    check_base_class_offset(lv, (cc460*)(dd3460*), ABISELECT(32,16), "ee73460");
    check_base_class_offset(lv, (dd3460*), ABISELECT(16,8), "ee73460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73460.e");
    test_class_info(&lv, &cd_ee73460);
    dp->~ee73460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73460(Test_ee73460, "ee73460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73460C1Ev();
extern void _ZN7ee73460D1Ev();
Name_Map name_map_ee73460[] = {
  NSPAIR(_ZN7ee73460C1Ev),
  NSPAIR(_ZN7ee73460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd3460;
extern VTBL_ENTRY _ZTI6dd3460[];
extern  VTBL_ENTRY _ZTV6dd3460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3460[];
static Base_Class bases_ee73460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73460[];
extern void _ZN7ee734603fooEv();
extern void _ZN7ee734603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee734603fooEv,_ZTv0_n16_N7ee734603fooEv)();
extern void ABISELECT(_ZThn16_N7ee734603fooEv,_ZThn8_N7ee734603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee734603barEv,_ZTv0_n12_N7ee734603barEv)();
extern void ABISELECT(_ZThn32_N7ee734603barEv,_ZThn16_N7ee734603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee734603fooEv,_ZTv0_n16_N7ee734603fooEv)();
extern void ABISELECT(_ZThn32_N7ee734603fooEv,_ZThn16_N7ee734603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73460[0]),
  (VTBL_ENTRY)&_ZN7ee734603fooEv,
  (VTBL_ENTRY)&_ZN7ee734603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee734603fooEv,_ZTv0_n16_N7ee734603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee734603barEv,_ZTv0_n12_N7ee734603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee734603fooEv,_ZTv0_n16_N7ee734603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73460[];
extern void _ZN6dd34603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3460__7ee73460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN6dd34603fooEv,
};
extern void _ZN5cc4603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv)();
extern void ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd3460__7ee73460[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3460[0]),
  (VTBL_ENTRY)&_ZN5cc4603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv),
};
static  VTT_ENTRY vtt_ee73460[] = {
  {&(_ZTV7ee73460[4]),  4,17},
  {&(_ZTV7ee73460[10]),  10,17},
  {&(_ZTV7ee73460[15]),  15,17},
  {&(_tg__ZTV6dd3460__7ee73460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd3460__7ee73460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73460[];
extern  VTBL_ENTRY _ZTV7ee73460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73460[];
static VTBL_ENTRY alt_thunk_names250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd34603fooEv,_ZTv0_n16_N6dd34603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34603fooEv,_ZThn8_N6dd34603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee734603barEv,_ZTv0_n12_N7ee734603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee734603barEv,_ZThn16_N7ee734603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee734603fooEv,_ZTv0_n16_N7ee734603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee734603fooEv,_ZThn16_N7ee734603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee734603fooEv,_ZThn8_N7ee734603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73460 = {  "ee73460", // class name
  bases_ee73460, 4,
  &(vtc_ee73460[0]), // expected_vtbl_contents
  &(vtt_ee73460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73460),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names250,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4460  : cc460 {
  int d;
  virtual void  bar(); // _ZN6dd44603barEv
  ~dd4460(); // tgen
  dd4460(); // tgen
};
//SIG(-1 dd4460) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd4460 ::bar(){vfunc_called(this, "_ZN6dd44603barEv");}
dd4460 ::~dd4460(){ note_dtor("dd4460", this);} // tgen
dd4460 ::dd4460(){ note_ctor("dd4460", this);} // tgen

static void Test_dd4460()
{
  extern Class_Descriptor cd_dd4460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4460, buf);
    dd4460 *dp, &lv = *(dp=new (buf) dd4460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(8,4), "dd4460");
    check_base_class_offset(lv, (bb60*)(cc460*), 0, "dd4460");
    check_base_class_offset(lv, (cc460*), 0, "dd4460");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4460.d");
    test_class_info(&lv, &cd_dd4460);
    dp->~dd4460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4460(Test_dd4460, "dd4460", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4460C1Ev();
extern void _ZN6dd4460D1Ev();
Name_Map name_map_dd4460[] = {
  NSPAIR(_ZN6dd4460C1Ev),
  NSPAIR(_ZN6dd4460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd4460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd4460[];
extern void _ZN6dd44603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd4460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4460[0]),
  (VTBL_ENTRY)&_ZN6dd44603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
Class_Descriptor cd_dd4460 = {  "dd4460", // class name
  bases_dd4460, 3,
  &(vtc_dd4460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4460),4, //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  ee04460  : dd4460 {
  int e;
  ~ee04460(); // tgen
  ee04460(); // tgen
};
//SIG(1 ee04460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee04460 ::~ee04460(){ note_dtor("ee04460", this);} // tgen
ee04460 ::ee04460(){ note_ctor("ee04460", this);} // tgen

static void Test_ee04460()
{
  extern Class_Descriptor cd_ee04460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04460, buf);
    ee04460 *dp, &lv = *(dp=new (buf) ee04460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(8,4), "ee04460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), 0, "ee04460");
    check_base_class_offset(lv, (cc460*)(dd4460*), 0, "ee04460");
    check_base_class_offset(lv, (dd4460*), 0, "ee04460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04460.e");
    test_class_info(&lv, &cd_ee04460);
    dp->~ee04460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04460(Test_ee04460, "ee04460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04460C1Ev();
extern void _ZN7ee04460D1Ev();
Name_Map name_map_ee04460[] = {
  NSPAIR(_ZN7ee04460C1Ev),
  NSPAIR(_ZN7ee04460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee04460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04460[];
extern void _ZN6dd44603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee04460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04460[0]),
  (VTBL_ENTRY)&_ZN6dd44603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee04460[];
extern  VTBL_ENTRY _ZTV7ee04460[];
Class_Descriptor cd_ee04460 = {  "ee04460", // class name
  bases_ee04460, 4,
  &(vtc_ee04460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04460),4, //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  ee14460  : virtual dd4460 {
  int e;
  ~ee14460(); // tgen
  ee14460(); // tgen
};
//SIG(1 ee14460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee14460 ::~ee14460(){ note_dtor("ee14460", this);} // tgen
ee14460 ::ee14460(){ note_ctor("ee14460", this);} // tgen

static void Test_ee14460()
{
  extern Class_Descriptor cd_ee14460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14460, buf);
    ee14460 *dp, &lv = *(dp=new (buf) ee14460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(24,12), "ee14460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), ABISELECT(16,8), "ee14460");
    check_base_class_offset(lv, (cc460*)(dd4460*), ABISELECT(16,8), "ee14460");
    check_base_class_offset(lv, (dd4460*), ABISELECT(16,8), "ee14460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14460.e");
    test_class_info(&lv, &cd_ee14460);
    dp->~ee14460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14460(Test_ee14460, "ee14460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14460C1Ev();
extern void _ZN7ee14460D1Ev();
Name_Map name_map_ee14460[] = {
  NSPAIR(_ZN7ee14460C1Ev),
  NSPAIR(_ZN7ee14460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee14460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14460[];
extern void _ZN6dd44603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee14460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14460[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14460[0]),
  (VTBL_ENTRY)&_ZN6dd44603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee14460[];
static  VTT_ENTRY vtt_ee14460[] = {
  {&(_ZTV7ee14460[3]),  3,9},
  {&(_ZTV7ee14460[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14460[];
extern  VTBL_ENTRY _ZTV7ee14460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14460[];
Class_Descriptor cd_ee14460 = {  "ee14460", // class name
  bases_ee14460, 4,
  &(vtc_ee14460[0]), // expected_vtbl_contents
  &(vtt_ee14460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14460),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14460),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  ee24460  : dd4460 {
  int e;
  virtual void  foo(); // _ZN7ee244603fooEv
  ~ee24460(); // tgen
  ee24460(); // tgen
};
//SIG(1 ee24460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee24460 ::foo(){vfunc_called(this, "_ZN7ee244603fooEv");}
ee24460 ::~ee24460(){ note_dtor("ee24460", this);} // tgen
ee24460 ::ee24460(){ note_ctor("ee24460", this);} // tgen

static void Test_ee24460()
{
  extern Class_Descriptor cd_ee24460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24460, buf);
    ee24460 *dp, &lv = *(dp=new (buf) ee24460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(8,4), "ee24460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), 0, "ee24460");
    check_base_class_offset(lv, (cc460*)(dd4460*), 0, "ee24460");
    check_base_class_offset(lv, (dd4460*), 0, "ee24460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24460.e");
    test_class_info(&lv, &cd_ee24460);
    dp->~ee24460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24460(Test_ee24460, "ee24460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24460C1Ev();
extern void _ZN7ee24460D1Ev();
Name_Map name_map_ee24460[] = {
  NSPAIR(_ZN7ee24460C1Ev),
  NSPAIR(_ZN7ee24460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee24460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee24460[];
extern void _ZN6dd44603barEv();
extern void _ZN7ee244603fooEv();
static  VTBL_ENTRY vtc_ee24460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24460[0]),
  (VTBL_ENTRY)&_ZN6dd44603barEv,
  (VTBL_ENTRY)&_ZN7ee244603fooEv,
};
extern VTBL_ENTRY _ZTI7ee24460[];
extern  VTBL_ENTRY _ZTV7ee24460[];
Class_Descriptor cd_ee24460 = {  "ee24460", // class name
  bases_ee24460, 4,
  &(vtc_ee24460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24460),4, //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  ee34460  : virtual dd4460 {
  int e;
  virtual void  foo(); // _ZN7ee344603fooEv
  ~ee34460(); // tgen
  ee34460(); // tgen
};
//SIG(1 ee34460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee34460 ::foo(){vfunc_called(this, "_ZN7ee344603fooEv");}
ee34460 ::~ee34460(){ note_dtor("ee34460", this);} // tgen
ee34460 ::ee34460(){ note_ctor("ee34460", this);} // tgen

static void Test_ee34460()
{
  extern Class_Descriptor cd_ee34460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34460, buf);
    ee34460 *dp, &lv = *(dp=new (buf) ee34460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(24,12), "ee34460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), ABISELECT(16,8), "ee34460");
    check_base_class_offset(lv, (cc460*)(dd4460*), ABISELECT(16,8), "ee34460");
    check_base_class_offset(lv, (dd4460*), ABISELECT(16,8), "ee34460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34460.e");
    test_class_info(&lv, &cd_ee34460);
    dp->~ee34460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34460(Test_ee34460, "ee34460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34460C1Ev();
extern void _ZN7ee34460D1Ev();
Name_Map name_map_ee34460[] = {
  NSPAIR(_ZN7ee34460C1Ev),
  NSPAIR(_ZN7ee34460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee34460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34460[];
extern void _ZN7ee344603fooEv();
extern void _ZN6dd44603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee344603fooEv,_ZTv0_n16_N7ee344603fooEv)();
extern void ABISELECT(_ZThn16_N7ee344603fooEv,_ZThn8_N7ee344603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34460[0]),
  (VTBL_ENTRY)&_ZN7ee344603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34460[0]),
  (VTBL_ENTRY)&_ZN6dd44603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee344603fooEv,_ZTv0_n16_N7ee344603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34460[];
static  VTT_ENTRY vtt_ee34460[] = {
  {&(_ZTV7ee34460[3]),  3,10},
  {&(_ZTV7ee34460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34460[];
extern  VTBL_ENTRY _ZTV7ee34460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34460[];
static VTBL_ENTRY alt_thunk_names251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee344603fooEv,_ZTv0_n16_N7ee344603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee344603fooEv,_ZThn8_N7ee344603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34460 = {  "ee34460", // class name
  bases_ee34460, 4,
  &(vtc_ee34460[0]), // expected_vtbl_contents
  &(vtt_ee34460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34460),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44460  : dd4460 {
  int e;
  virtual void  bar(); // _ZN7ee444603barEv
  ~ee44460(); // tgen
  ee44460(); // tgen
};
//SIG(1 ee44460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee44460 ::bar(){vfunc_called(this, "_ZN7ee444603barEv");}
ee44460 ::~ee44460(){ note_dtor("ee44460", this);} // tgen
ee44460 ::ee44460(){ note_ctor("ee44460", this);} // tgen

static void Test_ee44460()
{
  extern Class_Descriptor cd_ee44460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44460, buf);
    ee44460 *dp, &lv = *(dp=new (buf) ee44460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(8,4), "ee44460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), 0, "ee44460");
    check_base_class_offset(lv, (cc460*)(dd4460*), 0, "ee44460");
    check_base_class_offset(lv, (dd4460*), 0, "ee44460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44460.e");
    test_class_info(&lv, &cd_ee44460);
    dp->~ee44460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44460(Test_ee44460, "ee44460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44460C1Ev();
extern void _ZN7ee44460D1Ev();
Name_Map name_map_ee44460[] = {
  NSPAIR(_ZN7ee44460C1Ev),
  NSPAIR(_ZN7ee44460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee44460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee44460[];
extern void _ZN7ee444603barEv();
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee44460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44460[0]),
  (VTBL_ENTRY)&_ZN7ee444603barEv,
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTI7ee44460[];
extern  VTBL_ENTRY _ZTV7ee44460[];
Class_Descriptor cd_ee44460 = {  "ee44460", // class name
  bases_ee44460, 4,
  &(vtc_ee44460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44460),4, //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  ee54460  : virtual dd4460 {
  int e;
  virtual void  bar(); // _ZN7ee544603barEv
  ~ee54460(); // tgen
  ee54460(); // tgen
};
//SIG(1 ee54460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee54460 ::bar(){vfunc_called(this, "_ZN7ee544603barEv");}
ee54460 ::~ee54460(){ note_dtor("ee54460", this);} // tgen
ee54460 ::ee54460(){ note_ctor("ee54460", this);} // tgen

static void Test_ee54460()
{
  extern Class_Descriptor cd_ee54460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54460, buf);
    ee54460 *dp, &lv = *(dp=new (buf) ee54460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(24,12), "ee54460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), ABISELECT(16,8), "ee54460");
    check_base_class_offset(lv, (cc460*)(dd4460*), ABISELECT(16,8), "ee54460");
    check_base_class_offset(lv, (dd4460*), ABISELECT(16,8), "ee54460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54460.e");
    test_class_info(&lv, &cd_ee54460);
    dp->~ee54460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54460(Test_ee54460, "ee54460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54460C1Ev();
extern void _ZN7ee54460D1Ev();
Name_Map name_map_ee54460[] = {
  NSPAIR(_ZN7ee54460C1Ev),
  NSPAIR(_ZN7ee54460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee54460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54460[];
extern void _ZN7ee544603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee544603barEv,_ZTv0_n12_N7ee544603barEv)();
extern void ABISELECT(_ZThn16_N7ee544603barEv,_ZThn8_N7ee544603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee54460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54460[0]),
  (VTBL_ENTRY)&_ZN7ee544603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee544603barEv,_ZTv0_n12_N7ee544603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee54460[];
static  VTT_ENTRY vtt_ee54460[] = {
  {&(_ZTV7ee54460[3]),  3,10},
  {&(_ZTV7ee54460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54460[];
extern  VTBL_ENTRY _ZTV7ee54460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54460[];
static VTBL_ENTRY alt_thunk_names252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee544603barEv,_ZTv0_n12_N7ee544603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee544603barEv,_ZThn8_N7ee544603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54460 = {  "ee54460", // class name
  bases_ee54460, 4,
  &(vtc_ee54460[0]), // expected_vtbl_contents
  &(vtt_ee54460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54460),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names252,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64460  : dd4460 {
  int e;
  virtual void  foo(); // _ZN7ee644603fooEv
  virtual void  bar(); // _ZN7ee644603barEv
  ~ee64460(); // tgen
  ee64460(); // tgen
};
//SIG(1 ee64460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64460 ::foo(){vfunc_called(this, "_ZN7ee644603fooEv");}
void  ee64460 ::bar(){vfunc_called(this, "_ZN7ee644603barEv");}
ee64460 ::~ee64460(){ note_dtor("ee64460", this);} // tgen
ee64460 ::ee64460(){ note_ctor("ee64460", this);} // tgen

static void Test_ee64460()
{
  extern Class_Descriptor cd_ee64460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64460, buf);
    ee64460 *dp, &lv = *(dp=new (buf) ee64460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(8,4), "ee64460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), 0, "ee64460");
    check_base_class_offset(lv, (cc460*)(dd4460*), 0, "ee64460");
    check_base_class_offset(lv, (dd4460*), 0, "ee64460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64460.e");
    test_class_info(&lv, &cd_ee64460);
    dp->~ee64460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64460(Test_ee64460, "ee64460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64460C1Ev();
extern void _ZN7ee64460D1Ev();
Name_Map name_map_ee64460[] = {
  NSPAIR(_ZN7ee64460C1Ev),
  NSPAIR(_ZN7ee64460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee64460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee64460[];
extern void _ZN7ee644603barEv();
extern void _ZN7ee644603fooEv();
static  VTBL_ENTRY vtc_ee64460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64460[0]),
  (VTBL_ENTRY)&_ZN7ee644603barEv,
  (VTBL_ENTRY)&_ZN7ee644603fooEv,
};
extern VTBL_ENTRY _ZTI7ee64460[];
extern  VTBL_ENTRY _ZTV7ee64460[];
Class_Descriptor cd_ee64460 = {  "ee64460", // class name
  bases_ee64460, 4,
  &(vtc_ee64460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64460),4, //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  ee74460  : virtual dd4460 {
  int e;
  virtual void  foo(); // _ZN7ee744603fooEv
  virtual void  bar(); // _ZN7ee744603barEv
  ~ee74460(); // tgen
  ee74460(); // tgen
};
//SIG(1 ee74460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74460 ::foo(){vfunc_called(this, "_ZN7ee744603fooEv");}
void  ee74460 ::bar(){vfunc_called(this, "_ZN7ee744603barEv");}
ee74460 ::~ee74460(){ note_dtor("ee74460", this);} // tgen
ee74460 ::ee74460(){ note_ctor("ee74460", this);} // tgen

static void Test_ee74460()
{
  extern Class_Descriptor cd_ee74460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74460, buf);
    ee74460 *dp, &lv = *(dp=new (buf) ee74460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd4460*), ABISELECT(24,12), "ee74460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd4460*), ABISELECT(16,8), "ee74460");
    check_base_class_offset(lv, (cc460*)(dd4460*), ABISELECT(16,8), "ee74460");
    check_base_class_offset(lv, (dd4460*), ABISELECT(16,8), "ee74460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74460.e");
    test_class_info(&lv, &cd_ee74460);
    dp->~ee74460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74460(Test_ee74460, "ee74460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74460C1Ev();
extern void _ZN7ee74460D1Ev();
Name_Map name_map_ee74460[] = {
  NSPAIR(_ZN7ee74460C1Ev),
  NSPAIR(_ZN7ee74460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd4460;
extern VTBL_ENTRY _ZTI6dd4460[];
extern  VTBL_ENTRY _ZTV6dd4460[];
static Base_Class bases_ee74460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4460,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74460[];
extern void _ZN7ee744603fooEv();
extern void _ZN7ee744603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee744603barEv,_ZTv0_n12_N7ee744603barEv)();
extern void ABISELECT(_ZThn16_N7ee744603barEv,_ZThn8_N7ee744603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee744603fooEv,_ZTv0_n16_N7ee744603fooEv)();
extern void ABISELECT(_ZThn16_N7ee744603fooEv,_ZThn8_N7ee744603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74460[0]),
  (VTBL_ENTRY)&_ZN7ee744603fooEv,
  (VTBL_ENTRY)&_ZN7ee744603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee744603barEv,_ZTv0_n12_N7ee744603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee744603fooEv,_ZTv0_n16_N7ee744603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74460[];
static  VTT_ENTRY vtt_ee74460[] = {
  {&(_ZTV7ee74460[3]),  3,11},
  {&(_ZTV7ee74460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74460[];
extern  VTBL_ENTRY _ZTV7ee74460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74460[];
static VTBL_ENTRY alt_thunk_names253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee744603fooEv,_ZTv0_n16_N7ee744603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee744603fooEv,_ZThn8_N7ee744603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee744603barEv,_ZTv0_n12_N7ee744603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee744603barEv,_ZThn8_N7ee744603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74460 = {  "ee74460", // class name
  bases_ee74460, 4,
  &(vtc_ee74460[0]), // expected_vtbl_contents
  &(vtt_ee74460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74460),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names253,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5460  : virtual cc460 {
  int d;
  virtual void  bar(); // _ZN6dd54603barEv
  ~dd5460(); // tgen
  dd5460(); // tgen
};
//SIG(-1 dd5460) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd5460 ::bar(){vfunc_called(this, "_ZN6dd54603barEv");}
dd5460 ::~dd5460(){ note_dtor("dd5460", this);} // tgen
dd5460 ::dd5460(){ note_ctor("dd5460", this);} // tgen

static void Test_dd5460()
{
  extern Class_Descriptor cd_dd5460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5460, buf);
    dd5460 *dp, &lv = *(dp=new (buf) dd5460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,12), "dd5460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,8), "dd5460");
    check_base_class_offset(lv, (cc460*), ABISELECT(16,8), "dd5460");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5460.d");
    test_class_info(&lv, &cd_dd5460);
    dp->~dd5460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5460(Test_dd5460, "dd5460", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5460C1Ev();
extern void _ZN6dd5460D1Ev();
Name_Map name_map_dd5460[] = {
  NSPAIR(_ZN6dd5460C1Ev),
  NSPAIR(_ZN6dd5460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd5460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5460[];
extern void _ZN6dd54603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd5460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd5460[];
static  VTT_ENTRY vtt_dd5460[] = {
  {&(_ZTV6dd5460[3]),  3,10},
  {&(_ZTV6dd5460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static VTBL_ENTRY alt_thunk_names254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5460 = {  "dd5460", // class name
  bases_dd5460, 3,
  &(vtc_dd5460[0]), // expected_vtbl_contents
  &(vtt_dd5460[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5460),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names254,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05460  : dd5460 {
  int e;
  ~ee05460(); // tgen
  ee05460(); // tgen
};
//SIG(1 ee05460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee05460 ::~ee05460(){ note_dtor("ee05460", this);} // tgen
ee05460 ::ee05460(){ note_ctor("ee05460", this);} // tgen

static void Test_ee05460()
{
  extern Class_Descriptor cd_ee05460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05460, buf);
    ee05460 *dp, &lv = *(dp=new (buf) ee05460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee05460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee05460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(16,12), "ee05460");
    check_base_class_offset(lv, (dd5460*), 0, "ee05460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05460.e");
    test_class_info(&lv, &cd_ee05460);
    dp->~ee05460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05460(Test_ee05460, "ee05460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05460C1Ev();
extern void _ZN7ee05460D1Ev();
Name_Map name_map_ee05460[] = {
  NSPAIR(_ZN7ee05460C1Ev),
  NSPAIR(_ZN7ee05460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee05460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05460[];
extern void _ZN6dd54603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee05460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee05460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee05460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee05460[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee05460[] = {
  {&(_ZTV7ee05460[3]),  3,10},
  {&(_tg__ZTV6dd5460__7ee05460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee05460[4]),  4,6},
  {&(_ZTV7ee05460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05460[];
extern  VTBL_ENTRY _ZTV7ee05460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05460[];
static VTBL_ENTRY alt_thunk_names255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05460 = {  "ee05460", // class name
  bases_ee05460, 4,
  &(vtc_ee05460[0]), // expected_vtbl_contents
  &(vtt_ee05460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names255,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15460  : virtual dd5460 {
  int e;
  ~ee15460(); // tgen
  ee15460(); // tgen
};
//SIG(1 ee15460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee15460 ::~ee15460(){ note_dtor("ee15460", this);} // tgen
ee15460 ::ee15460(){ note_ctor("ee15460", this);} // tgen

static void Test_ee15460()
{
  extern Class_Descriptor cd_ee15460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15460, buf);
    ee15460 *dp, &lv = *(dp=new (buf) ee15460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee15460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee15460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(32,16), "ee15460");
    check_base_class_offset(lv, (dd5460*), ABISELECT(16,8), "ee15460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15460.e");
    test_class_info(&lv, &cd_ee15460);
    dp->~ee15460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15460(Test_ee15460, "ee15460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15460C1Ev();
extern void _ZN7ee15460D1Ev();
Name_Map name_map_ee15460[] = {
  NSPAIR(_ZN7ee15460C1Ev),
  NSPAIR(_ZN7ee15460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee15460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15460[];
extern void _ZN6dd54603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee15460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15460[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee15460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee15460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee15460[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee15460[] = {
  {&(_ZTV7ee15460[4]),  4,15},
  {&(_ZTV7ee15460[8]),  8,15},
  {&(_ZTV7ee15460[13]),  13,15},
  {&(_tg__ZTV6dd5460__7ee15460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee15460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15460[];
extern  VTBL_ENTRY _ZTV7ee15460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15460[];
static VTBL_ENTRY alt_thunk_names256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15460 = {  "ee15460", // class name
  bases_ee15460, 4,
  &(vtc_ee15460[0]), // expected_vtbl_contents
  &(vtt_ee15460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15460),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15460),5, //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  ee25460  : dd5460 {
  int e;
  virtual void  foo(); // _ZN7ee254603fooEv
  ~ee25460(); // tgen
  ee25460(); // tgen
};
//SIG(1 ee25460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee25460 ::foo(){vfunc_called(this, "_ZN7ee254603fooEv");}
ee25460 ::~ee25460(){ note_dtor("ee25460", this);} // tgen
ee25460 ::ee25460(){ note_ctor("ee25460", this);} // tgen

static void Test_ee25460()
{
  extern Class_Descriptor cd_ee25460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25460, buf);
    ee25460 *dp, &lv = *(dp=new (buf) ee25460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee25460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee25460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(16,12), "ee25460");
    check_base_class_offset(lv, (dd5460*), 0, "ee25460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25460.e");
    test_class_info(&lv, &cd_ee25460);
    dp->~ee25460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25460(Test_ee25460, "ee25460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25460C1Ev();
extern void _ZN7ee25460D1Ev();
Name_Map name_map_ee25460[] = {
  NSPAIR(_ZN7ee25460C1Ev),
  NSPAIR(_ZN7ee25460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee25460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25460[];
extern void _ZN6dd54603barEv();
extern void _ZN7ee254603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee254603fooEv,_ZTv0_n16_N7ee254603fooEv)();
extern void ABISELECT(_ZThn16_N7ee254603fooEv,_ZThn12_N7ee254603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
  (VTBL_ENTRY)&_ZN7ee254603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee254603fooEv,_ZTv0_n16_N7ee254603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee25460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee25460[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee25460[] = {
  {&(_ZTV7ee25460[3]),  3,11},
  {&(_tg__ZTV6dd5460__7ee25460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee25460[4]),  4,6},
  {&(_ZTV7ee25460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25460[];
extern  VTBL_ENTRY _ZTV7ee25460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25460[];
static VTBL_ENTRY alt_thunk_names257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee254603fooEv,_ZTv0_n16_N7ee254603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee254603fooEv,_ZThn12_N7ee254603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25460 = {  "ee25460", // class name
  bases_ee25460, 4,
  &(vtc_ee25460[0]), // expected_vtbl_contents
  &(vtt_ee25460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25460),4, //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  ee35460  : virtual dd5460 {
  int e;
  virtual void  foo(); // _ZN7ee354603fooEv
  ~ee35460(); // tgen
  ee35460(); // tgen
};
//SIG(1 ee35460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee35460 ::foo(){vfunc_called(this, "_ZN7ee354603fooEv");}
ee35460 ::~ee35460(){ note_dtor("ee35460", this);} // tgen
ee35460 ::ee35460(){ note_ctor("ee35460", this);} // tgen

static void Test_ee35460()
{
  extern Class_Descriptor cd_ee35460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35460, buf);
    ee35460 *dp, &lv = *(dp=new (buf) ee35460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee35460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee35460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(32,16), "ee35460");
    check_base_class_offset(lv, (dd5460*), ABISELECT(16,8), "ee35460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35460.e");
    test_class_info(&lv, &cd_ee35460);
    dp->~ee35460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35460(Test_ee35460, "ee35460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35460C1Ev();
extern void _ZN7ee35460D1Ev();
Name_Map name_map_ee35460[] = {
  NSPAIR(_ZN7ee35460C1Ev),
  NSPAIR(_ZN7ee35460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee35460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35460[];
extern void _ZN7ee354603fooEv();
extern void _ZN6dd54603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee354603fooEv,_ZTv0_n16_N7ee354603fooEv)();
extern void ABISELECT(_ZThn32_N7ee354603fooEv,_ZThn16_N7ee354603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35460[0]),
  (VTBL_ENTRY)&_ZN7ee354603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee354603fooEv,_ZTv0_n16_N7ee354603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee35460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee35460[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee35460[] = {
  {&(_ZTV7ee35460[4]),  4,16},
  {&(_ZTV7ee35460[9]),  9,16},
  {&(_ZTV7ee35460[14]),  14,16},
  {&(_tg__ZTV6dd5460__7ee35460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee35460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35460[];
extern  VTBL_ENTRY _ZTV7ee35460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35460[];
static VTBL_ENTRY alt_thunk_names258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee354603fooEv,_ZTv0_n16_N7ee354603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee354603fooEv,_ZThn16_N7ee354603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35460 = {  "ee35460", // class name
  bases_ee35460, 4,
  &(vtc_ee35460[0]), // expected_vtbl_contents
  &(vtt_ee35460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35460),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35460),5, //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  ee45460  : dd5460 {
  int e;
  virtual void  bar(); // _ZN7ee454603barEv
  ~ee45460(); // tgen
  ee45460(); // tgen
};
//SIG(1 ee45460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee45460 ::bar(){vfunc_called(this, "_ZN7ee454603barEv");}
ee45460 ::~ee45460(){ note_dtor("ee45460", this);} // tgen
ee45460 ::ee45460(){ note_ctor("ee45460", this);} // tgen

static void Test_ee45460()
{
  extern Class_Descriptor cd_ee45460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45460, buf);
    ee45460 *dp, &lv = *(dp=new (buf) ee45460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee45460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee45460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(16,12), "ee45460");
    check_base_class_offset(lv, (dd5460*), 0, "ee45460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45460.e");
    test_class_info(&lv, &cd_ee45460);
    dp->~ee45460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45460(Test_ee45460, "ee45460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45460C1Ev();
extern void _ZN7ee45460D1Ev();
Name_Map name_map_ee45460[] = {
  NSPAIR(_ZN7ee45460C1Ev),
  NSPAIR(_ZN7ee45460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee45460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45460[];
extern void _ZN7ee454603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee454603barEv,_ZTv0_n12_N7ee454603barEv)();
extern void ABISELECT(_ZThn16_N7ee454603barEv,_ZThn12_N7ee454603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee45460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45460[0]),
  (VTBL_ENTRY)&_ZN7ee454603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee454603barEv,_ZTv0_n12_N7ee454603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee45460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee45460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee45460[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee45460[] = {
  {&(_ZTV7ee45460[3]),  3,10},
  {&(_tg__ZTV6dd5460__7ee45460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee45460[4]),  4,6},
  {&(_ZTV7ee45460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45460[];
extern  VTBL_ENTRY _ZTV7ee45460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45460[];
static VTBL_ENTRY alt_thunk_names259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee454603barEv,_ZTv0_n12_N7ee454603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee454603barEv,_ZThn12_N7ee454603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45460 = {  "ee45460", // class name
  bases_ee45460, 4,
  &(vtc_ee45460[0]), // expected_vtbl_contents
  &(vtt_ee45460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45460),4, //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  ee55460  : virtual dd5460 {
  int e;
  virtual void  bar(); // _ZN7ee554603barEv
  ~ee55460(); // tgen
  ee55460(); // tgen
};
//SIG(1 ee55460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee55460 ::bar(){vfunc_called(this, "_ZN7ee554603barEv");}
ee55460 ::~ee55460(){ note_dtor("ee55460", this);} // tgen
ee55460 ::ee55460(){ note_ctor("ee55460", this);} // tgen

static void Test_ee55460()
{
  extern Class_Descriptor cd_ee55460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55460, buf);
    ee55460 *dp, &lv = *(dp=new (buf) ee55460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee55460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee55460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(32,16), "ee55460");
    check_base_class_offset(lv, (dd5460*), ABISELECT(16,8), "ee55460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55460.e");
    test_class_info(&lv, &cd_ee55460);
    dp->~ee55460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55460(Test_ee55460, "ee55460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55460C1Ev();
extern void _ZN7ee55460D1Ev();
Name_Map name_map_ee55460[] = {
  NSPAIR(_ZN7ee55460C1Ev),
  NSPAIR(_ZN7ee55460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee55460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55460[];
extern void _ZN7ee554603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee554603barEv,_ZTv0_n16_N7ee554603barEv)();
extern void ABISELECT(_ZThn16_N7ee554603barEv,_ZThn8_N7ee554603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee554603barEv,_ZTv0_n12_N7ee554603barEv)();
extern void ABISELECT(_ZThn32_N7ee554603barEv,_ZThn16_N7ee554603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee55460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55460[0]),
  (VTBL_ENTRY)&_ZN7ee554603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee554603barEv,_ZTv0_n16_N7ee554603barEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee554603barEv,_ZTv0_n12_N7ee554603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee55460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee55460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee55460[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee55460[] = {
  {&(_ZTV7ee55460[4]),  4,16},
  {&(_ZTV7ee55460[9]),  9,16},
  {&(_ZTV7ee55460[14]),  14,16},
  {&(_tg__ZTV6dd5460__7ee55460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee55460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55460[];
extern  VTBL_ENTRY _ZTV7ee55460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55460[];
static VTBL_ENTRY alt_thunk_names260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee554603barEv,_ZTv0_n12_N7ee554603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee554603barEv,_ZThn16_N7ee554603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee554603barEv,_ZTv0_n16_N7ee554603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee554603barEv,_ZThn8_N7ee554603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55460 = {  "ee55460", // class name
  bases_ee55460, 4,
  &(vtc_ee55460[0]), // expected_vtbl_contents
  &(vtt_ee55460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55460),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names260,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65460  : dd5460 {
  int e;
  virtual void  foo(); // _ZN7ee654603fooEv
  virtual void  bar(); // _ZN7ee654603barEv
  ~ee65460(); // tgen
  ee65460(); // tgen
};
//SIG(1 ee65460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65460 ::foo(){vfunc_called(this, "_ZN7ee654603fooEv");}
void  ee65460 ::bar(){vfunc_called(this, "_ZN7ee654603barEv");}
ee65460 ::~ee65460(){ note_dtor("ee65460", this);} // tgen
ee65460 ::ee65460(){ note_ctor("ee65460", this);} // tgen

static void Test_ee65460()
{
  extern Class_Descriptor cd_ee65460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65460, buf);
    ee65460 *dp, &lv = *(dp=new (buf) ee65460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee65460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee65460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(16,12), "ee65460");
    check_base_class_offset(lv, (dd5460*), 0, "ee65460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65460.e");
    test_class_info(&lv, &cd_ee65460);
    dp->~ee65460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65460(Test_ee65460, "ee65460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65460C1Ev();
extern void _ZN7ee65460D1Ev();
Name_Map name_map_ee65460[] = {
  NSPAIR(_ZN7ee65460C1Ev),
  NSPAIR(_ZN7ee65460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee65460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65460[];
extern void _ZN7ee654603barEv();
extern void _ZN7ee654603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee654603barEv,_ZTv0_n12_N7ee654603barEv)();
extern void ABISELECT(_ZThn16_N7ee654603barEv,_ZThn12_N7ee654603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee654603fooEv,_ZTv0_n16_N7ee654603fooEv)();
extern void ABISELECT(_ZThn16_N7ee654603fooEv,_ZThn12_N7ee654603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65460[0]),
  (VTBL_ENTRY)&_ZN7ee654603barEv,
  (VTBL_ENTRY)&_ZN7ee654603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee654603barEv,_ZTv0_n12_N7ee654603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee654603fooEv,_ZTv0_n16_N7ee654603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee65460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee65460[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee65460[] = {
  {&(_ZTV7ee65460[3]),  3,11},
  {&(_tg__ZTV6dd5460__7ee65460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee65460[4]),  4,6},
  {&(_ZTV7ee65460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65460[];
extern  VTBL_ENTRY _ZTV7ee65460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65460[];
static VTBL_ENTRY alt_thunk_names261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn12_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee654603fooEv,_ZTv0_n16_N7ee654603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee654603fooEv,_ZThn12_N7ee654603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee654603barEv,_ZTv0_n12_N7ee654603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee654603barEv,_ZThn12_N7ee654603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65460 = {  "ee65460", // class name
  bases_ee65460, 4,
  &(vtc_ee65460[0]), // expected_vtbl_contents
  &(vtt_ee65460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65460),4, //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  ee75460  : virtual dd5460 {
  int e;
  virtual void  foo(); // _ZN7ee754603fooEv
  virtual void  bar(); // _ZN7ee754603barEv
  ~ee75460(); // tgen
  ee75460(); // tgen
};
//SIG(1 ee75460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75460 ::foo(){vfunc_called(this, "_ZN7ee754603fooEv");}
void  ee75460 ::bar(){vfunc_called(this, "_ZN7ee754603barEv");}
ee75460 ::~ee75460(){ note_dtor("ee75460", this);} // tgen
ee75460 ::ee75460(){ note_ctor("ee75460", this);} // tgen

static void Test_ee75460()
{
  extern Class_Descriptor cd_ee75460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75460, buf);
    ee75460 *dp, &lv = *(dp=new (buf) ee75460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee75460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee75460");
    check_base_class_offset(lv, (cc460*)(dd5460*), ABISELECT(32,16), "ee75460");
    check_base_class_offset(lv, (dd5460*), ABISELECT(16,8), "ee75460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75460.e");
    test_class_info(&lv, &cd_ee75460);
    dp->~ee75460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75460(Test_ee75460, "ee75460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75460C1Ev();
extern void _ZN7ee75460D1Ev();
Name_Map name_map_ee75460[] = {
  NSPAIR(_ZN7ee75460C1Ev),
  NSPAIR(_ZN7ee75460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd5460;
extern VTBL_ENTRY _ZTI6dd5460[];
extern  VTBL_ENTRY _ZTV6dd5460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5460[];
static Base_Class bases_ee75460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75460[];
extern void _ZN7ee754603fooEv();
extern void _ZN7ee754603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee754603barEv,_ZTv0_n16_N7ee754603barEv)();
extern void ABISELECT(_ZThn16_N7ee754603barEv,_ZThn8_N7ee754603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee754603barEv,_ZTv0_n12_N7ee754603barEv)();
extern void ABISELECT(_ZThn32_N7ee754603barEv,_ZThn16_N7ee754603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee754603fooEv,_ZTv0_n16_N7ee754603fooEv)();
extern void ABISELECT(_ZThn32_N7ee754603fooEv,_ZThn16_N7ee754603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75460[0]),
  (VTBL_ENTRY)&_ZN7ee754603fooEv,
  (VTBL_ENTRY)&_ZN7ee754603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee754603barEv,_ZTv0_n16_N7ee754603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee754603barEv,_ZTv0_n12_N7ee754603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee754603fooEv,_ZTv0_n16_N7ee754603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75460[];
extern void _ZN6dd54603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5460__7ee75460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&_ZN6dd54603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv)();
extern void ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc460__6dd5460__7ee75460[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee75460[] = {
  {&(_ZTV7ee75460[4]),  4,17},
  {&(_ZTV7ee75460[10]),  10,17},
  {&(_ZTV7ee75460[15]),  15,17},
  {&(_tg__ZTV6dd5460__7ee75460[3]),  3,4},
  {&(_tg__ZTV5cc460__6dd5460__7ee75460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75460[];
extern  VTBL_ENTRY _ZTV7ee75460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75460[];
static VTBL_ENTRY alt_thunk_names262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd54603barEv,_ZTv0_n12_N6dd54603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54603barEv,_ZThn8_N6dd54603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee754603fooEv,_ZTv0_n16_N7ee754603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee754603fooEv,_ZThn16_N7ee754603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee754603barEv,_ZTv0_n12_N7ee754603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee754603barEv,_ZThn16_N7ee754603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee754603barEv,_ZTv0_n16_N7ee754603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee754603barEv,_ZThn8_N7ee754603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75460 = {  "ee75460", // class name
  bases_ee75460, 4,
  &(vtc_ee75460[0]), // expected_vtbl_contents
  &(vtt_ee75460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75460),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75460),5, //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  dd6460  : cc460 {
  int d;
  virtual void  bar(); // _ZN6dd64603barEv
  virtual void  foo(); // _ZN6dd64603fooEv
  ~dd6460(); // tgen
  dd6460(); // tgen
};
//SIG(-1 dd6460) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd6460 ::bar(){vfunc_called(this, "_ZN6dd64603barEv");}
void  dd6460 ::foo(){vfunc_called(this, "_ZN6dd64603fooEv");}
dd6460 ::~dd6460(){ note_dtor("dd6460", this);} // tgen
dd6460 ::dd6460(){ note_ctor("dd6460", this);} // tgen

static void Test_dd6460()
{
  extern Class_Descriptor cd_dd6460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6460, buf);
    dd6460 *dp, &lv = *(dp=new (buf) dd6460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(8,4), "dd6460");
    check_base_class_offset(lv, (bb60*)(cc460*), 0, "dd6460");
    check_base_class_offset(lv, (cc460*), 0, "dd6460");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6460.d");
    test_class_info(&lv, &cd_dd6460);
    dp->~dd6460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6460(Test_dd6460, "dd6460", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6460C1Ev();
extern void _ZN6dd6460D1Ev();
Name_Map name_map_dd6460[] = {
  NSPAIR(_ZN6dd6460C1Ev),
  NSPAIR(_ZN6dd6460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd6460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd6460[];
extern void _ZN6dd64603barEv();
extern void _ZN6dd64603fooEv();
static  VTBL_ENTRY vtc_dd6460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6460[0]),
  (VTBL_ENTRY)&_ZN6dd64603barEv,
  (VTBL_ENTRY)&_ZN6dd64603fooEv,
};
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
Class_Descriptor cd_dd6460 = {  "dd6460", // class name
  bases_dd6460, 3,
  &(vtc_dd6460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6460),4, //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  ee06460  : dd6460 {
  int e;
  ~ee06460(); // tgen
  ee06460(); // tgen
};
//SIG(1 ee06460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee06460 ::~ee06460(){ note_dtor("ee06460", this);} // tgen
ee06460 ::ee06460(){ note_ctor("ee06460", this);} // tgen

static void Test_ee06460()
{
  extern Class_Descriptor cd_ee06460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06460, buf);
    ee06460 *dp, &lv = *(dp=new (buf) ee06460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(8,4), "ee06460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), 0, "ee06460");
    check_base_class_offset(lv, (cc460*)(dd6460*), 0, "ee06460");
    check_base_class_offset(lv, (dd6460*), 0, "ee06460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06460.e");
    test_class_info(&lv, &cd_ee06460);
    dp->~ee06460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06460(Test_ee06460, "ee06460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06460C1Ev();
extern void _ZN7ee06460D1Ev();
Name_Map name_map_ee06460[] = {
  NSPAIR(_ZN7ee06460C1Ev),
  NSPAIR(_ZN7ee06460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee06460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06460[];
extern void _ZN6dd64603barEv();
extern void _ZN6dd64603fooEv();
static  VTBL_ENTRY vtc_ee06460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06460[0]),
  (VTBL_ENTRY)&_ZN6dd64603barEv,
  (VTBL_ENTRY)&_ZN6dd64603fooEv,
};
extern VTBL_ENTRY _ZTI7ee06460[];
extern  VTBL_ENTRY _ZTV7ee06460[];
Class_Descriptor cd_ee06460 = {  "ee06460", // class name
  bases_ee06460, 4,
  &(vtc_ee06460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06460),4, //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  ee16460  : virtual dd6460 {
  int e;
  ~ee16460(); // tgen
  ee16460(); // tgen
};
//SIG(1 ee16460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee16460 ::~ee16460(){ note_dtor("ee16460", this);} // tgen
ee16460 ::ee16460(){ note_ctor("ee16460", this);} // tgen

static void Test_ee16460()
{
  extern Class_Descriptor cd_ee16460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16460, buf);
    ee16460 *dp, &lv = *(dp=new (buf) ee16460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(24,12), "ee16460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), ABISELECT(16,8), "ee16460");
    check_base_class_offset(lv, (cc460*)(dd6460*), ABISELECT(16,8), "ee16460");
    check_base_class_offset(lv, (dd6460*), ABISELECT(16,8), "ee16460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16460.e");
    test_class_info(&lv, &cd_ee16460);
    dp->~ee16460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16460(Test_ee16460, "ee16460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16460C1Ev();
extern void _ZN7ee16460D1Ev();
Name_Map name_map_ee16460[] = {
  NSPAIR(_ZN7ee16460C1Ev),
  NSPAIR(_ZN7ee16460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee16460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16460[];
extern void _ZN6dd64603barEv();
extern void _ZN6dd64603fooEv();
static  VTBL_ENTRY vtc_ee16460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16460[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16460[0]),
  (VTBL_ENTRY)&_ZN6dd64603barEv,
  (VTBL_ENTRY)&_ZN6dd64603fooEv,
};
extern VTBL_ENTRY _ZTV7ee16460[];
static  VTT_ENTRY vtt_ee16460[] = {
  {&(_ZTV7ee16460[3]),  3,9},
  {&(_ZTV7ee16460[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16460[];
extern  VTBL_ENTRY _ZTV7ee16460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16460[];
Class_Descriptor cd_ee16460 = {  "ee16460", // class name
  bases_ee16460, 4,
  &(vtc_ee16460[0]), // expected_vtbl_contents
  &(vtt_ee16460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16460),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16460),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  ee26460  : dd6460 {
  int e;
  virtual void  foo(); // _ZN7ee264603fooEv
  ~ee26460(); // tgen
  ee26460(); // tgen
};
//SIG(1 ee26460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26460 ::foo(){vfunc_called(this, "_ZN7ee264603fooEv");}
ee26460 ::~ee26460(){ note_dtor("ee26460", this);} // tgen
ee26460 ::ee26460(){ note_ctor("ee26460", this);} // tgen

static void Test_ee26460()
{
  extern Class_Descriptor cd_ee26460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26460, buf);
    ee26460 *dp, &lv = *(dp=new (buf) ee26460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(8,4), "ee26460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), 0, "ee26460");
    check_base_class_offset(lv, (cc460*)(dd6460*), 0, "ee26460");
    check_base_class_offset(lv, (dd6460*), 0, "ee26460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26460.e");
    test_class_info(&lv, &cd_ee26460);
    dp->~ee26460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26460(Test_ee26460, "ee26460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26460C1Ev();
extern void _ZN7ee26460D1Ev();
Name_Map name_map_ee26460[] = {
  NSPAIR(_ZN7ee26460C1Ev),
  NSPAIR(_ZN7ee26460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee26460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee26460[];
extern void _ZN6dd64603barEv();
extern void _ZN7ee264603fooEv();
static  VTBL_ENTRY vtc_ee26460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26460[0]),
  (VTBL_ENTRY)&_ZN6dd64603barEv,
  (VTBL_ENTRY)&_ZN7ee264603fooEv,
};
extern VTBL_ENTRY _ZTI7ee26460[];
extern  VTBL_ENTRY _ZTV7ee26460[];
Class_Descriptor cd_ee26460 = {  "ee26460", // class name
  bases_ee26460, 4,
  &(vtc_ee26460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26460),4, //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  ee36460  : virtual dd6460 {
  int e;
  virtual void  foo(); // _ZN7ee364603fooEv
  ~ee36460(); // tgen
  ee36460(); // tgen
};
//SIG(1 ee36460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36460 ::foo(){vfunc_called(this, "_ZN7ee364603fooEv");}
ee36460 ::~ee36460(){ note_dtor("ee36460", this);} // tgen
ee36460 ::ee36460(){ note_ctor("ee36460", this);} // tgen

static void Test_ee36460()
{
  extern Class_Descriptor cd_ee36460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36460, buf);
    ee36460 *dp, &lv = *(dp=new (buf) ee36460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(24,12), "ee36460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), ABISELECT(16,8), "ee36460");
    check_base_class_offset(lv, (cc460*)(dd6460*), ABISELECT(16,8), "ee36460");
    check_base_class_offset(lv, (dd6460*), ABISELECT(16,8), "ee36460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36460.e");
    test_class_info(&lv, &cd_ee36460);
    dp->~ee36460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36460(Test_ee36460, "ee36460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36460C1Ev();
extern void _ZN7ee36460D1Ev();
Name_Map name_map_ee36460[] = {
  NSPAIR(_ZN7ee36460C1Ev),
  NSPAIR(_ZN7ee36460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee36460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36460[];
extern void _ZN7ee364603fooEv();
extern void _ZN6dd64603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee364603fooEv,_ZTv0_n16_N7ee364603fooEv)();
extern void ABISELECT(_ZThn16_N7ee364603fooEv,_ZThn8_N7ee364603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36460[0]),
  (VTBL_ENTRY)&_ZN7ee364603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36460[0]),
  (VTBL_ENTRY)&_ZN6dd64603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee364603fooEv,_ZTv0_n16_N7ee364603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36460[];
static  VTT_ENTRY vtt_ee36460[] = {
  {&(_ZTV7ee36460[3]),  3,10},
  {&(_ZTV7ee36460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36460[];
extern  VTBL_ENTRY _ZTV7ee36460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36460[];
static VTBL_ENTRY alt_thunk_names263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee364603fooEv,_ZTv0_n16_N7ee364603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee364603fooEv,_ZThn8_N7ee364603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36460 = {  "ee36460", // class name
  bases_ee36460, 4,
  &(vtc_ee36460[0]), // expected_vtbl_contents
  &(vtt_ee36460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36460),2, //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  ee46460  : dd6460 {
  int e;
  virtual void  bar(); // _ZN7ee464603barEv
  ~ee46460(); // tgen
  ee46460(); // tgen
};
//SIG(1 ee46460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46460 ::bar(){vfunc_called(this, "_ZN7ee464603barEv");}
ee46460 ::~ee46460(){ note_dtor("ee46460", this);} // tgen
ee46460 ::ee46460(){ note_ctor("ee46460", this);} // tgen

static void Test_ee46460()
{
  extern Class_Descriptor cd_ee46460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46460, buf);
    ee46460 *dp, &lv = *(dp=new (buf) ee46460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(8,4), "ee46460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), 0, "ee46460");
    check_base_class_offset(lv, (cc460*)(dd6460*), 0, "ee46460");
    check_base_class_offset(lv, (dd6460*), 0, "ee46460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46460.e");
    test_class_info(&lv, &cd_ee46460);
    dp->~ee46460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46460(Test_ee46460, "ee46460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46460C1Ev();
extern void _ZN7ee46460D1Ev();
Name_Map name_map_ee46460[] = {
  NSPAIR(_ZN7ee46460C1Ev),
  NSPAIR(_ZN7ee46460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee46460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee46460[];
extern void _ZN7ee464603barEv();
extern void _ZN6dd64603fooEv();
static  VTBL_ENTRY vtc_ee46460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46460[0]),
  (VTBL_ENTRY)&_ZN7ee464603barEv,
  (VTBL_ENTRY)&_ZN6dd64603fooEv,
};
extern VTBL_ENTRY _ZTI7ee46460[];
extern  VTBL_ENTRY _ZTV7ee46460[];
Class_Descriptor cd_ee46460 = {  "ee46460", // class name
  bases_ee46460, 4,
  &(vtc_ee46460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46460),4, //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  ee56460  : virtual dd6460 {
  int e;
  virtual void  bar(); // _ZN7ee564603barEv
  ~ee56460(); // tgen
  ee56460(); // tgen
};
//SIG(1 ee56460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56460 ::bar(){vfunc_called(this, "_ZN7ee564603barEv");}
ee56460 ::~ee56460(){ note_dtor("ee56460", this);} // tgen
ee56460 ::ee56460(){ note_ctor("ee56460", this);} // tgen

static void Test_ee56460()
{
  extern Class_Descriptor cd_ee56460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56460, buf);
    ee56460 *dp, &lv = *(dp=new (buf) ee56460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(24,12), "ee56460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), ABISELECT(16,8), "ee56460");
    check_base_class_offset(lv, (cc460*)(dd6460*), ABISELECT(16,8), "ee56460");
    check_base_class_offset(lv, (dd6460*), ABISELECT(16,8), "ee56460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56460.e");
    test_class_info(&lv, &cd_ee56460);
    dp->~ee56460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56460(Test_ee56460, "ee56460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56460C1Ev();
extern void _ZN7ee56460D1Ev();
Name_Map name_map_ee56460[] = {
  NSPAIR(_ZN7ee56460C1Ev),
  NSPAIR(_ZN7ee56460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee56460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56460[];
extern void _ZN7ee564603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee564603barEv,_ZTv0_n12_N7ee564603barEv)();
extern void ABISELECT(_ZThn16_N7ee564603barEv,_ZThn8_N7ee564603barEv)() __attribute__((weak));
extern void _ZN6dd64603fooEv();
static  VTBL_ENTRY vtc_ee56460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56460[0]),
  (VTBL_ENTRY)&_ZN7ee564603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee564603barEv,_ZTv0_n12_N7ee564603barEv),
  (VTBL_ENTRY)&_ZN6dd64603fooEv,
};
extern VTBL_ENTRY _ZTV7ee56460[];
static  VTT_ENTRY vtt_ee56460[] = {
  {&(_ZTV7ee56460[3]),  3,10},
  {&(_ZTV7ee56460[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56460[];
extern  VTBL_ENTRY _ZTV7ee56460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56460[];
static VTBL_ENTRY alt_thunk_names264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee564603barEv,_ZTv0_n12_N7ee564603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee564603barEv,_ZThn8_N7ee564603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56460 = {  "ee56460", // class name
  bases_ee56460, 4,
  &(vtc_ee56460[0]), // expected_vtbl_contents
  &(vtt_ee56460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56460),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56460),2, //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  ee66460  : dd6460 {
  int e;
  virtual void  foo(); // _ZN7ee664603fooEv
  virtual void  bar(); // _ZN7ee664603barEv
  ~ee66460(); // tgen
  ee66460(); // tgen
};
//SIG(1 ee66460) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66460 ::foo(){vfunc_called(this, "_ZN7ee664603fooEv");}
void  ee66460 ::bar(){vfunc_called(this, "_ZN7ee664603barEv");}
ee66460 ::~ee66460(){ note_dtor("ee66460", this);} // tgen
ee66460 ::ee66460(){ note_ctor("ee66460", this);} // tgen

static void Test_ee66460()
{
  extern Class_Descriptor cd_ee66460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66460, buf);
    ee66460 *dp, &lv = *(dp=new (buf) ee66460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(8,4), "ee66460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), 0, "ee66460");
    check_base_class_offset(lv, (cc460*)(dd6460*), 0, "ee66460");
    check_base_class_offset(lv, (dd6460*), 0, "ee66460");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66460.e");
    test_class_info(&lv, &cd_ee66460);
    dp->~ee66460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66460(Test_ee66460, "ee66460", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66460C1Ev();
extern void _ZN7ee66460D1Ev();
Name_Map name_map_ee66460[] = {
  NSPAIR(_ZN7ee66460C1Ev),
  NSPAIR(_ZN7ee66460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee66460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee66460[];
extern void _ZN7ee664603barEv();
extern void _ZN7ee664603fooEv();
static  VTBL_ENTRY vtc_ee66460[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66460[0]),
  (VTBL_ENTRY)&_ZN7ee664603barEv,
  (VTBL_ENTRY)&_ZN7ee664603fooEv,
};
extern VTBL_ENTRY _ZTI7ee66460[];
extern  VTBL_ENTRY _ZTV7ee66460[];
Class_Descriptor cd_ee66460 = {  "ee66460", // class name
  bases_ee66460, 4,
  &(vtc_ee66460[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66460),4, //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  ee76460  : virtual dd6460 {
  int e;
  virtual void  foo(); // _ZN7ee764603fooEv
  virtual void  bar(); // _ZN7ee764603barEv
  ~ee76460(); // tgen
  ee76460(); // tgen
};
//SIG(1 ee76460) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76460 ::foo(){vfunc_called(this, "_ZN7ee764603fooEv");}
void  ee76460 ::bar(){vfunc_called(this, "_ZN7ee764603barEv");}
ee76460 ::~ee76460(){ note_dtor("ee76460", this);} // tgen
ee76460 ::ee76460(){ note_ctor("ee76460", this);} // tgen

static void Test_ee76460()
{
  extern Class_Descriptor cd_ee76460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76460, buf);
    ee76460 *dp, &lv = *(dp=new (buf) ee76460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*)(dd6460*), ABISELECT(24,12), "ee76460");
    check_base_class_offset(lv, (bb60*)(cc460*)(dd6460*), ABISELECT(16,8), "ee76460");
    check_base_class_offset(lv, (cc460*)(dd6460*), ABISELECT(16,8), "ee76460");
    check_base_class_offset(lv, (dd6460*), ABISELECT(16,8), "ee76460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76460.e");
    test_class_info(&lv, &cd_ee76460);
    dp->~ee76460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76460(Test_ee76460, "ee76460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76460C1Ev();
extern void _ZN7ee76460D1Ev();
Name_Map name_map_ee76460[] = {
  NSPAIR(_ZN7ee76460C1Ev),
  NSPAIR(_ZN7ee76460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd6460;
extern VTBL_ENTRY _ZTI6dd6460[];
extern  VTBL_ENTRY _ZTV6dd6460[];
static Base_Class bases_ee76460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6460,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76460[];
extern void _ZN7ee764603fooEv();
extern void _ZN7ee764603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee764603barEv,_ZTv0_n12_N7ee764603barEv)();
extern void ABISELECT(_ZThn16_N7ee764603barEv,_ZThn8_N7ee764603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee764603fooEv,_ZTv0_n16_N7ee764603fooEv)();
extern void ABISELECT(_ZThn16_N7ee764603fooEv,_ZThn8_N7ee764603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76460[0]),
  (VTBL_ENTRY)&_ZN7ee764603fooEv,
  (VTBL_ENTRY)&_ZN7ee764603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee764603barEv,_ZTv0_n12_N7ee764603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee764603fooEv,_ZTv0_n16_N7ee764603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76460[];
static  VTT_ENTRY vtt_ee76460[] = {
  {&(_ZTV7ee76460[3]),  3,11},
  {&(_ZTV7ee76460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76460[];
extern  VTBL_ENTRY _ZTV7ee76460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76460[];
static VTBL_ENTRY alt_thunk_names265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee764603fooEv,_ZTv0_n16_N7ee764603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee764603fooEv,_ZThn8_N7ee764603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee764603barEv,_ZTv0_n12_N7ee764603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee764603barEv,_ZThn8_N7ee764603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76460 = {  "ee76460", // class name
  bases_ee76460, 4,
  &(vtc_ee76460[0]), // expected_vtbl_contents
  &(vtt_ee76460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76460),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names265,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7460  : virtual cc460 {
  int d;
  virtual void  bar(); // _ZN6dd74603barEv
  virtual void  foo(); // _ZN6dd74603fooEv
  ~dd7460(); // tgen
  dd7460(); // tgen
};
//SIG(-1 dd7460) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd7460 ::bar(){vfunc_called(this, "_ZN6dd74603barEv");}
void  dd7460 ::foo(){vfunc_called(this, "_ZN6dd74603fooEv");}
dd7460 ::~dd7460(){ note_dtor("dd7460", this);} // tgen
dd7460 ::dd7460(){ note_ctor("dd7460", this);} // tgen

static void Test_dd7460()
{
  extern Class_Descriptor cd_dd7460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7460, buf);
    dd7460 *dp, &lv = *(dp=new (buf) dd7460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,12), "dd7460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,8), "dd7460");
    check_base_class_offset(lv, (cc460*), ABISELECT(16,8), "dd7460");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7460.d");
    test_class_info(&lv, &cd_dd7460);
    dp->~dd7460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7460(Test_dd7460, "dd7460", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7460C1Ev();
extern void _ZN6dd7460D1Ev();
Name_Map name_map_dd7460[] = {
  NSPAIR(_ZN6dd7460C1Ev),
  NSPAIR(_ZN6dd7460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
static Base_Class bases_dd7460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7460[];
static  VTT_ENTRY vtt_dd7460[] = {
  {&(_ZTV6dd7460[3]),  3,11},
  {&(_ZTV6dd7460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static VTBL_ENTRY alt_thunk_names266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7460 = {  "dd7460", // class name
  bases_dd7460, 3,
  &(vtc_dd7460[0]), // expected_vtbl_contents
  &(vtt_dd7460[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7460),2, //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  ee07460  : dd7460 {
  int e;
  ~ee07460(); // tgen
  ee07460(); // tgen
};
//SIG(1 ee07460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee07460 ::~ee07460(){ note_dtor("ee07460", this);} // tgen
ee07460 ::ee07460(){ note_ctor("ee07460", this);} // tgen

static void Test_ee07460()
{
  extern Class_Descriptor cd_ee07460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07460, buf);
    ee07460 *dp, &lv = *(dp=new (buf) ee07460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee07460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee07460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(16,12), "ee07460");
    check_base_class_offset(lv, (dd7460*), 0, "ee07460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07460.e");
    test_class_info(&lv, &cd_ee07460);
    dp->~ee07460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07460(Test_ee07460, "ee07460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07460C1Ev();
extern void _ZN7ee07460D1Ev();
Name_Map name_map_ee07460[] = {
  NSPAIR(_ZN7ee07460C1Ev),
  NSPAIR(_ZN7ee07460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee07460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee07460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee07460[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee07460[] = {
  {&(_ZTV7ee07460[3]),  3,11},
  {&(_tg__ZTV6dd7460__7ee07460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee07460[4]),  4,6},
  {&(_ZTV7ee07460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07460[];
extern  VTBL_ENTRY _ZTV7ee07460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07460[];
static VTBL_ENTRY alt_thunk_names267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07460 = {  "ee07460", // class name
  bases_ee07460, 4,
  &(vtc_ee07460[0]), // expected_vtbl_contents
  &(vtt_ee07460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names267,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17460  : virtual dd7460 {
  int e;
  ~ee17460(); // tgen
  ee17460(); // tgen
};
//SIG(1 ee17460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee17460 ::~ee17460(){ note_dtor("ee17460", this);} // tgen
ee17460 ::ee17460(){ note_ctor("ee17460", this);} // tgen

static void Test_ee17460()
{
  extern Class_Descriptor cd_ee17460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17460, buf);
    ee17460 *dp, &lv = *(dp=new (buf) ee17460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee17460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee17460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(32,16), "ee17460");
    check_base_class_offset(lv, (dd7460*), ABISELECT(16,8), "ee17460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17460.e");
    test_class_info(&lv, &cd_ee17460);
    dp->~ee17460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17460(Test_ee17460, "ee17460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17460C1Ev();
extern void _ZN7ee17460D1Ev();
Name_Map name_map_ee17460[] = {
  NSPAIR(_ZN7ee17460C1Ev),
  NSPAIR(_ZN7ee17460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee17460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17460[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee17460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee17460[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee17460[] = {
  {&(_ZTV7ee17460[4]),  4,17},
  {&(_ZTV7ee17460[9]),  9,17},
  {&(_ZTV7ee17460[15]),  15,17},
  {&(_tg__ZTV6dd7460__7ee17460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee17460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17460[];
extern  VTBL_ENTRY _ZTV7ee17460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17460[];
static VTBL_ENTRY alt_thunk_names268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17460 = {  "ee17460", // class name
  bases_ee17460, 4,
  &(vtc_ee17460[0]), // expected_vtbl_contents
  &(vtt_ee17460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17460),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names268,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27460  : dd7460 {
  int e;
  virtual void  foo(); // _ZN7ee274603fooEv
  ~ee27460(); // tgen
  ee27460(); // tgen
};
//SIG(1 ee27460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27460 ::foo(){vfunc_called(this, "_ZN7ee274603fooEv");}
ee27460 ::~ee27460(){ note_dtor("ee27460", this);} // tgen
ee27460 ::ee27460(){ note_ctor("ee27460", this);} // tgen

static void Test_ee27460()
{
  extern Class_Descriptor cd_ee27460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27460, buf);
    ee27460 *dp, &lv = *(dp=new (buf) ee27460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee27460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee27460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(16,12), "ee27460");
    check_base_class_offset(lv, (dd7460*), 0, "ee27460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27460.e");
    test_class_info(&lv, &cd_ee27460);
    dp->~ee27460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27460(Test_ee27460, "ee27460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27460C1Ev();
extern void _ZN7ee27460D1Ev();
Name_Map name_map_ee27460[] = {
  NSPAIR(_ZN7ee27460C1Ev),
  NSPAIR(_ZN7ee27460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee27460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27460[];
extern void _ZN6dd74603barEv();
extern void _ZN7ee274603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee274603fooEv,_ZTv0_n16_N7ee274603fooEv)();
extern void ABISELECT(_ZThn16_N7ee274603fooEv,_ZThn12_N7ee274603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN7ee274603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee274603fooEv,_ZTv0_n16_N7ee274603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee27460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee27460[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee27460[] = {
  {&(_ZTV7ee27460[3]),  3,11},
  {&(_tg__ZTV6dd7460__7ee27460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee27460[4]),  4,6},
  {&(_ZTV7ee27460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27460[];
extern  VTBL_ENTRY _ZTV7ee27460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27460[];
static VTBL_ENTRY alt_thunk_names269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee274603fooEv,_ZTv0_n16_N7ee274603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee274603fooEv,_ZThn12_N7ee274603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27460 = {  "ee27460", // class name
  bases_ee27460, 4,
  &(vtc_ee27460[0]), // expected_vtbl_contents
  &(vtt_ee27460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names269,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37460  : virtual dd7460 {
  int e;
  virtual void  foo(); // _ZN7ee374603fooEv
  ~ee37460(); // tgen
  ee37460(); // tgen
};
//SIG(1 ee37460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37460 ::foo(){vfunc_called(this, "_ZN7ee374603fooEv");}
ee37460 ::~ee37460(){ note_dtor("ee37460", this);} // tgen
ee37460 ::ee37460(){ note_ctor("ee37460", this);} // tgen

static void Test_ee37460()
{
  extern Class_Descriptor cd_ee37460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37460, buf);
    ee37460 *dp, &lv = *(dp=new (buf) ee37460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee37460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee37460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(32,16), "ee37460");
    check_base_class_offset(lv, (dd7460*), ABISELECT(16,8), "ee37460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37460.e");
    test_class_info(&lv, &cd_ee37460);
    dp->~ee37460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37460(Test_ee37460, "ee37460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37460C1Ev();
extern void _ZN7ee37460D1Ev();
Name_Map name_map_ee37460[] = {
  NSPAIR(_ZN7ee37460C1Ev),
  NSPAIR(_ZN7ee37460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee37460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37460[];
extern void _ZN7ee374603fooEv();
extern void _ZN6dd74603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee374603fooEv,_ZTv0_n20_N7ee374603fooEv)();
extern void ABISELECT(_ZThn16_N7ee374603fooEv,_ZThn8_N7ee374603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee374603fooEv,_ZTv0_n16_N7ee374603fooEv)();
extern void ABISELECT(_ZThn32_N7ee374603fooEv,_ZThn16_N7ee374603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37460[0]),
  (VTBL_ENTRY)&_ZN7ee374603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee374603fooEv,_ZTv0_n20_N7ee374603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee374603fooEv,_ZTv0_n16_N7ee374603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee37460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee37460[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee37460[] = {
  {&(_ZTV7ee37460[4]),  4,18},
  {&(_ZTV7ee37460[10]),  10,18},
  {&(_ZTV7ee37460[16]),  16,18},
  {&(_tg__ZTV6dd7460__7ee37460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee37460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37460[];
extern  VTBL_ENTRY _ZTV7ee37460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37460[];
static VTBL_ENTRY alt_thunk_names270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee374603fooEv,_ZTv0_n16_N7ee374603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee374603fooEv,_ZThn16_N7ee374603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee374603fooEv,_ZTv0_n20_N7ee374603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee374603fooEv,_ZThn8_N7ee374603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37460 = {  "ee37460", // class name
  bases_ee37460, 4,
  &(vtc_ee37460[0]), // expected_vtbl_contents
  &(vtt_ee37460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37460),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names270,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47460  : dd7460 {
  int e;
  virtual void  bar(); // _ZN7ee474603barEv
  ~ee47460(); // tgen
  ee47460(); // tgen
};
//SIG(1 ee47460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47460 ::bar(){vfunc_called(this, "_ZN7ee474603barEv");}
ee47460 ::~ee47460(){ note_dtor("ee47460", this);} // tgen
ee47460 ::ee47460(){ note_ctor("ee47460", this);} // tgen

static void Test_ee47460()
{
  extern Class_Descriptor cd_ee47460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47460, buf);
    ee47460 *dp, &lv = *(dp=new (buf) ee47460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee47460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee47460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(16,12), "ee47460");
    check_base_class_offset(lv, (dd7460*), 0, "ee47460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47460.e");
    test_class_info(&lv, &cd_ee47460);
    dp->~ee47460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47460(Test_ee47460, "ee47460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47460C1Ev();
extern void _ZN7ee47460D1Ev();
Name_Map name_map_ee47460[] = {
  NSPAIR(_ZN7ee47460C1Ev),
  NSPAIR(_ZN7ee47460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee47460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47460[];
extern void _ZN7ee474603barEv();
extern void _ZN6dd74603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee474603barEv,_ZTv0_n12_N7ee474603barEv)();
extern void ABISELECT(_ZThn16_N7ee474603barEv,_ZThn12_N7ee474603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47460[0]),
  (VTBL_ENTRY)&_ZN7ee474603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee474603barEv,_ZTv0_n12_N7ee474603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee47460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee47460[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee47460[] = {
  {&(_ZTV7ee47460[3]),  3,11},
  {&(_tg__ZTV6dd7460__7ee47460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee47460[4]),  4,6},
  {&(_ZTV7ee47460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47460[];
extern  VTBL_ENTRY _ZTV7ee47460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47460[];
static VTBL_ENTRY alt_thunk_names271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee474603barEv,_ZTv0_n12_N7ee474603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee474603barEv,_ZThn12_N7ee474603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47460 = {  "ee47460", // class name
  bases_ee47460, 4,
  &(vtc_ee47460[0]), // expected_vtbl_contents
  &(vtt_ee47460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names271,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57460  : virtual dd7460 {
  int e;
  virtual void  bar(); // _ZN7ee574603barEv
  ~ee57460(); // tgen
  ee57460(); // tgen
};
//SIG(1 ee57460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57460 ::bar(){vfunc_called(this, "_ZN7ee574603barEv");}
ee57460 ::~ee57460(){ note_dtor("ee57460", this);} // tgen
ee57460 ::ee57460(){ note_ctor("ee57460", this);} // tgen

static void Test_ee57460()
{
  extern Class_Descriptor cd_ee57460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57460, buf);
    ee57460 *dp, &lv = *(dp=new (buf) ee57460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee57460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee57460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(32,16), "ee57460");
    check_base_class_offset(lv, (dd7460*), ABISELECT(16,8), "ee57460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57460.e");
    test_class_info(&lv, &cd_ee57460);
    dp->~ee57460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57460(Test_ee57460, "ee57460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57460C1Ev();
extern void _ZN7ee57460D1Ev();
Name_Map name_map_ee57460[] = {
  NSPAIR(_ZN7ee57460C1Ev),
  NSPAIR(_ZN7ee57460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee57460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57460[];
extern void _ZN7ee574603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee574603barEv,_ZTv0_n16_N7ee574603barEv)();
extern void ABISELECT(_ZThn16_N7ee574603barEv,_ZThn8_N7ee574603barEv)() __attribute__((weak));
extern void _ZN6dd74603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee574603barEv,_ZTv0_n12_N7ee574603barEv)();
extern void ABISELECT(_ZThn32_N7ee574603barEv,_ZThn16_N7ee574603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57460[0]),
  (VTBL_ENTRY)&_ZN7ee574603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee574603barEv,_ZTv0_n16_N7ee574603barEv),
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee574603barEv,_ZTv0_n12_N7ee574603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee57460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee57460[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee57460[] = {
  {&(_ZTV7ee57460[4]),  4,18},
  {&(_ZTV7ee57460[10]),  10,18},
  {&(_ZTV7ee57460[16]),  16,18},
  {&(_tg__ZTV6dd7460__7ee57460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee57460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57460[];
extern  VTBL_ENTRY _ZTV7ee57460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57460[];
static VTBL_ENTRY alt_thunk_names272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee574603barEv,_ZTv0_n12_N7ee574603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee574603barEv,_ZThn16_N7ee574603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee574603barEv,_ZTv0_n16_N7ee574603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee574603barEv,_ZThn8_N7ee574603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57460 = {  "ee57460", // class name
  bases_ee57460, 4,
  &(vtc_ee57460[0]), // expected_vtbl_contents
  &(vtt_ee57460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57460),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57460),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names272,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67460  : dd7460 {
  int e;
  virtual void  foo(); // _ZN7ee674603fooEv
  virtual void  bar(); // _ZN7ee674603barEv
  ~ee67460(); // tgen
  ee67460(); // tgen
};
//SIG(1 ee67460) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67460 ::foo(){vfunc_called(this, "_ZN7ee674603fooEv");}
void  ee67460 ::bar(){vfunc_called(this, "_ZN7ee674603barEv");}
ee67460 ::~ee67460(){ note_dtor("ee67460", this);} // tgen
ee67460 ::ee67460(){ note_ctor("ee67460", this);} // tgen

static void Test_ee67460()
{
  extern Class_Descriptor cd_ee67460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67460, buf);
    ee67460 *dp, &lv = *(dp=new (buf) ee67460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(24,16), "ee67460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(16,12), "ee67460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(16,12), "ee67460");
    check_base_class_offset(lv, (dd7460*), 0, "ee67460");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67460.e");
    test_class_info(&lv, &cd_ee67460);
    dp->~ee67460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67460(Test_ee67460, "ee67460", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67460C1Ev();
extern void _ZN7ee67460D1Ev();
Name_Map name_map_ee67460[] = {
  NSPAIR(_ZN7ee67460C1Ev),
  NSPAIR(_ZN7ee67460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee67460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc460,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67460[];
extern void _ZN7ee674603barEv();
extern void _ZN7ee674603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee674603barEv,_ZTv0_n12_N7ee674603barEv)();
extern void ABISELECT(_ZThn16_N7ee674603barEv,_ZThn12_N7ee674603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee674603fooEv,_ZTv0_n16_N7ee674603fooEv)();
extern void ABISELECT(_ZThn16_N7ee674603fooEv,_ZThn12_N7ee674603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67460[0]),
  (VTBL_ENTRY)&_ZN7ee674603barEv,
  (VTBL_ENTRY)&_ZN7ee674603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee674603barEv,_ZTv0_n12_N7ee674603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee674603fooEv,_ZTv0_n16_N7ee674603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee67460[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee67460[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee67460[] = {
  {&(_ZTV7ee67460[3]),  3,11},
  {&(_tg__ZTV6dd7460__7ee67460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee67460[4]),  4,6},
  {&(_ZTV7ee67460[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67460[];
extern  VTBL_ENTRY _ZTV7ee67460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67460[];
static VTBL_ENTRY alt_thunk_names273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn12_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn12_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee674603fooEv,_ZTv0_n16_N7ee674603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee674603fooEv,_ZThn12_N7ee674603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee674603barEv,_ZTv0_n12_N7ee674603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee674603barEv,_ZThn12_N7ee674603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67460 = {  "ee67460", // class name
  bases_ee67460, 4,
  &(vtc_ee67460[0]), // expected_vtbl_contents
  &(vtt_ee67460[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67460),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67460),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67460),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names273,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77460  : virtual dd7460 {
  int e;
  virtual void  foo(); // _ZN7ee774603fooEv
  virtual void  bar(); // _ZN7ee774603barEv
  ~ee77460(); // tgen
  ee77460(); // tgen
};
//SIG(1 ee77460) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77460 ::foo(){vfunc_called(this, "_ZN7ee774603fooEv");}
void  ee77460 ::bar(){vfunc_called(this, "_ZN7ee774603barEv");}
ee77460 ::~ee77460(){ note_dtor("ee77460", this);} // tgen
ee77460 ::ee77460(){ note_ctor("ee77460", this);} // tgen

static void Test_ee77460()
{
  extern Class_Descriptor cd_ee77460;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77460, buf);
    ee77460 *dp, &lv = *(dp=new (buf) ee77460());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77460)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77460)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc460*), ABISELECT(40,20), "ee77460");
    check_base_class_offset(lv, (bb60*)(cc460*), ABISELECT(32,16), "ee77460");
    check_base_class_offset(lv, (cc460*)(dd7460*), ABISELECT(32,16), "ee77460");
    check_base_class_offset(lv, (dd7460*), ABISELECT(16,8), "ee77460");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77460.e");
    test_class_info(&lv, &cd_ee77460);
    dp->~ee77460();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77460(Test_ee77460, "ee77460", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77460C1Ev();
extern void _ZN7ee77460D1Ev();
Name_Map name_map_ee77460[] = {
  NSPAIR(_ZN7ee77460C1Ev),
  NSPAIR(_ZN7ee77460D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc460;
extern VTBL_ENTRY _ZTI5cc460[];
extern  VTBL_ENTRY _ZTV5cc460[];
extern Class_Descriptor cd_dd7460;
extern VTBL_ENTRY _ZTI6dd7460[];
extern  VTBL_ENTRY _ZTV6dd7460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7460[];
static Base_Class bases_ee77460[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc460,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7460,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77460[];
extern void _ZN7ee774603fooEv();
extern void _ZN7ee774603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee774603barEv,_ZTv0_n16_N7ee774603barEv)();
extern void ABISELECT(_ZThn16_N7ee774603barEv,_ZThn8_N7ee774603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee774603fooEv,_ZTv0_n20_N7ee774603fooEv)();
extern void ABISELECT(_ZThn16_N7ee774603fooEv,_ZThn8_N7ee774603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee774603barEv,_ZTv0_n12_N7ee774603barEv)();
extern void ABISELECT(_ZThn32_N7ee774603barEv,_ZThn16_N7ee774603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee774603fooEv,_ZTv0_n16_N7ee774603fooEv)();
extern void ABISELECT(_ZThn32_N7ee774603fooEv,_ZThn16_N7ee774603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77460[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77460[0]),
  (VTBL_ENTRY)&_ZN7ee774603fooEv,
  (VTBL_ENTRY)&_ZN7ee774603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee774603barEv,_ZTv0_n16_N7ee774603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee774603fooEv,_ZTv0_n20_N7ee774603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee774603barEv,_ZTv0_n12_N7ee774603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee774603fooEv,_ZTv0_n16_N7ee774603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77460[];
extern void _ZN6dd74603barEv();
extern void _ZN6dd74603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7460__7ee77460[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&_ZN6dd74603barEv,
  (VTBL_ENTRY)&_ZN6dd74603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv)();
extern void ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv)();
extern void ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc460__6dd7460__7ee77460[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7460[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv),
};
static  VTT_ENTRY vtt_ee77460[] = {
  {&(_ZTV7ee77460[4]),  4,19},
  {&(_ZTV7ee77460[11]),  11,19},
  {&(_ZTV7ee77460[17]),  17,19},
  {&(_tg__ZTV6dd7460__7ee77460[3]),  3,5},
  {&(_tg__ZTV5cc460__6dd7460__7ee77460[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77460[];
extern  VTBL_ENTRY _ZTV7ee77460[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77460[];
static VTBL_ENTRY alt_thunk_names274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74603fooEv,_ZTv0_n16_N6dd74603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603fooEv,_ZThn8_N6dd74603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74603barEv,_ZTv0_n12_N6dd74603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74603barEv,_ZThn8_N6dd74603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee774603fooEv,_ZTv0_n16_N7ee774603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee774603fooEv,_ZThn16_N7ee774603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee774603barEv,_ZTv0_n12_N7ee774603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee774603barEv,_ZThn16_N7ee774603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee774603fooEv,_ZTv0_n20_N7ee774603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee774603fooEv,_ZThn8_N7ee774603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee774603barEv,_ZTv0_n16_N7ee774603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee774603barEv,_ZThn8_N7ee774603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77460 = {  "ee77460", // class name
  bases_ee77460, 4,
  &(vtc_ee77460[0]), // expected_vtbl_contents
  &(vtt_ee77460[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77460),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77460),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77460),5, //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  cc560  : virtual bb60 {
  int c;
  virtual void  bar(); // _ZN5cc5603barEv
  ~cc560(); // tgen
  cc560(); // tgen
};
//SIG(-1 cc560) C1{ VBC2{ BC3{ Fi} v1 v2 Fi} v1 Fi}


void  cc560 ::bar(){vfunc_called(this, "_ZN5cc5603barEv");}
cc560 ::~cc560(){ note_dtor("cc560", this);} // tgen
cc560 ::cc560(){ note_ctor("cc560", this);} // tgen

static void Test_cc560()
{
  extern Class_Descriptor cd_cc560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc560, buf);
    cc560 *dp, &lv = *(dp=new (buf) cc560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,12), "cc560");
    check_base_class_offset(lv, (bb60*), ABISELECT(16,8), "cc560");
    check_field_offset(lv, c, ABISELECT(8,4), "cc560.c");
    test_class_info(&lv, &cd_cc560);
    dp->~cc560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc560(Test_cc560, "cc560", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc560C1Ev();
extern void _ZN5cc560D1Ev();
Name_Map name_map_cc560[] = {
  NSPAIR(_ZN5cc560C1Ev),
  NSPAIR(_ZN5cc560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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 _ZTI5cc560[];
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_cc560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV5cc560[];
static  VTT_ENTRY vtt_cc560[] = {
  {&(_ZTV5cc560[3]),  3,10},
  {&(_ZTV5cc560[8]),  8,10},
};
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static VTBL_ENTRY alt_thunk_names275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc560 = {  "cc560", // class name
  bases_cc560, 2,
  &(vtc_cc560[0]), // expected_vtbl_contents
  &(vtt_cc560[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc560),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc560),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names275,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0560  : cc560 {
  int d;
  ~dd0560(); // tgen
  dd0560(); // tgen
};
//SIG(-1 dd0560) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} Fi}


dd0560 ::~dd0560(){ note_dtor("dd0560", this);} // tgen
dd0560 ::dd0560(){ note_ctor("dd0560", this);} // tgen

static void Test_dd0560()
{
  extern Class_Descriptor cd_dd0560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0560, buf);
    dd0560 *dp, &lv = *(dp=new (buf) dd0560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd0560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(16,12), "dd0560");
    check_base_class_offset(lv, (cc560*), 0, "dd0560");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0560.d");
    test_class_info(&lv, &cd_dd0560);
    dp->~dd0560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0560(Test_dd0560, "dd0560", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0560C1Ev();
extern void _ZN6dd0560D1Ev();
Name_Map name_map_dd0560[] = {
  NSPAIR(_ZN6dd0560C1Ev),
  NSPAIR(_ZN6dd0560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd0560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0560[];
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd0560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd0560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd0560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd0560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd0560[] = {
  {&(_ZTV6dd0560[3]),  3,10},
  {&(_tg__ZTV5cc560__6dd0560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd0560[4]),  4,6},
  {&(_ZTV6dd0560[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static VTBL_ENTRY alt_thunk_names276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0560 = {  "dd0560", // class name
  bases_dd0560, 3,
  &(vtc_dd0560[0]), // expected_vtbl_contents
  &(vtt_dd0560[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0560),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0560),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names276,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00560  : dd0560 {
  int e;
  ~ee00560(); // tgen
  ee00560(); // tgen
};
//SIG(1 ee00560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee00560 ::~ee00560(){ note_dtor("ee00560", this);} // tgen
ee00560 ::ee00560(){ note_ctor("ee00560", this);} // tgen

static void Test_ee00560()
{
  extern Class_Descriptor cd_ee00560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00560, buf);
    ee00560 *dp, &lv = *(dp=new (buf) ee00560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee00560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(24,16), "ee00560");
    check_base_class_offset(lv, (cc560*)(dd0560*), 0, "ee00560");
    check_base_class_offset(lv, (dd0560*), 0, "ee00560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00560.e");
    test_class_info(&lv, &cd_ee00560);
    dp->~ee00560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00560(Test_ee00560, "ee00560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00560C1Ev();
extern void _ZN7ee00560D1Ev();
Name_Map name_map_ee00560[] = {
  NSPAIR(_ZN7ee00560C1Ev),
  NSPAIR(_ZN7ee00560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee00560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00560[];
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee00560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee00560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee00560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee00560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee00560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee00560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee00560[] = {
  {&(_ZTV7ee00560[3]),  3,10},
  {&(_tg__ZTV6dd0560__7ee00560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee00560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee00560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee00560[4]),  4,6},
  {&(_ZTV7ee00560[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee00560[];
extern  VTBL_ENTRY _ZTV7ee00560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00560[];
static VTBL_ENTRY alt_thunk_names277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00560 = {  "ee00560", // class name
  bases_ee00560, 4,
  &(vtc_ee00560[0]), // expected_vtbl_contents
  &(vtt_ee00560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00560),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00560),6, //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  ee10560  : virtual dd0560 {
  int e;
  ~ee10560(); // tgen
  ee10560(); // tgen
};
//SIG(1 ee10560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee10560 ::~ee10560(){ note_dtor("ee10560", this);} // tgen
ee10560 ::ee10560(){ note_ctor("ee10560", this);} // tgen

static void Test_ee10560()
{
  extern Class_Descriptor cd_ee10560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10560, buf);
    ee10560 *dp, &lv = *(dp=new (buf) ee10560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee10560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(32,20), "ee10560");
    check_base_class_offset(lv, (cc560*)(dd0560*), ABISELECT(16,8), "ee10560");
    check_base_class_offset(lv, (dd0560*), ABISELECT(16,8), "ee10560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10560.e");
    test_class_info(&lv, &cd_ee10560);
    dp->~ee10560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10560(Test_ee10560, "ee10560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10560C1Ev();
extern void _ZN7ee10560D1Ev();
Name_Map name_map_ee10560[] = {
  NSPAIR(_ZN7ee10560C1Ev),
  NSPAIR(_ZN7ee10560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee10560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10560[];
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee10560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10560[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee10560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee10560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee10560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee10560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee10560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee10560[] = {
  {&(_ZTV7ee10560[4]),  4,15},
  {&(_ZTV7ee10560[8]),  8,15},
  {&(_ZTV7ee10560[13]),  13,15},
  {&(_tg__ZTV6dd0560__7ee10560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee10560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee10560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee10560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10560[];
extern  VTBL_ENTRY _ZTV7ee10560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10560[];
static VTBL_ENTRY alt_thunk_names278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10560 = {  "ee10560", // class name
  bases_ee10560, 4,
  &(vtc_ee10560[0]), // expected_vtbl_contents
  &(vtt_ee10560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10560),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names278,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20560  : dd0560 {
  int e;
  virtual void  foo(); // _ZN7ee205603fooEv
  ~ee20560(); // tgen
  ee20560(); // tgen
};
//SIG(1 ee20560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee20560 ::foo(){vfunc_called(this, "_ZN7ee205603fooEv");}
ee20560 ::~ee20560(){ note_dtor("ee20560", this);} // tgen
ee20560 ::ee20560(){ note_ctor("ee20560", this);} // tgen

static void Test_ee20560()
{
  extern Class_Descriptor cd_ee20560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20560, buf);
    ee20560 *dp, &lv = *(dp=new (buf) ee20560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee20560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(24,16), "ee20560");
    check_base_class_offset(lv, (cc560*)(dd0560*), 0, "ee20560");
    check_base_class_offset(lv, (dd0560*), 0, "ee20560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20560.e");
    test_class_info(&lv, &cd_ee20560);
    dp->~ee20560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20560(Test_ee20560, "ee20560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20560C1Ev();
extern void _ZN7ee20560D1Ev();
Name_Map name_map_ee20560[] = {
  NSPAIR(_ZN7ee20560C1Ev),
  NSPAIR(_ZN7ee20560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee20560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20560[];
extern void _ZN5cc5603barEv();
extern void _ZN7ee205603fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee205603fooEv,_ZTv0_n16_N7ee205603fooEv)();
extern void ABISELECT(_ZThn24_N7ee205603fooEv,_ZThn16_N7ee205603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN7ee205603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee205603fooEv,_ZTv0_n16_N7ee205603fooEv),
};
extern VTBL_ENTRY _ZTV7ee20560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee20560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee20560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee20560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee20560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee20560[] = {
  {&(_ZTV7ee20560[3]),  3,11},
  {&(_tg__ZTV6dd0560__7ee20560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee20560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee20560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee20560[4]),  4,6},
  {&(_ZTV7ee20560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee20560[];
extern  VTBL_ENTRY _ZTV7ee20560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20560[];
static VTBL_ENTRY alt_thunk_names279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee205603fooEv,_ZTv0_n16_N7ee205603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee205603fooEv,_ZThn16_N7ee205603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20560 = {  "ee20560", // class name
  bases_ee20560, 4,
  &(vtc_ee20560[0]), // expected_vtbl_contents
  &(vtt_ee20560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names279,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30560  : virtual dd0560 {
  int e;
  virtual void  foo(); // _ZN7ee305603fooEv
  ~ee30560(); // tgen
  ee30560(); // tgen
};
//SIG(1 ee30560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee30560 ::foo(){vfunc_called(this, "_ZN7ee305603fooEv");}
ee30560 ::~ee30560(){ note_dtor("ee30560", this);} // tgen
ee30560 ::ee30560(){ note_ctor("ee30560", this);} // tgen

static void Test_ee30560()
{
  extern Class_Descriptor cd_ee30560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30560, buf);
    ee30560 *dp, &lv = *(dp=new (buf) ee30560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee30560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(32,20), "ee30560");
    check_base_class_offset(lv, (cc560*)(dd0560*), ABISELECT(16,8), "ee30560");
    check_base_class_offset(lv, (dd0560*), ABISELECT(16,8), "ee30560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30560.e");
    test_class_info(&lv, &cd_ee30560);
    dp->~ee30560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30560(Test_ee30560, "ee30560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30560C1Ev();
extern void _ZN7ee30560D1Ev();
Name_Map name_map_ee30560[] = {
  NSPAIR(_ZN7ee30560C1Ev),
  NSPAIR(_ZN7ee30560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee30560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30560[];
extern void _ZN7ee305603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee305603fooEv,_ZTv0_n16_N7ee305603fooEv)();
extern void ABISELECT(_ZThn32_N7ee305603fooEv,_ZThn20_N7ee305603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30560[0]),
  (VTBL_ENTRY)&_ZN7ee305603fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee305603fooEv,_ZTv0_n16_N7ee305603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee30560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee30560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee30560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee30560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee30560[] = {
  {&(_ZTV7ee30560[4]),  4,16},
  {&(_ZTV7ee30560[9]),  9,16},
  {&(_ZTV7ee30560[14]),  14,16},
  {&(_tg__ZTV6dd0560__7ee30560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee30560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee30560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee30560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30560[];
extern  VTBL_ENTRY _ZTV7ee30560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30560[];
static VTBL_ENTRY alt_thunk_names280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee305603fooEv,_ZTv0_n16_N7ee305603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee305603fooEv,_ZThn20_N7ee305603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30560 = {  "ee30560", // class name
  bases_ee30560, 4,
  &(vtc_ee30560[0]), // expected_vtbl_contents
  &(vtt_ee30560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names280,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40560  : dd0560 {
  int e;
  virtual void  bar(); // _ZN7ee405603barEv
  ~ee40560(); // tgen
  ee40560(); // tgen
};
//SIG(1 ee40560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee40560 ::bar(){vfunc_called(this, "_ZN7ee405603barEv");}
ee40560 ::~ee40560(){ note_dtor("ee40560", this);} // tgen
ee40560 ::ee40560(){ note_ctor("ee40560", this);} // tgen

static void Test_ee40560()
{
  extern Class_Descriptor cd_ee40560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40560, buf);
    ee40560 *dp, &lv = *(dp=new (buf) ee40560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee40560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(24,16), "ee40560");
    check_base_class_offset(lv, (cc560*)(dd0560*), 0, "ee40560");
    check_base_class_offset(lv, (dd0560*), 0, "ee40560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40560.e");
    test_class_info(&lv, &cd_ee40560);
    dp->~ee40560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40560(Test_ee40560, "ee40560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40560C1Ev();
extern void _ZN7ee40560D1Ev();
Name_Map name_map_ee40560[] = {
  NSPAIR(_ZN7ee40560C1Ev),
  NSPAIR(_ZN7ee40560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee40560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40560[];
extern void _ZN7ee405603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee405603barEv,_ZTv0_n12_N7ee405603barEv)();
extern void ABISELECT(_ZThn24_N7ee405603barEv,_ZThn16_N7ee405603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee40560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40560[0]),
  (VTBL_ENTRY)&_ZN7ee405603barEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee405603barEv,_ZTv0_n12_N7ee405603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee40560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee40560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee40560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee40560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee40560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee40560[] = {
  {&(_ZTV7ee40560[3]),  3,10},
  {&(_tg__ZTV6dd0560__7ee40560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee40560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee40560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee40560[4]),  4,6},
  {&(_ZTV7ee40560[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee40560[];
extern  VTBL_ENTRY _ZTV7ee40560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40560[];
static VTBL_ENTRY alt_thunk_names281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee405603barEv,_ZTv0_n12_N7ee405603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee405603barEv,_ZThn16_N7ee405603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40560 = {  "ee40560", // class name
  bases_ee40560, 4,
  &(vtc_ee40560[0]), // expected_vtbl_contents
  &(vtt_ee40560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40560),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names281,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50560  : virtual dd0560 {
  int e;
  virtual void  bar(); // _ZN7ee505603barEv
  ~ee50560(); // tgen
  ee50560(); // tgen
};
//SIG(1 ee50560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee50560 ::bar(){vfunc_called(this, "_ZN7ee505603barEv");}
ee50560 ::~ee50560(){ note_dtor("ee50560", this);} // tgen
ee50560 ::ee50560(){ note_ctor("ee50560", this);} // tgen

static void Test_ee50560()
{
  extern Class_Descriptor cd_ee50560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50560, buf);
    ee50560 *dp, &lv = *(dp=new (buf) ee50560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee50560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(32,20), "ee50560");
    check_base_class_offset(lv, (cc560*)(dd0560*), ABISELECT(16,8), "ee50560");
    check_base_class_offset(lv, (dd0560*), ABISELECT(16,8), "ee50560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50560.e");
    test_class_info(&lv, &cd_ee50560);
    dp->~ee50560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50560(Test_ee50560, "ee50560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50560C1Ev();
extern void _ZN7ee50560D1Ev();
Name_Map name_map_ee50560[] = {
  NSPAIR(_ZN7ee50560C1Ev),
  NSPAIR(_ZN7ee50560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee50560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50560[];
extern void _ZN7ee505603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee505603barEv,_ZTv0_n16_N7ee505603barEv)();
extern void ABISELECT(_ZThn16_N7ee505603barEv,_ZThn8_N7ee505603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee505603barEv,_ZTv0_n12_N7ee505603barEv)();
extern void ABISELECT(_ZThn32_N7ee505603barEv,_ZThn20_N7ee505603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee50560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50560[0]),
  (VTBL_ENTRY)&_ZN7ee505603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee505603barEv,_ZTv0_n16_N7ee505603barEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee505603barEv,_ZTv0_n12_N7ee505603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee50560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee50560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee50560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee50560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee50560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee50560[] = {
  {&(_ZTV7ee50560[4]),  4,16},
  {&(_ZTV7ee50560[9]),  9,16},
  {&(_ZTV7ee50560[14]),  14,16},
  {&(_tg__ZTV6dd0560__7ee50560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee50560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee50560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee50560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50560[];
extern  VTBL_ENTRY _ZTV7ee50560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50560[];
static VTBL_ENTRY alt_thunk_names282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee505603barEv,_ZTv0_n12_N7ee505603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee505603barEv,_ZThn20_N7ee505603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee505603barEv,_ZTv0_n16_N7ee505603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee505603barEv,_ZThn8_N7ee505603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50560 = {  "ee50560", // class name
  bases_ee50560, 4,
  &(vtc_ee50560[0]), // expected_vtbl_contents
  &(vtt_ee50560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names282,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60560  : dd0560 {
  int e;
  virtual void  foo(); // _ZN7ee605603fooEv
  virtual void  bar(); // _ZN7ee605603barEv
  ~ee60560(); // tgen
  ee60560(); // tgen
};
//SIG(1 ee60560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee60560 ::foo(){vfunc_called(this, "_ZN7ee605603fooEv");}
void  ee60560 ::bar(){vfunc_called(this, "_ZN7ee605603barEv");}
ee60560 ::~ee60560(){ note_dtor("ee60560", this);} // tgen
ee60560 ::ee60560(){ note_ctor("ee60560", this);} // tgen

static void Test_ee60560()
{
  extern Class_Descriptor cd_ee60560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60560, buf);
    ee60560 *dp, &lv = *(dp=new (buf) ee60560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee60560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(24,16), "ee60560");
    check_base_class_offset(lv, (cc560*)(dd0560*), 0, "ee60560");
    check_base_class_offset(lv, (dd0560*), 0, "ee60560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60560.e");
    test_class_info(&lv, &cd_ee60560);
    dp->~ee60560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60560(Test_ee60560, "ee60560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60560C1Ev();
extern void _ZN7ee60560D1Ev();
Name_Map name_map_ee60560[] = {
  NSPAIR(_ZN7ee60560C1Ev),
  NSPAIR(_ZN7ee60560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee60560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60560[];
extern void _ZN7ee605603barEv();
extern void _ZN7ee605603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee605603barEv,_ZTv0_n12_N7ee605603barEv)();
extern void ABISELECT(_ZThn24_N7ee605603barEv,_ZThn16_N7ee605603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee605603fooEv,_ZTv0_n16_N7ee605603fooEv)();
extern void ABISELECT(_ZThn24_N7ee605603fooEv,_ZThn16_N7ee605603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60560[0]),
  (VTBL_ENTRY)&_ZN7ee605603barEv,
  (VTBL_ENTRY)&_ZN7ee605603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee605603barEv,_ZTv0_n12_N7ee605603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee605603fooEv,_ZTv0_n16_N7ee605603fooEv),
};
extern VTBL_ENTRY _ZTV7ee60560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee60560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee60560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee60560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee60560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee60560[] = {
  {&(_ZTV7ee60560[3]),  3,11},
  {&(_tg__ZTV6dd0560__7ee60560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee60560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee60560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee60560[4]),  4,6},
  {&(_ZTV7ee60560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60560[];
extern  VTBL_ENTRY _ZTV7ee60560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60560[];
static VTBL_ENTRY alt_thunk_names283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee605603fooEv,_ZTv0_n16_N7ee605603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee605603fooEv,_ZThn16_N7ee605603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee605603barEv,_ZTv0_n12_N7ee605603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee605603barEv,_ZThn16_N7ee605603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60560 = {  "ee60560", // class name
  bases_ee60560, 4,
  &(vtc_ee60560[0]), // expected_vtbl_contents
  &(vtt_ee60560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60560),6, //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  ee70560  : virtual dd0560 {
  int e;
  virtual void  foo(); // _ZN7ee705603fooEv
  virtual void  bar(); // _ZN7ee705603barEv
  ~ee70560(); // tgen
  ee70560(); // tgen
};
//SIG(1 ee70560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee70560 ::foo(){vfunc_called(this, "_ZN7ee705603fooEv");}
void  ee70560 ::bar(){vfunc_called(this, "_ZN7ee705603barEv");}
ee70560 ::~ee70560(){ note_dtor("ee70560", this);} // tgen
ee70560 ::ee70560(){ note_ctor("ee70560", this);} // tgen

static void Test_ee70560()
{
  extern Class_Descriptor cd_ee70560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70560, buf);
    ee70560 *dp, &lv = *(dp=new (buf) ee70560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee70560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd0560*), ABISELECT(32,20), "ee70560");
    check_base_class_offset(lv, (cc560*)(dd0560*), ABISELECT(16,8), "ee70560");
    check_base_class_offset(lv, (dd0560*), ABISELECT(16,8), "ee70560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70560.e");
    test_class_info(&lv, &cd_ee70560);
    dp->~ee70560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70560(Test_ee70560, "ee70560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70560C1Ev();
extern void _ZN7ee70560D1Ev();
Name_Map name_map_ee70560[] = {
  NSPAIR(_ZN7ee70560C1Ev),
  NSPAIR(_ZN7ee70560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd0560;
extern VTBL_ENTRY _ZTI6dd0560[];
extern  VTBL_ENTRY _ZTV6dd0560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0560[];
static Base_Class bases_ee70560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70560[];
extern void _ZN7ee705603fooEv();
extern void _ZN7ee705603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee705603barEv,_ZTv0_n16_N7ee705603barEv)();
extern void ABISELECT(_ZThn16_N7ee705603barEv,_ZThn8_N7ee705603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee705603barEv,_ZTv0_n12_N7ee705603barEv)();
extern void ABISELECT(_ZThn32_N7ee705603barEv,_ZThn20_N7ee705603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee705603fooEv,_ZTv0_n16_N7ee705603fooEv)();
extern void ABISELECT(_ZThn32_N7ee705603fooEv,_ZThn20_N7ee705603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70560[0]),
  (VTBL_ENTRY)&_ZN7ee705603fooEv,
  (VTBL_ENTRY)&_ZN7ee705603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee705603barEv,_ZTv0_n16_N7ee705603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee705603barEv,_ZTv0_n12_N7ee705603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee705603fooEv,_ZTv0_n16_N7ee705603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0560__7ee70560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd0560__7ee70560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd0560__7ee70560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0560__7ee70560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee70560[] = {
  {&(_ZTV7ee70560[4]),  4,17},
  {&(_ZTV7ee70560[10]),  10,17},
  {&(_ZTV7ee70560[15]),  15,17},
  {&(_tg__ZTV6dd0560__7ee70560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd0560__7ee70560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd0560__7ee70560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0560__7ee70560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70560[];
extern  VTBL_ENTRY _ZTV7ee70560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70560[];
static VTBL_ENTRY alt_thunk_names284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee705603fooEv,_ZTv0_n16_N7ee705603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee705603fooEv,_ZThn20_N7ee705603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee705603barEv,_ZTv0_n12_N7ee705603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee705603barEv,_ZThn20_N7ee705603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee705603barEv,_ZTv0_n16_N7ee705603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee705603barEv,_ZThn8_N7ee705603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70560 = {  "ee70560", // class name
  bases_ee70560, 4,
  &(vtc_ee70560[0]), // expected_vtbl_contents
  &(vtt_ee70560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70560),7, //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  dd1560  : virtual cc560 {
  int d;
  ~dd1560(); // tgen
  dd1560(); // tgen
};
//SIG(-1 dd1560) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} Fi}


dd1560 ::~dd1560(){ note_dtor("dd1560", this);} // tgen
dd1560 ::dd1560(){ note_ctor("dd1560", this);} // tgen

static void Test_dd1560()
{
  extern Class_Descriptor cd_dd1560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1560, buf);
    dd1560 *dp, &lv = *(dp=new (buf) dd1560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd1560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,16), "dd1560");
    check_base_class_offset(lv, (cc560*), ABISELECT(16,8), "dd1560");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1560.d");
    test_class_info(&lv, &cd_dd1560);
    dp->~dd1560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1560(Test_dd1560, "dd1560", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1560C1Ev();
extern void _ZN6dd1560D1Ev();
Name_Map name_map_dd1560[] = {
  NSPAIR(_ZN6dd1560C1Ev),
  NSPAIR(_ZN6dd1560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd1560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1560[];
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd1560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd1560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd1560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd1560[] = {
  {&(_ZTV6dd1560[4]),  4,15},
  {&(_ZTV6dd1560[8]),  8,15},
  {&(_ZTV6dd1560[13]),  13,15},
  {&(_tg__ZTV5cc560__6dd1560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd1560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static VTBL_ENTRY alt_thunk_names285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1560 = {  "dd1560", // class name
  bases_dd1560, 3,
  &(vtc_dd1560[0]), // expected_vtbl_contents
  &(vtt_dd1560[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1560),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1560),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names285,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01560  : dd1560 {
  int e;
  ~ee01560(); // tgen
  ee01560(); // tgen
};
//SIG(1 ee01560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee01560 ::~ee01560(){ note_dtor("ee01560", this);} // tgen
ee01560 ::ee01560(){ note_ctor("ee01560", this);} // tgen

static void Test_ee01560()
{
  extern Class_Descriptor cd_ee01560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01560, buf);
    ee01560 *dp, &lv = *(dp=new (buf) ee01560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee01560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee01560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(16,12), "ee01560");
    check_base_class_offset(lv, (dd1560*), 0, "ee01560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01560.e");
    test_class_info(&lv, &cd_ee01560);
    dp->~ee01560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01560(Test_ee01560, "ee01560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01560C1Ev();
extern void _ZN7ee01560D1Ev();
Name_Map name_map_ee01560[] = {
  NSPAIR(_ZN7ee01560C1Ev),
  NSPAIR(_ZN7ee01560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee01560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01560[];
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee01560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01560[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee01560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee01560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee01560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee01560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee01560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee01560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee01560[] = {
  {&(_ZTV7ee01560[4]),  4,15},
  {&(_tg__ZTV6dd1560__7ee01560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee01560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee01560[4]),  4,6},
  {&(_ZTV7ee01560[8]),  8,15},
  {&(_ZTV7ee01560[13]),  13,15},
  {&(_tg__ZTV5cc560__7ee01560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee01560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01560[];
extern  VTBL_ENTRY _ZTV7ee01560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01560[];
static VTBL_ENTRY alt_thunk_names286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01560 = {  "ee01560", // class name
  bases_ee01560, 4,
  &(vtc_ee01560[0]), // expected_vtbl_contents
  &(vtt_ee01560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01560),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01560),8, //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  ee11560  : virtual dd1560 {
  int e;
  ~ee11560(); // tgen
  ee11560(); // tgen
};
//SIG(1 ee11560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee11560 ::~ee11560(){ note_dtor("ee11560", this);} // tgen
ee11560 ::ee11560(){ note_ctor("ee11560", this);} // tgen

static void Test_ee11560()
{
  extern Class_Descriptor cd_ee11560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11560, buf);
    ee11560 *dp, &lv = *(dp=new (buf) ee11560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee11560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee11560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(32,16), "ee11560");
    check_base_class_offset(lv, (dd1560*), ABISELECT(16,8), "ee11560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11560.e");
    test_class_info(&lv, &cd_ee11560);
    dp->~ee11560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11560(Test_ee11560, "ee11560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11560C1Ev();
extern void _ZN7ee11560D1Ev();
Name_Map name_map_ee11560[] = {
  NSPAIR(_ZN7ee11560C1Ev),
  NSPAIR(_ZN7ee11560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee11560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11560[];
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee11560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11560[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11560[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee11560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee11560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee11560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee11560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee11560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee11560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee11560[] = {
  {&(_ZTV7ee11560[5]),  5,20},
  {&(_ZTV7ee11560[9]),  9,20},
  {&(_ZTV7ee11560[13]),  13,20},
  {&(_ZTV7ee11560[18]),  18,20},
  {&(_tg__ZTV6dd1560__7ee11560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee11560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee11560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee11560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee11560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11560[];
extern  VTBL_ENTRY _ZTV7ee11560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11560[];
static VTBL_ENTRY alt_thunk_names287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11560 = {  "ee11560", // class name
  bases_ee11560, 4,
  &(vtc_ee11560[0]), // expected_vtbl_contents
  &(vtt_ee11560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11560),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11560),9, //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  ee21560  : dd1560 {
  int e;
  virtual void  foo(); // _ZN7ee215603fooEv
  ~ee21560(); // tgen
  ee21560(); // tgen
};
//SIG(1 ee21560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee21560 ::foo(){vfunc_called(this, "_ZN7ee215603fooEv");}
ee21560 ::~ee21560(){ note_dtor("ee21560", this);} // tgen
ee21560 ::ee21560(){ note_ctor("ee21560", this);} // tgen

static void Test_ee21560()
{
  extern Class_Descriptor cd_ee21560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21560, buf);
    ee21560 *dp, &lv = *(dp=new (buf) ee21560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee21560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee21560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(16,12), "ee21560");
    check_base_class_offset(lv, (dd1560*), 0, "ee21560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21560.e");
    test_class_info(&lv, &cd_ee21560);
    dp->~ee21560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21560(Test_ee21560, "ee21560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21560C1Ev();
extern void _ZN7ee21560D1Ev();
Name_Map name_map_ee21560[] = {
  NSPAIR(_ZN7ee21560C1Ev),
  NSPAIR(_ZN7ee21560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee21560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21560[];
extern void _ZN7ee215603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee215603fooEv,_ZTv0_n16_N7ee215603fooEv)();
extern void ABISELECT(_ZThn32_N7ee215603fooEv,_ZThn20_N7ee215603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21560[0]),
  (VTBL_ENTRY)&_ZN7ee215603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee215603fooEv,_ZTv0_n16_N7ee215603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee21560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee21560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee21560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee21560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee21560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee21560[] = {
  {&(_ZTV7ee21560[4]),  4,16},
  {&(_tg__ZTV6dd1560__7ee21560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee21560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee21560[4]),  4,6},
  {&(_ZTV7ee21560[9]),  9,16},
  {&(_ZTV7ee21560[14]),  14,16},
  {&(_tg__ZTV5cc560__7ee21560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee21560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21560[];
extern  VTBL_ENTRY _ZTV7ee21560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21560[];
static VTBL_ENTRY alt_thunk_names288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee215603fooEv,_ZTv0_n16_N7ee215603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee215603fooEv,_ZThn20_N7ee215603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21560 = {  "ee21560", // class name
  bases_ee21560, 4,
  &(vtc_ee21560[0]), // expected_vtbl_contents
  &(vtt_ee21560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names288,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31560  : virtual dd1560 {
  int e;
  virtual void  foo(); // _ZN7ee315603fooEv
  ~ee31560(); // tgen
  ee31560(); // tgen
};
//SIG(1 ee31560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee31560 ::foo(){vfunc_called(this, "_ZN7ee315603fooEv");}
ee31560 ::~ee31560(){ note_dtor("ee31560", this);} // tgen
ee31560 ::ee31560(){ note_ctor("ee31560", this);} // tgen

static void Test_ee31560()
{
  extern Class_Descriptor cd_ee31560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31560, buf);
    ee31560 *dp, &lv = *(dp=new (buf) ee31560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee31560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee31560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(32,16), "ee31560");
    check_base_class_offset(lv, (dd1560*), ABISELECT(16,8), "ee31560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31560.e");
    test_class_info(&lv, &cd_ee31560);
    dp->~ee31560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31560(Test_ee31560, "ee31560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31560C1Ev();
extern void _ZN7ee31560D1Ev();
Name_Map name_map_ee31560[] = {
  NSPAIR(_ZN7ee31560C1Ev),
  NSPAIR(_ZN7ee31560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee31560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31560[];
extern void _ZN7ee315603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee315603fooEv,_ZTv0_n16_N7ee315603fooEv)();
extern void ABISELECT(_ZThn48_N7ee315603fooEv,_ZThn24_N7ee315603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31560[0]),
  (VTBL_ENTRY)&_ZN7ee315603fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31560[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee315603fooEv,_ZTv0_n16_N7ee315603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee31560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee31560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee31560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee31560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee31560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee31560[] = {
  {&(_ZTV7ee31560[5]),  5,21},
  {&(_ZTV7ee31560[10]),  10,21},
  {&(_ZTV7ee31560[14]),  14,21},
  {&(_ZTV7ee31560[19]),  19,21},
  {&(_tg__ZTV6dd1560__7ee31560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee31560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee31560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee31560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee31560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31560[];
extern  VTBL_ENTRY _ZTV7ee31560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31560[];
static VTBL_ENTRY alt_thunk_names289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee315603fooEv,_ZTv0_n16_N7ee315603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee315603fooEv,_ZThn24_N7ee315603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31560 = {  "ee31560", // class name
  bases_ee31560, 4,
  &(vtc_ee31560[0]), // expected_vtbl_contents
  &(vtt_ee31560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31560),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names289,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41560  : dd1560 {
  int e;
  virtual void  bar(); // _ZN7ee415603barEv
  ~ee41560(); // tgen
  ee41560(); // tgen
};
//SIG(1 ee41560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee41560 ::bar(){vfunc_called(this, "_ZN7ee415603barEv");}
ee41560 ::~ee41560(){ note_dtor("ee41560", this);} // tgen
ee41560 ::ee41560(){ note_ctor("ee41560", this);} // tgen

static void Test_ee41560()
{
  extern Class_Descriptor cd_ee41560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41560, buf);
    ee41560 *dp, &lv = *(dp=new (buf) ee41560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee41560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee41560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(16,12), "ee41560");
    check_base_class_offset(lv, (dd1560*), 0, "ee41560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41560.e");
    test_class_info(&lv, &cd_ee41560);
    dp->~ee41560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41560(Test_ee41560, "ee41560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41560C1Ev();
extern void _ZN7ee41560D1Ev();
Name_Map name_map_ee41560[] = {
  NSPAIR(_ZN7ee41560C1Ev),
  NSPAIR(_ZN7ee41560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee41560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41560[];
extern void _ZN7ee415603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee415603barEv,_ZTv0_n16_N7ee415603barEv)();
extern void ABISELECT(_ZThn16_N7ee415603barEv,_ZThn12_N7ee415603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee415603barEv,_ZTv0_n12_N7ee415603barEv)();
extern void ABISELECT(_ZThn32_N7ee415603barEv,_ZThn20_N7ee415603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee41560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41560[0]),
  (VTBL_ENTRY)&_ZN7ee415603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee415603barEv,_ZTv0_n16_N7ee415603barEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee415603barEv,_ZTv0_n12_N7ee415603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee41560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee41560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee41560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee41560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee41560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee41560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee41560[] = {
  {&(_ZTV7ee41560[4]),  4,16},
  {&(_tg__ZTV6dd1560__7ee41560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee41560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee41560[4]),  4,6},
  {&(_ZTV7ee41560[9]),  9,16},
  {&(_ZTV7ee41560[14]),  14,16},
  {&(_tg__ZTV5cc560__7ee41560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee41560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41560[];
extern  VTBL_ENTRY _ZTV7ee41560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41560[];
static VTBL_ENTRY alt_thunk_names290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee415603barEv,_ZTv0_n12_N7ee415603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee415603barEv,_ZThn20_N7ee415603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee415603barEv,_ZTv0_n16_N7ee415603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee415603barEv,_ZThn12_N7ee415603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41560 = {  "ee41560", // class name
  bases_ee41560, 4,
  &(vtc_ee41560[0]), // expected_vtbl_contents
  &(vtt_ee41560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names290,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51560  : virtual dd1560 {
  int e;
  virtual void  bar(); // _ZN7ee515603barEv
  ~ee51560(); // tgen
  ee51560(); // tgen
};
//SIG(1 ee51560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee51560 ::bar(){vfunc_called(this, "_ZN7ee515603barEv");}
ee51560 ::~ee51560(){ note_dtor("ee51560", this);} // tgen
ee51560 ::ee51560(){ note_ctor("ee51560", this);} // tgen

static void Test_ee51560()
{
  extern Class_Descriptor cd_ee51560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51560, buf);
    ee51560 *dp, &lv = *(dp=new (buf) ee51560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee51560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee51560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(32,16), "ee51560");
    check_base_class_offset(lv, (dd1560*), ABISELECT(16,8), "ee51560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51560.e");
    test_class_info(&lv, &cd_ee51560);
    dp->~ee51560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51560(Test_ee51560, "ee51560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51560C1Ev();
extern void _ZN7ee51560D1Ev();
Name_Map name_map_ee51560[] = {
  NSPAIR(_ZN7ee51560C1Ev),
  NSPAIR(_ZN7ee51560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee51560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51560[];
extern void _ZN7ee515603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee515603barEv,_ZTv0_n16_N7ee515603barEv)();
extern void ABISELECT(_ZThn32_N7ee515603barEv,_ZThn16_N7ee515603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee515603barEv,_ZTv0_n12_N7ee515603barEv)();
extern void ABISELECT(_ZThn48_N7ee515603barEv,_ZThn24_N7ee515603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee51560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51560[0]),
  (VTBL_ENTRY)&_ZN7ee515603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51560[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee515603barEv,_ZTv0_n16_N7ee515603barEv),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee515603barEv,_ZTv0_n12_N7ee515603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee51560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee51560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee51560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee51560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee51560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee51560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee51560[] = {
  {&(_ZTV7ee51560[5]),  5,21},
  {&(_ZTV7ee51560[10]),  10,21},
  {&(_ZTV7ee51560[14]),  14,21},
  {&(_ZTV7ee51560[19]),  19,21},
  {&(_tg__ZTV6dd1560__7ee51560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee51560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee51560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee51560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee51560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51560[];
extern  VTBL_ENTRY _ZTV7ee51560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51560[];
static VTBL_ENTRY alt_thunk_names291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee515603barEv,_ZTv0_n12_N7ee515603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee515603barEv,_ZThn24_N7ee515603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee515603barEv,_ZTv0_n16_N7ee515603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee515603barEv,_ZThn16_N7ee515603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51560 = {  "ee51560", // class name
  bases_ee51560, 4,
  &(vtc_ee51560[0]), // expected_vtbl_contents
  &(vtt_ee51560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51560),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names291,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61560  : dd1560 {
  int e;
  virtual void  foo(); // _ZN7ee615603fooEv
  virtual void  bar(); // _ZN7ee615603barEv
  ~ee61560(); // tgen
  ee61560(); // tgen
};
//SIG(1 ee61560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee61560 ::foo(){vfunc_called(this, "_ZN7ee615603fooEv");}
void  ee61560 ::bar(){vfunc_called(this, "_ZN7ee615603barEv");}
ee61560 ::~ee61560(){ note_dtor("ee61560", this);} // tgen
ee61560 ::ee61560(){ note_ctor("ee61560", this);} // tgen

static void Test_ee61560()
{
  extern Class_Descriptor cd_ee61560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61560, buf);
    ee61560 *dp, &lv = *(dp=new (buf) ee61560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee61560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee61560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(16,12), "ee61560");
    check_base_class_offset(lv, (dd1560*), 0, "ee61560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61560.e");
    test_class_info(&lv, &cd_ee61560);
    dp->~ee61560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61560(Test_ee61560, "ee61560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61560C1Ev();
extern void _ZN7ee61560D1Ev();
Name_Map name_map_ee61560[] = {
  NSPAIR(_ZN7ee61560C1Ev),
  NSPAIR(_ZN7ee61560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee61560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61560[];
extern void _ZN7ee615603fooEv();
extern void _ZN7ee615603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee615603barEv,_ZTv0_n16_N7ee615603barEv)();
extern void ABISELECT(_ZThn16_N7ee615603barEv,_ZThn12_N7ee615603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee615603barEv,_ZTv0_n12_N7ee615603barEv)();
extern void ABISELECT(_ZThn32_N7ee615603barEv,_ZThn20_N7ee615603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee615603fooEv,_ZTv0_n16_N7ee615603fooEv)();
extern void ABISELECT(_ZThn32_N7ee615603fooEv,_ZThn20_N7ee615603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61560[0]),
  (VTBL_ENTRY)&_ZN7ee615603fooEv,
  (VTBL_ENTRY)&_ZN7ee615603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee615603barEv,_ZTv0_n16_N7ee615603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee615603barEv,_ZTv0_n12_N7ee615603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee615603fooEv,_ZTv0_n16_N7ee615603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee61560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee61560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee61560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee61560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee61560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee61560[] = {
  {&(_ZTV7ee61560[4]),  4,17},
  {&(_tg__ZTV6dd1560__7ee61560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee61560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee61560[4]),  4,6},
  {&(_ZTV7ee61560[10]),  10,17},
  {&(_ZTV7ee61560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee61560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee61560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61560[];
extern  VTBL_ENTRY _ZTV7ee61560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61560[];
static VTBL_ENTRY alt_thunk_names292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee615603fooEv,_ZTv0_n16_N7ee615603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee615603fooEv,_ZThn20_N7ee615603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee615603barEv,_ZTv0_n12_N7ee615603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee615603barEv,_ZThn20_N7ee615603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee615603barEv,_ZTv0_n16_N7ee615603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee615603barEv,_ZThn12_N7ee615603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61560 = {  "ee61560", // class name
  bases_ee61560, 4,
  &(vtc_ee61560[0]), // expected_vtbl_contents
  &(vtt_ee61560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names292,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71560  : virtual dd1560 {
  int e;
  virtual void  foo(); // _ZN7ee715603fooEv
  virtual void  bar(); // _ZN7ee715603barEv
  ~ee71560(); // tgen
  ee71560(); // tgen
};
//SIG(1 ee71560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee71560 ::foo(){vfunc_called(this, "_ZN7ee715603fooEv");}
void  ee71560 ::bar(){vfunc_called(this, "_ZN7ee715603barEv");}
ee71560 ::~ee71560(){ note_dtor("ee71560", this);} // tgen
ee71560 ::ee71560(){ note_ctor("ee71560", this);} // tgen

static void Test_ee71560()
{
  extern Class_Descriptor cd_ee71560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71560, buf);
    ee71560 *dp, &lv = *(dp=new (buf) ee71560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee71560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee71560");
    check_base_class_offset(lv, (cc560*)(dd1560*), ABISELECT(32,16), "ee71560");
    check_base_class_offset(lv, (dd1560*), ABISELECT(16,8), "ee71560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71560.e");
    test_class_info(&lv, &cd_ee71560);
    dp->~ee71560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71560(Test_ee71560, "ee71560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71560C1Ev();
extern void _ZN7ee71560D1Ev();
Name_Map name_map_ee71560[] = {
  NSPAIR(_ZN7ee71560C1Ev),
  NSPAIR(_ZN7ee71560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd1560;
extern VTBL_ENTRY _ZTI6dd1560[];
extern  VTBL_ENTRY _ZTV6dd1560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1560[];
static Base_Class bases_ee71560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee71560[];
extern void _ZN7ee715603fooEv();
extern void _ZN7ee715603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee715603barEv,_ZTv0_n16_N7ee715603barEv)();
extern void ABISELECT(_ZThn32_N7ee715603barEv,_ZThn16_N7ee715603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee715603barEv,_ZTv0_n12_N7ee715603barEv)();
extern void ABISELECT(_ZThn48_N7ee715603barEv,_ZThn24_N7ee715603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee715603fooEv,_ZTv0_n16_N7ee715603fooEv)();
extern void ABISELECT(_ZThn48_N7ee715603fooEv,_ZThn24_N7ee715603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71560[0]),
  (VTBL_ENTRY)&_ZN7ee715603fooEv,
  (VTBL_ENTRY)&_ZN7ee715603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71560[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee715603barEv,_ZTv0_n16_N7ee715603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee715603barEv,_ZTv0_n12_N7ee715603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee715603fooEv,_ZTv0_n16_N7ee715603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71560[];
static  VTBL_ENTRY _tg__ZTV6dd1560__7ee71560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd1560__7ee71560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1560__7ee71560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee71560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee71560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee71560[] = {
  {&(_ZTV7ee71560[5]),  5,22},
  {&(_ZTV7ee71560[11]),  11,22},
  {&(_ZTV7ee71560[15]),  15,22},
  {&(_ZTV7ee71560[20]),  20,22},
  {&(_tg__ZTV6dd1560__7ee71560[4]),  4,4},
  {&(_tg__ZTV5cc560__6dd1560__7ee71560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd1560__7ee71560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee71560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee71560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71560[];
extern  VTBL_ENTRY _ZTV7ee71560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71560[];
static VTBL_ENTRY alt_thunk_names293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee715603fooEv,_ZTv0_n16_N7ee715603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee715603fooEv,_ZThn24_N7ee715603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee715603barEv,_ZTv0_n12_N7ee715603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee715603barEv,_ZThn24_N7ee715603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee715603barEv,_ZTv0_n16_N7ee715603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee715603barEv,_ZThn16_N7ee715603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71560 = {  "ee71560", // class name
  bases_ee71560, 4,
  &(vtc_ee71560[0]), // expected_vtbl_contents
  &(vtt_ee71560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71560),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names293,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2560  : cc560 {
  int d;
  virtual void  foo(); // _ZN6dd25603fooEv
  ~dd2560(); // tgen
  dd2560(); // tgen
};
//SIG(-1 dd2560) C1{ BC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd2560 ::foo(){vfunc_called(this, "_ZN6dd25603fooEv");}
dd2560 ::~dd2560(){ note_dtor("dd2560", this);} // tgen
dd2560 ::dd2560(){ note_ctor("dd2560", this);} // tgen

static void Test_dd2560()
{
  extern Class_Descriptor cd_dd2560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2560, buf);
    dd2560 *dp, &lv = *(dp=new (buf) dd2560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd2560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(16,12), "dd2560");
    check_base_class_offset(lv, (cc560*), 0, "dd2560");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2560.d");
    test_class_info(&lv, &cd_dd2560);
    dp->~dd2560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2560(Test_dd2560, "dd2560", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2560C1Ev();
extern void _ZN6dd2560D1Ev();
Name_Map name_map_dd2560[] = {
  NSPAIR(_ZN6dd2560C1Ev),
  NSPAIR(_ZN6dd2560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd2560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
extern VTBL_ENTRY _ZTV6dd2560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd2560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd2560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd2560[] = {
  {&(_ZTV6dd2560[3]),  3,11},
  {&(_tg__ZTV5cc560__6dd2560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd2560[4]),  4,6},
  {&(_ZTV6dd2560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static VTBL_ENTRY alt_thunk_names294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2560 = {  "dd2560", // class name
  bases_dd2560, 3,
  &(vtc_dd2560[0]), // expected_vtbl_contents
  &(vtt_dd2560[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2560),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names294,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02560  : dd2560 {
  int e;
  ~ee02560(); // tgen
  ee02560(); // tgen
};
//SIG(1 ee02560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee02560 ::~ee02560(){ note_dtor("ee02560", this);} // tgen
ee02560 ::ee02560(){ note_ctor("ee02560", this);} // tgen

static void Test_ee02560()
{
  extern Class_Descriptor cd_ee02560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02560, buf);
    ee02560 *dp, &lv = *(dp=new (buf) ee02560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee02560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(24,16), "ee02560");
    check_base_class_offset(lv, (cc560*)(dd2560*), 0, "ee02560");
    check_base_class_offset(lv, (dd2560*), 0, "ee02560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02560.e");
    test_class_info(&lv, &cd_ee02560);
    dp->~ee02560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02560(Test_ee02560, "ee02560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02560C1Ev();
extern void _ZN7ee02560D1Ev();
Name_Map name_map_ee02560[] = {
  NSPAIR(_ZN7ee02560C1Ev),
  NSPAIR(_ZN7ee02560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee02560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
extern VTBL_ENTRY _ZTV7ee02560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee02560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee02560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee02560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee02560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee02560[] = {
  {&(_ZTV7ee02560[3]),  3,11},
  {&(_tg__ZTV6dd2560__7ee02560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee02560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee02560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee02560[4]),  4,6},
  {&(_ZTV7ee02560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee02560[];
extern  VTBL_ENTRY _ZTV7ee02560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02560[];
static VTBL_ENTRY alt_thunk_names295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02560 = {  "ee02560", // class name
  bases_ee02560, 4,
  &(vtc_ee02560[0]), // expected_vtbl_contents
  &(vtt_ee02560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names295,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12560  : virtual dd2560 {
  int e;
  ~ee12560(); // tgen
  ee12560(); // tgen
};
//SIG(1 ee12560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee12560 ::~ee12560(){ note_dtor("ee12560", this);} // tgen
ee12560 ::ee12560(){ note_ctor("ee12560", this);} // tgen

static void Test_ee12560()
{
  extern Class_Descriptor cd_ee12560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12560, buf);
    ee12560 *dp, &lv = *(dp=new (buf) ee12560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee12560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(32,20), "ee12560");
    check_base_class_offset(lv, (cc560*)(dd2560*), ABISELECT(16,8), "ee12560");
    check_base_class_offset(lv, (dd2560*), ABISELECT(16,8), "ee12560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12560.e");
    test_class_info(&lv, &cd_ee12560);
    dp->~ee12560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12560(Test_ee12560, "ee12560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12560C1Ev();
extern void _ZN7ee12560D1Ev();
Name_Map name_map_ee12560[] = {
  NSPAIR(_ZN7ee12560C1Ev),
  NSPAIR(_ZN7ee12560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee12560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12560[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
extern VTBL_ENTRY _ZTV7ee12560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee12560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee12560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee12560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee12560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee12560[] = {
  {&(_ZTV7ee12560[4]),  4,17},
  {&(_ZTV7ee12560[9]),  9,17},
  {&(_ZTV7ee12560[15]),  15,17},
  {&(_tg__ZTV6dd2560__7ee12560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee12560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee12560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee12560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12560[];
extern  VTBL_ENTRY _ZTV7ee12560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12560[];
static VTBL_ENTRY alt_thunk_names296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12560 = {  "ee12560", // class name
  bases_ee12560, 4,
  &(vtc_ee12560[0]), // expected_vtbl_contents
  &(vtt_ee12560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names296,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22560  : dd2560 {
  int e;
  virtual void  foo(); // _ZN7ee225603fooEv
  ~ee22560(); // tgen
  ee22560(); // tgen
};
//SIG(1 ee22560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee22560 ::foo(){vfunc_called(this, "_ZN7ee225603fooEv");}
ee22560 ::~ee22560(){ note_dtor("ee22560", this);} // tgen
ee22560 ::ee22560(){ note_ctor("ee22560", this);} // tgen

static void Test_ee22560()
{
  extern Class_Descriptor cd_ee22560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22560, buf);
    ee22560 *dp, &lv = *(dp=new (buf) ee22560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee22560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(24,16), "ee22560");
    check_base_class_offset(lv, (cc560*)(dd2560*), 0, "ee22560");
    check_base_class_offset(lv, (dd2560*), 0, "ee22560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22560.e");
    test_class_info(&lv, &cd_ee22560);
    dp->~ee22560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22560(Test_ee22560, "ee22560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22560C1Ev();
extern void _ZN7ee22560D1Ev();
Name_Map name_map_ee22560[] = {
  NSPAIR(_ZN7ee22560C1Ev),
  NSPAIR(_ZN7ee22560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee22560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22560[];
extern void _ZN5cc5603barEv();
extern void _ZN7ee225603fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee225603fooEv,_ZTv0_n16_N7ee225603fooEv)();
extern void ABISELECT(_ZThn24_N7ee225603fooEv,_ZThn16_N7ee225603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN7ee225603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee225603fooEv,_ZTv0_n16_N7ee225603fooEv),
};
extern VTBL_ENTRY _ZTV7ee22560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee22560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee22560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee22560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee22560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee22560[] = {
  {&(_ZTV7ee22560[3]),  3,11},
  {&(_tg__ZTV6dd2560__7ee22560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee22560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee22560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee22560[4]),  4,6},
  {&(_ZTV7ee22560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee22560[];
extern  VTBL_ENTRY _ZTV7ee22560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22560[];
static VTBL_ENTRY alt_thunk_names297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee225603fooEv,_ZTv0_n16_N7ee225603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee225603fooEv,_ZThn16_N7ee225603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22560 = {  "ee22560", // class name
  bases_ee22560, 4,
  &(vtc_ee22560[0]), // expected_vtbl_contents
  &(vtt_ee22560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names297,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32560  : virtual dd2560 {
  int e;
  virtual void  foo(); // _ZN7ee325603fooEv
  ~ee32560(); // tgen
  ee32560(); // tgen
};
//SIG(1 ee32560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee32560 ::foo(){vfunc_called(this, "_ZN7ee325603fooEv");}
ee32560 ::~ee32560(){ note_dtor("ee32560", this);} // tgen
ee32560 ::ee32560(){ note_ctor("ee32560", this);} // tgen

static void Test_ee32560()
{
  extern Class_Descriptor cd_ee32560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32560, buf);
    ee32560 *dp, &lv = *(dp=new (buf) ee32560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee32560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(32,20), "ee32560");
    check_base_class_offset(lv, (cc560*)(dd2560*), ABISELECT(16,8), "ee32560");
    check_base_class_offset(lv, (dd2560*), ABISELECT(16,8), "ee32560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32560.e");
    test_class_info(&lv, &cd_ee32560);
    dp->~ee32560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32560(Test_ee32560, "ee32560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32560C1Ev();
extern void _ZN7ee32560D1Ev();
Name_Map name_map_ee32560[] = {
  NSPAIR(_ZN7ee32560C1Ev),
  NSPAIR(_ZN7ee32560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee32560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32560[];
extern void _ZN7ee325603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee325603fooEv,_ZTv0_n20_N7ee325603fooEv)();
extern void ABISELECT(_ZThn16_N7ee325603fooEv,_ZThn8_N7ee325603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee325603fooEv,_ZTv0_n16_N7ee325603fooEv)();
extern void ABISELECT(_ZThn32_N7ee325603fooEv,_ZThn20_N7ee325603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32560[0]),
  (VTBL_ENTRY)&_ZN7ee325603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee325603fooEv,_ZTv0_n20_N7ee325603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee325603fooEv,_ZTv0_n16_N7ee325603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee32560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee32560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee32560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee32560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee32560[] = {
  {&(_ZTV7ee32560[4]),  4,18},
  {&(_ZTV7ee32560[10]),  10,18},
  {&(_ZTV7ee32560[16]),  16,18},
  {&(_tg__ZTV6dd2560__7ee32560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee32560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee32560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee32560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32560[];
extern  VTBL_ENTRY _ZTV7ee32560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32560[];
static VTBL_ENTRY alt_thunk_names298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee325603fooEv,_ZTv0_n16_N7ee325603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee325603fooEv,_ZThn20_N7ee325603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee325603fooEv,_ZTv0_n20_N7ee325603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee325603fooEv,_ZThn8_N7ee325603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32560 = {  "ee32560", // class name
  bases_ee32560, 4,
  &(vtc_ee32560[0]), // expected_vtbl_contents
  &(vtt_ee32560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32560),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names298,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42560  : dd2560 {
  int e;
  virtual void  bar(); // _ZN7ee425603barEv
  ~ee42560(); // tgen
  ee42560(); // tgen
};
//SIG(1 ee42560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee42560 ::bar(){vfunc_called(this, "_ZN7ee425603barEv");}
ee42560 ::~ee42560(){ note_dtor("ee42560", this);} // tgen
ee42560 ::ee42560(){ note_ctor("ee42560", this);} // tgen

static void Test_ee42560()
{
  extern Class_Descriptor cd_ee42560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42560, buf);
    ee42560 *dp, &lv = *(dp=new (buf) ee42560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee42560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(24,16), "ee42560");
    check_base_class_offset(lv, (cc560*)(dd2560*), 0, "ee42560");
    check_base_class_offset(lv, (dd2560*), 0, "ee42560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42560.e");
    test_class_info(&lv, &cd_ee42560);
    dp->~ee42560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42560(Test_ee42560, "ee42560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42560C1Ev();
extern void _ZN7ee42560D1Ev();
Name_Map name_map_ee42560[] = {
  NSPAIR(_ZN7ee42560C1Ev),
  NSPAIR(_ZN7ee42560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee42560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42560[];
extern void _ZN7ee425603barEv();
extern void _ZN6dd25603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee425603barEv,_ZTv0_n12_N7ee425603barEv)();
extern void ABISELECT(_ZThn24_N7ee425603barEv,_ZThn16_N7ee425603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42560[0]),
  (VTBL_ENTRY)&_ZN7ee425603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee425603barEv,_ZTv0_n12_N7ee425603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
extern VTBL_ENTRY _ZTV7ee42560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee42560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee42560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee42560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee42560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee42560[] = {
  {&(_ZTV7ee42560[3]),  3,11},
  {&(_tg__ZTV6dd2560__7ee42560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee42560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee42560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee42560[4]),  4,6},
  {&(_ZTV7ee42560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42560[];
extern  VTBL_ENTRY _ZTV7ee42560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42560[];
static VTBL_ENTRY alt_thunk_names299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee425603barEv,_ZTv0_n12_N7ee425603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee425603barEv,_ZThn16_N7ee425603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42560 = {  "ee42560", // class name
  bases_ee42560, 4,
  &(vtc_ee42560[0]), // expected_vtbl_contents
  &(vtt_ee42560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names299,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52560  : virtual dd2560 {
  int e;
  virtual void  bar(); // _ZN7ee525603barEv
  ~ee52560(); // tgen
  ee52560(); // tgen
};
//SIG(1 ee52560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee52560 ::bar(){vfunc_called(this, "_ZN7ee525603barEv");}
ee52560 ::~ee52560(){ note_dtor("ee52560", this);} // tgen
ee52560 ::ee52560(){ note_ctor("ee52560", this);} // tgen

static void Test_ee52560()
{
  extern Class_Descriptor cd_ee52560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52560, buf);
    ee52560 *dp, &lv = *(dp=new (buf) ee52560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee52560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(32,20), "ee52560");
    check_base_class_offset(lv, (cc560*)(dd2560*), ABISELECT(16,8), "ee52560");
    check_base_class_offset(lv, (dd2560*), ABISELECT(16,8), "ee52560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52560.e");
    test_class_info(&lv, &cd_ee52560);
    dp->~ee52560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52560(Test_ee52560, "ee52560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52560C1Ev();
extern void _ZN7ee52560D1Ev();
Name_Map name_map_ee52560[] = {
  NSPAIR(_ZN7ee52560C1Ev),
  NSPAIR(_ZN7ee52560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee52560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52560[];
extern void _ZN7ee525603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee525603barEv,_ZTv0_n16_N7ee525603barEv)();
extern void ABISELECT(_ZThn16_N7ee525603barEv,_ZThn8_N7ee525603barEv)() __attribute__((weak));
extern void _ZN6dd25603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee525603barEv,_ZTv0_n12_N7ee525603barEv)();
extern void ABISELECT(_ZThn32_N7ee525603barEv,_ZThn20_N7ee525603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52560[0]),
  (VTBL_ENTRY)&_ZN7ee525603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee525603barEv,_ZTv0_n16_N7ee525603barEv),
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee525603barEv,_ZTv0_n12_N7ee525603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
extern VTBL_ENTRY _ZTV7ee52560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee52560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee52560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee52560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee52560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee52560[] = {
  {&(_ZTV7ee52560[4]),  4,18},
  {&(_ZTV7ee52560[10]),  10,18},
  {&(_ZTV7ee52560[16]),  16,18},
  {&(_tg__ZTV6dd2560__7ee52560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee52560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee52560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee52560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52560[];
extern  VTBL_ENTRY _ZTV7ee52560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52560[];
static VTBL_ENTRY alt_thunk_names300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee525603barEv,_ZTv0_n12_N7ee525603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee525603barEv,_ZThn20_N7ee525603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee525603barEv,_ZTv0_n16_N7ee525603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee525603barEv,_ZThn8_N7ee525603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52560 = {  "ee52560", // class name
  bases_ee52560, 4,
  &(vtc_ee52560[0]), // expected_vtbl_contents
  &(vtt_ee52560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52560),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names300,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62560  : dd2560 {
  int e;
  virtual void  foo(); // _ZN7ee625603fooEv
  virtual void  bar(); // _ZN7ee625603barEv
  ~ee62560(); // tgen
  ee62560(); // tgen
};
//SIG(1 ee62560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62560 ::foo(){vfunc_called(this, "_ZN7ee625603fooEv");}
void  ee62560 ::bar(){vfunc_called(this, "_ZN7ee625603barEv");}
ee62560 ::~ee62560(){ note_dtor("ee62560", this);} // tgen
ee62560 ::ee62560(){ note_ctor("ee62560", this);} // tgen

static void Test_ee62560()
{
  extern Class_Descriptor cd_ee62560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62560, buf);
    ee62560 *dp, &lv = *(dp=new (buf) ee62560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee62560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(24,16), "ee62560");
    check_base_class_offset(lv, (cc560*)(dd2560*), 0, "ee62560");
    check_base_class_offset(lv, (dd2560*), 0, "ee62560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62560.e");
    test_class_info(&lv, &cd_ee62560);
    dp->~ee62560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62560(Test_ee62560, "ee62560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62560C1Ev();
extern void _ZN7ee62560D1Ev();
Name_Map name_map_ee62560[] = {
  NSPAIR(_ZN7ee62560C1Ev),
  NSPAIR(_ZN7ee62560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee62560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62560[];
extern void _ZN7ee625603barEv();
extern void _ZN7ee625603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee625603barEv,_ZTv0_n12_N7ee625603barEv)();
extern void ABISELECT(_ZThn24_N7ee625603barEv,_ZThn16_N7ee625603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee625603fooEv,_ZTv0_n16_N7ee625603fooEv)();
extern void ABISELECT(_ZThn24_N7ee625603fooEv,_ZThn16_N7ee625603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62560[0]),
  (VTBL_ENTRY)&_ZN7ee625603barEv,
  (VTBL_ENTRY)&_ZN7ee625603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee625603barEv,_ZTv0_n12_N7ee625603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee625603fooEv,_ZTv0_n16_N7ee625603fooEv),
};
extern VTBL_ENTRY _ZTV7ee62560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee62560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee62560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee62560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee62560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee62560[] = {
  {&(_ZTV7ee62560[3]),  3,11},
  {&(_tg__ZTV6dd2560__7ee62560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee62560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee62560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee62560[4]),  4,6},
  {&(_ZTV7ee62560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62560[];
extern  VTBL_ENTRY _ZTV7ee62560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62560[];
static VTBL_ENTRY alt_thunk_names301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25603fooEv,_ZThn16_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee625603fooEv,_ZTv0_n16_N7ee625603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee625603fooEv,_ZThn16_N7ee625603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee625603barEv,_ZTv0_n12_N7ee625603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee625603barEv,_ZThn16_N7ee625603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62560 = {  "ee62560", // class name
  bases_ee62560, 4,
  &(vtc_ee62560[0]), // expected_vtbl_contents
  &(vtt_ee62560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62560),6, //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  ee72560  : virtual dd2560 {
  int e;
  virtual void  foo(); // _ZN7ee725603fooEv
  virtual void  bar(); // _ZN7ee725603barEv
  ~ee72560(); // tgen
  ee72560(); // tgen
};
//SIG(1 ee72560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72560 ::foo(){vfunc_called(this, "_ZN7ee725603fooEv");}
void  ee72560 ::bar(){vfunc_called(this, "_ZN7ee725603barEv");}
ee72560 ::~ee72560(){ note_dtor("ee72560", this);} // tgen
ee72560 ::ee72560(){ note_ctor("ee72560", this);} // tgen

static void Test_ee72560()
{
  extern Class_Descriptor cd_ee72560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72560, buf);
    ee72560 *dp, &lv = *(dp=new (buf) ee72560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee72560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd2560*), ABISELECT(32,20), "ee72560");
    check_base_class_offset(lv, (cc560*)(dd2560*), ABISELECT(16,8), "ee72560");
    check_base_class_offset(lv, (dd2560*), ABISELECT(16,8), "ee72560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72560.e");
    test_class_info(&lv, &cd_ee72560);
    dp->~ee72560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72560(Test_ee72560, "ee72560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72560C1Ev();
extern void _ZN7ee72560D1Ev();
Name_Map name_map_ee72560[] = {
  NSPAIR(_ZN7ee72560C1Ev),
  NSPAIR(_ZN7ee72560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd2560;
extern VTBL_ENTRY _ZTI6dd2560[];
extern  VTBL_ENTRY _ZTV6dd2560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2560[];
static Base_Class bases_ee72560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72560[];
extern void _ZN7ee725603fooEv();
extern void _ZN7ee725603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee725603barEv,_ZTv0_n16_N7ee725603barEv)();
extern void ABISELECT(_ZThn16_N7ee725603barEv,_ZThn8_N7ee725603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee725603fooEv,_ZTv0_n20_N7ee725603fooEv)();
extern void ABISELECT(_ZThn16_N7ee725603fooEv,_ZThn8_N7ee725603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee725603barEv,_ZTv0_n12_N7ee725603barEv)();
extern void ABISELECT(_ZThn32_N7ee725603barEv,_ZThn20_N7ee725603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee725603fooEv,_ZTv0_n16_N7ee725603fooEv)();
extern void ABISELECT(_ZThn32_N7ee725603fooEv,_ZThn20_N7ee725603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72560[0]),
  (VTBL_ENTRY)&_ZN7ee725603fooEv,
  (VTBL_ENTRY)&_ZN7ee725603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee725603barEv,_ZTv0_n16_N7ee725603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee725603fooEv,_ZTv0_n20_N7ee725603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee725603barEv,_ZTv0_n12_N7ee725603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee725603fooEv,_ZTv0_n16_N7ee725603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72560[];
extern void _ZN5cc5603barEv();
extern void _ZN6dd25603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2560__7ee72560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  (VTBL_ENTRY)&_ZN6dd25603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd2560__7ee72560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd2560__7ee72560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv)();
extern void ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2560__7ee72560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv),
};
static  VTT_ENTRY vtt_ee72560[] = {
  {&(_ZTV7ee72560[4]),  4,19},
  {&(_ZTV7ee72560[11]),  11,19},
  {&(_ZTV7ee72560[17]),  17,19},
  {&(_tg__ZTV6dd2560__7ee72560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd2560__7ee72560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd2560__7ee72560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2560__7ee72560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72560[];
extern  VTBL_ENTRY _ZTV7ee72560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72560[];
static VTBL_ENTRY alt_thunk_names302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd25603fooEv,_ZTv0_n16_N6dd25603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25603fooEv,_ZThn12_N6dd25603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee725603fooEv,_ZTv0_n16_N7ee725603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee725603fooEv,_ZThn20_N7ee725603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee725603barEv,_ZTv0_n12_N7ee725603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee725603barEv,_ZThn20_N7ee725603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee725603fooEv,_ZTv0_n20_N7ee725603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee725603fooEv,_ZThn8_N7ee725603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee725603barEv,_ZTv0_n16_N7ee725603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee725603barEv,_ZThn8_N7ee725603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72560 = {  "ee72560", // class name
  bases_ee72560, 4,
  &(vtc_ee72560[0]), // expected_vtbl_contents
  &(vtt_ee72560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72560),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72560),7, //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  dd3560  : virtual cc560 {
  int d;
  virtual void  foo(); // _ZN6dd35603fooEv
  ~dd3560(); // tgen
  dd3560(); // tgen
};
//SIG(-1 dd3560) C1{ VBC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd3560 ::foo(){vfunc_called(this, "_ZN6dd35603fooEv");}
dd3560 ::~dd3560(){ note_dtor("dd3560", this);} // tgen
dd3560 ::dd3560(){ note_ctor("dd3560", this);} // tgen

static void Test_dd3560()
{
  extern Class_Descriptor cd_dd3560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3560, buf);
    dd3560 *dp, &lv = *(dp=new (buf) dd3560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd3560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,16), "dd3560");
    check_base_class_offset(lv, (cc560*), ABISELECT(16,8), "dd3560");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3560.d");
    test_class_info(&lv, &cd_dd3560);
    dp->~dd3560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3560(Test_dd3560, "dd3560", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3560C1Ev();
extern void _ZN6dd3560D1Ev();
Name_Map name_map_dd3560[] = {
  NSPAIR(_ZN6dd3560C1Ev),
  NSPAIR(_ZN6dd3560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd3560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3560[];
extern void _ZN6dd35603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd3560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd3560[] = {
  {&(_ZTV6dd3560[4]),  4,16},
  {&(_ZTV6dd3560[9]),  9,16},
  {&(_ZTV6dd3560[14]),  14,16},
  {&(_tg__ZTV5cc560__6dd3560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd3560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static VTBL_ENTRY alt_thunk_names303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3560 = {  "dd3560", // class name
  bases_dd3560, 3,
  &(vtc_dd3560[0]), // expected_vtbl_contents
  &(vtt_dd3560[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3560),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names303,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03560  : dd3560 {
  int e;
  ~ee03560(); // tgen
  ee03560(); // tgen
};
//SIG(1 ee03560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee03560 ::~ee03560(){ note_dtor("ee03560", this);} // tgen
ee03560 ::ee03560(){ note_ctor("ee03560", this);} // tgen

static void Test_ee03560()
{
  extern Class_Descriptor cd_ee03560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03560, buf);
    ee03560 *dp, &lv = *(dp=new (buf) ee03560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee03560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee03560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(16,12), "ee03560");
    check_base_class_offset(lv, (dd3560*), 0, "ee03560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03560.e");
    test_class_info(&lv, &cd_ee03560);
    dp->~ee03560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03560(Test_ee03560, "ee03560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03560C1Ev();
extern void _ZN7ee03560D1Ev();
Name_Map name_map_ee03560[] = {
  NSPAIR(_ZN7ee03560C1Ev),
  NSPAIR(_ZN7ee03560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee03560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03560[];
extern void _ZN6dd35603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee03560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee03560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee03560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee03560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee03560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee03560[] = {
  {&(_ZTV7ee03560[4]),  4,16},
  {&(_tg__ZTV6dd3560__7ee03560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee03560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee03560[4]),  4,6},
  {&(_ZTV7ee03560[9]),  9,16},
  {&(_ZTV7ee03560[14]),  14,16},
  {&(_tg__ZTV5cc560__7ee03560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee03560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03560[];
extern  VTBL_ENTRY _ZTV7ee03560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03560[];
static VTBL_ENTRY alt_thunk_names304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03560 = {  "ee03560", // class name
  bases_ee03560, 4,
  &(vtc_ee03560[0]), // expected_vtbl_contents
  &(vtt_ee03560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03560),8, //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  ee13560  : virtual dd3560 {
  int e;
  ~ee13560(); // tgen
  ee13560(); // tgen
};
//SIG(1 ee13560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee13560 ::~ee13560(){ note_dtor("ee13560", this);} // tgen
ee13560 ::ee13560(){ note_ctor("ee13560", this);} // tgen

static void Test_ee13560()
{
  extern Class_Descriptor cd_ee13560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13560, buf);
    ee13560 *dp, &lv = *(dp=new (buf) ee13560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee13560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee13560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(32,16), "ee13560");
    check_base_class_offset(lv, (dd3560*), ABISELECT(16,8), "ee13560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13560.e");
    test_class_info(&lv, &cd_ee13560);
    dp->~ee13560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13560(Test_ee13560, "ee13560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13560C1Ev();
extern void _ZN7ee13560D1Ev();
Name_Map name_map_ee13560[] = {
  NSPAIR(_ZN7ee13560C1Ev),
  NSPAIR(_ZN7ee13560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee13560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13560[];
extern void _ZN6dd35603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13560[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee13560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee13560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee13560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee13560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee13560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee13560[] = {
  {&(_ZTV7ee13560[5]),  5,22},
  {&(_ZTV7ee13560[10]),  10,22},
  {&(_ZTV7ee13560[15]),  15,22},
  {&(_ZTV7ee13560[20]),  20,22},
  {&(_tg__ZTV6dd3560__7ee13560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee13560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee13560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee13560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee13560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13560[];
extern  VTBL_ENTRY _ZTV7ee13560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13560[];
static VTBL_ENTRY alt_thunk_names305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13560 = {  "ee13560", // class name
  bases_ee13560, 4,
  &(vtc_ee13560[0]), // expected_vtbl_contents
  &(vtt_ee13560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13560),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13560),9, //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  ee23560  : dd3560 {
  int e;
  virtual void  foo(); // _ZN7ee235603fooEv
  ~ee23560(); // tgen
  ee23560(); // tgen
};
//SIG(1 ee23560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee23560 ::foo(){vfunc_called(this, "_ZN7ee235603fooEv");}
ee23560 ::~ee23560(){ note_dtor("ee23560", this);} // tgen
ee23560 ::ee23560(){ note_ctor("ee23560", this);} // tgen

static void Test_ee23560()
{
  extern Class_Descriptor cd_ee23560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23560, buf);
    ee23560 *dp, &lv = *(dp=new (buf) ee23560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee23560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee23560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(16,12), "ee23560");
    check_base_class_offset(lv, (dd3560*), 0, "ee23560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23560.e");
    test_class_info(&lv, &cd_ee23560);
    dp->~ee23560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23560(Test_ee23560, "ee23560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23560C1Ev();
extern void _ZN7ee23560D1Ev();
Name_Map name_map_ee23560[] = {
  NSPAIR(_ZN7ee23560C1Ev),
  NSPAIR(_ZN7ee23560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee23560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23560[];
extern void _ZN7ee235603fooEv();
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee235603fooEv,_ZTv0_n16_N7ee235603fooEv)();
extern void ABISELECT(_ZThn32_N7ee235603fooEv,_ZThn20_N7ee235603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23560[0]),
  (VTBL_ENTRY)&_ZN7ee235603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee235603fooEv,_ZTv0_n16_N7ee235603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee23560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee23560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee23560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee23560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee23560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee23560[] = {
  {&(_ZTV7ee23560[4]),  4,16},
  {&(_tg__ZTV6dd3560__7ee23560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee23560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee23560[4]),  4,6},
  {&(_ZTV7ee23560[9]),  9,16},
  {&(_ZTV7ee23560[14]),  14,16},
  {&(_tg__ZTV5cc560__7ee23560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee23560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23560[];
extern  VTBL_ENTRY _ZTV7ee23560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23560[];
static VTBL_ENTRY alt_thunk_names306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee235603fooEv,_ZTv0_n16_N7ee235603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee235603fooEv,_ZThn20_N7ee235603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23560 = {  "ee23560", // class name
  bases_ee23560, 4,
  &(vtc_ee23560[0]), // expected_vtbl_contents
  &(vtt_ee23560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names306,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33560  : virtual dd3560 {
  int e;
  virtual void  foo(); // _ZN7ee335603fooEv
  ~ee33560(); // tgen
  ee33560(); // tgen
};
//SIG(1 ee33560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee33560 ::foo(){vfunc_called(this, "_ZN7ee335603fooEv");}
ee33560 ::~ee33560(){ note_dtor("ee33560", this);} // tgen
ee33560 ::ee33560(){ note_ctor("ee33560", this);} // tgen

static void Test_ee33560()
{
  extern Class_Descriptor cd_ee33560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33560, buf);
    ee33560 *dp, &lv = *(dp=new (buf) ee33560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee33560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee33560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(32,16), "ee33560");
    check_base_class_offset(lv, (dd3560*), ABISELECT(16,8), "ee33560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33560.e");
    test_class_info(&lv, &cd_ee33560);
    dp->~ee33560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33560(Test_ee33560, "ee33560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33560C1Ev();
extern void _ZN7ee33560D1Ev();
Name_Map name_map_ee33560[] = {
  NSPAIR(_ZN7ee33560C1Ev),
  NSPAIR(_ZN7ee33560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee33560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33560[];
extern void _ZN7ee335603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee335603fooEv,_ZTv0_n20_N7ee335603fooEv)();
extern void ABISELECT(_ZThn16_N7ee335603fooEv,_ZThn8_N7ee335603fooEv)() __attribute__((weak));
extern void _ZN5cc5603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee335603fooEv,_ZTv0_n16_N7ee335603fooEv)();
extern void ABISELECT(_ZThn48_N7ee335603fooEv,_ZThn24_N7ee335603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33560[0]),
  (VTBL_ENTRY)&_ZN7ee335603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee335603fooEv,_ZTv0_n20_N7ee335603fooEv),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee335603fooEv,_ZTv0_n16_N7ee335603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee33560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee33560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee33560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee33560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee33560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee33560[] = {
  {&(_ZTV7ee33560[5]),  5,23},
  {&(_ZTV7ee33560[11]),  11,23},
  {&(_ZTV7ee33560[16]),  16,23},
  {&(_ZTV7ee33560[21]),  21,23},
  {&(_tg__ZTV6dd3560__7ee33560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee33560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee33560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee33560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee33560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33560[];
extern  VTBL_ENTRY _ZTV7ee33560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33560[];
static VTBL_ENTRY alt_thunk_names307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee335603fooEv,_ZTv0_n16_N7ee335603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee335603fooEv,_ZThn24_N7ee335603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee335603fooEv,_ZTv0_n20_N7ee335603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee335603fooEv,_ZThn8_N7ee335603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33560 = {  "ee33560", // class name
  bases_ee33560, 4,
  &(vtc_ee33560[0]), // expected_vtbl_contents
  &(vtt_ee33560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33560),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names307,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43560  : dd3560 {
  int e;
  virtual void  bar(); // _ZN7ee435603barEv
  ~ee43560(); // tgen
  ee43560(); // tgen
};
//SIG(1 ee43560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee43560 ::bar(){vfunc_called(this, "_ZN7ee435603barEv");}
ee43560 ::~ee43560(){ note_dtor("ee43560", this);} // tgen
ee43560 ::ee43560(){ note_ctor("ee43560", this);} // tgen

static void Test_ee43560()
{
  extern Class_Descriptor cd_ee43560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43560, buf);
    ee43560 *dp, &lv = *(dp=new (buf) ee43560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee43560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee43560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(16,12), "ee43560");
    check_base_class_offset(lv, (dd3560*), 0, "ee43560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43560.e");
    test_class_info(&lv, &cd_ee43560);
    dp->~ee43560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43560(Test_ee43560, "ee43560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43560C1Ev();
extern void _ZN7ee43560D1Ev();
Name_Map name_map_ee43560[] = {
  NSPAIR(_ZN7ee43560C1Ev),
  NSPAIR(_ZN7ee43560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee43560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43560[];
extern void _ZN6dd35603fooEv();
extern void _ZN7ee435603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee435603barEv,_ZTv0_n16_N7ee435603barEv)();
extern void ABISELECT(_ZThn16_N7ee435603barEv,_ZThn12_N7ee435603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee435603barEv,_ZTv0_n12_N7ee435603barEv)();
extern void ABISELECT(_ZThn32_N7ee435603barEv,_ZThn20_N7ee435603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
  (VTBL_ENTRY)&_ZN7ee435603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee435603barEv,_ZTv0_n16_N7ee435603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee435603barEv,_ZTv0_n12_N7ee435603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee43560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee43560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee43560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee43560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee43560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee43560[] = {
  {&(_ZTV7ee43560[4]),  4,17},
  {&(_tg__ZTV6dd3560__7ee43560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee43560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee43560[4]),  4,6},
  {&(_ZTV7ee43560[10]),  10,17},
  {&(_ZTV7ee43560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee43560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee43560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43560[];
extern  VTBL_ENTRY _ZTV7ee43560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43560[];
static VTBL_ENTRY alt_thunk_names308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee435603barEv,_ZTv0_n12_N7ee435603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee435603barEv,_ZThn20_N7ee435603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee435603barEv,_ZTv0_n16_N7ee435603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee435603barEv,_ZThn12_N7ee435603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43560 = {  "ee43560", // class name
  bases_ee43560, 4,
  &(vtc_ee43560[0]), // expected_vtbl_contents
  &(vtt_ee43560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names308,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53560  : virtual dd3560 {
  int e;
  virtual void  bar(); // _ZN7ee535603barEv
  ~ee53560(); // tgen
  ee53560(); // tgen
};
//SIG(1 ee53560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee53560 ::bar(){vfunc_called(this, "_ZN7ee535603barEv");}
ee53560 ::~ee53560(){ note_dtor("ee53560", this);} // tgen
ee53560 ::ee53560(){ note_ctor("ee53560", this);} // tgen

static void Test_ee53560()
{
  extern Class_Descriptor cd_ee53560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53560, buf);
    ee53560 *dp, &lv = *(dp=new (buf) ee53560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee53560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee53560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(32,16), "ee53560");
    check_base_class_offset(lv, (dd3560*), ABISELECT(16,8), "ee53560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53560.e");
    test_class_info(&lv, &cd_ee53560);
    dp->~ee53560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53560(Test_ee53560, "ee53560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53560C1Ev();
extern void _ZN7ee53560D1Ev();
Name_Map name_map_ee53560[] = {
  NSPAIR(_ZN7ee53560C1Ev),
  NSPAIR(_ZN7ee53560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee53560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53560[];
extern void _ZN7ee535603barEv();
extern void _ZN6dd35603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee535603barEv,_ZTv0_n16_N7ee535603barEv)();
extern void ABISELECT(_ZThn32_N7ee535603barEv,_ZThn16_N7ee535603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee535603barEv,_ZTv0_n12_N7ee535603barEv)();
extern void ABISELECT(_ZThn48_N7ee535603barEv,_ZThn24_N7ee535603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53560[0]),
  (VTBL_ENTRY)&_ZN7ee535603barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee535603barEv,_ZTv0_n16_N7ee535603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee535603barEv,_ZTv0_n12_N7ee535603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee53560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee53560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee53560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee53560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee53560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee53560[] = {
  {&(_ZTV7ee53560[5]),  5,23},
  {&(_ZTV7ee53560[11]),  11,23},
  {&(_ZTV7ee53560[16]),  16,23},
  {&(_ZTV7ee53560[21]),  21,23},
  {&(_tg__ZTV6dd3560__7ee53560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee53560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee53560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee53560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee53560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53560[];
extern  VTBL_ENTRY _ZTV7ee53560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53560[];
static VTBL_ENTRY alt_thunk_names309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee535603barEv,_ZTv0_n12_N7ee535603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee535603barEv,_ZThn24_N7ee535603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee535603barEv,_ZTv0_n16_N7ee535603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee535603barEv,_ZThn16_N7ee535603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53560 = {  "ee53560", // class name
  bases_ee53560, 4,
  &(vtc_ee53560[0]), // expected_vtbl_contents
  &(vtt_ee53560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53560),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names309,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63560  : dd3560 {
  int e;
  virtual void  foo(); // _ZN7ee635603fooEv
  virtual void  bar(); // _ZN7ee635603barEv
  ~ee63560(); // tgen
  ee63560(); // tgen
};
//SIG(1 ee63560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63560 ::foo(){vfunc_called(this, "_ZN7ee635603fooEv");}
void  ee63560 ::bar(){vfunc_called(this, "_ZN7ee635603barEv");}
ee63560 ::~ee63560(){ note_dtor("ee63560", this);} // tgen
ee63560 ::ee63560(){ note_ctor("ee63560", this);} // tgen

static void Test_ee63560()
{
  extern Class_Descriptor cd_ee63560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63560, buf);
    ee63560 *dp, &lv = *(dp=new (buf) ee63560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee63560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee63560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(16,12), "ee63560");
    check_base_class_offset(lv, (dd3560*), 0, "ee63560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63560.e");
    test_class_info(&lv, &cd_ee63560);
    dp->~ee63560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63560(Test_ee63560, "ee63560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63560C1Ev();
extern void _ZN7ee63560D1Ev();
Name_Map name_map_ee63560[] = {
  NSPAIR(_ZN7ee63560C1Ev),
  NSPAIR(_ZN7ee63560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee63560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63560[];
extern void _ZN7ee635603fooEv();
extern void _ZN7ee635603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee635603barEv,_ZTv0_n16_N7ee635603barEv)();
extern void ABISELECT(_ZThn16_N7ee635603barEv,_ZThn12_N7ee635603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee635603barEv,_ZTv0_n12_N7ee635603barEv)();
extern void ABISELECT(_ZThn32_N7ee635603barEv,_ZThn20_N7ee635603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee635603fooEv,_ZTv0_n16_N7ee635603fooEv)();
extern void ABISELECT(_ZThn32_N7ee635603fooEv,_ZThn20_N7ee635603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63560[0]),
  (VTBL_ENTRY)&_ZN7ee635603fooEv,
  (VTBL_ENTRY)&_ZN7ee635603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee635603barEv,_ZTv0_n16_N7ee635603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee635603barEv,_ZTv0_n12_N7ee635603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee635603fooEv,_ZTv0_n16_N7ee635603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee63560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee63560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee63560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee63560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee63560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee63560[] = {
  {&(_ZTV7ee63560[4]),  4,17},
  {&(_tg__ZTV6dd3560__7ee63560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee63560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee63560[4]),  4,6},
  {&(_ZTV7ee63560[10]),  10,17},
  {&(_ZTV7ee63560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee63560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee63560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63560[];
extern  VTBL_ENTRY _ZTV7ee63560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63560[];
static VTBL_ENTRY alt_thunk_names310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn20_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee635603fooEv,_ZTv0_n16_N7ee635603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee635603fooEv,_ZThn20_N7ee635603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee635603barEv,_ZTv0_n12_N7ee635603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee635603barEv,_ZThn20_N7ee635603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee635603barEv,_ZTv0_n16_N7ee635603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee635603barEv,_ZThn12_N7ee635603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63560 = {  "ee63560", // class name
  bases_ee63560, 4,
  &(vtc_ee63560[0]), // expected_vtbl_contents
  &(vtt_ee63560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names310,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73560  : virtual dd3560 {
  int e;
  virtual void  foo(); // _ZN7ee735603fooEv
  virtual void  bar(); // _ZN7ee735603barEv
  ~ee73560(); // tgen
  ee73560(); // tgen
};
//SIG(1 ee73560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73560 ::foo(){vfunc_called(this, "_ZN7ee735603fooEv");}
void  ee73560 ::bar(){vfunc_called(this, "_ZN7ee735603barEv");}
ee73560 ::~ee73560(){ note_dtor("ee73560", this);} // tgen
ee73560 ::ee73560(){ note_ctor("ee73560", this);} // tgen

static void Test_ee73560()
{
  extern Class_Descriptor cd_ee73560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73560, buf);
    ee73560 *dp, &lv = *(dp=new (buf) ee73560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee73560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee73560");
    check_base_class_offset(lv, (cc560*)(dd3560*), ABISELECT(32,16), "ee73560");
    check_base_class_offset(lv, (dd3560*), ABISELECT(16,8), "ee73560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73560.e");
    test_class_info(&lv, &cd_ee73560);
    dp->~ee73560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73560(Test_ee73560, "ee73560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73560C1Ev();
extern void _ZN7ee73560D1Ev();
Name_Map name_map_ee73560[] = {
  NSPAIR(_ZN7ee73560C1Ev),
  NSPAIR(_ZN7ee73560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd3560;
extern VTBL_ENTRY _ZTI6dd3560[];
extern  VTBL_ENTRY _ZTV6dd3560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3560[];
static Base_Class bases_ee73560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73560[];
extern void _ZN7ee735603fooEv();
extern void _ZN7ee735603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee735603fooEv,_ZTv0_n20_N7ee735603fooEv)();
extern void ABISELECT(_ZThn16_N7ee735603fooEv,_ZThn8_N7ee735603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee735603barEv,_ZTv0_n16_N7ee735603barEv)();
extern void ABISELECT(_ZThn32_N7ee735603barEv,_ZThn16_N7ee735603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee735603barEv,_ZTv0_n12_N7ee735603barEv)();
extern void ABISELECT(_ZThn48_N7ee735603barEv,_ZThn24_N7ee735603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee735603fooEv,_ZTv0_n16_N7ee735603fooEv)();
extern void ABISELECT(_ZThn48_N7ee735603fooEv,_ZThn24_N7ee735603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73560[0]),
  (VTBL_ENTRY)&_ZN7ee735603fooEv,
  (VTBL_ENTRY)&_ZN7ee735603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee735603fooEv,_ZTv0_n20_N7ee735603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee735603barEv,_ZTv0_n16_N7ee735603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee735603barEv,_ZTv0_n12_N7ee735603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee735603fooEv,_ZTv0_n16_N7ee735603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73560[];
extern void _ZN6dd35603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3560__7ee73560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN6dd35603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd3560__7ee73560[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv)();
extern void ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3560__7ee73560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee73560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee73560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee73560[] = {
  {&(_ZTV7ee73560[5]),  5,24},
  {&(_ZTV7ee73560[12]),  12,24},
  {&(_ZTV7ee73560[17]),  17,24},
  {&(_ZTV7ee73560[22]),  22,24},
  {&(_tg__ZTV6dd3560__7ee73560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd3560__7ee73560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd3560__7ee73560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee73560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee73560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73560[];
extern  VTBL_ENTRY _ZTV7ee73560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73560[];
static VTBL_ENTRY alt_thunk_names311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd35603fooEv,_ZTv0_n16_N6dd35603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35603fooEv,_ZThn16_N6dd35603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee735603fooEv,_ZTv0_n16_N7ee735603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee735603fooEv,_ZThn24_N7ee735603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee735603barEv,_ZTv0_n12_N7ee735603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee735603barEv,_ZThn24_N7ee735603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee735603barEv,_ZTv0_n16_N7ee735603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee735603barEv,_ZThn16_N7ee735603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee735603fooEv,_ZTv0_n20_N7ee735603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee735603fooEv,_ZThn8_N7ee735603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73560 = {  "ee73560", // class name
  bases_ee73560, 4,
  &(vtc_ee73560[0]), // expected_vtbl_contents
  &(vtt_ee73560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73560),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names311,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4560  : cc560 {
  int d;
  virtual void  bar(); // _ZN6dd45603barEv
  ~dd4560(); // tgen
  dd4560(); // tgen
};
//SIG(-1 dd4560) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd4560 ::bar(){vfunc_called(this, "_ZN6dd45603barEv");}
dd4560 ::~dd4560(){ note_dtor("dd4560", this);} // tgen
dd4560 ::dd4560(){ note_ctor("dd4560", this);} // tgen

static void Test_dd4560()
{
  extern Class_Descriptor cd_dd4560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4560, buf);
    dd4560 *dp, &lv = *(dp=new (buf) dd4560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd4560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(16,12), "dd4560");
    check_base_class_offset(lv, (cc560*), 0, "dd4560");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4560.d");
    test_class_info(&lv, &cd_dd4560);
    dp->~dd4560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4560(Test_dd4560, "dd4560", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4560C1Ev();
extern void _ZN6dd4560D1Ev();
Name_Map name_map_dd4560[] = {
  NSPAIR(_ZN6dd4560C1Ev),
  NSPAIR(_ZN6dd4560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd4560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4560[];
extern void _ZN6dd45603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd4560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd4560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd4560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd4560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd4560[] = {
  {&(_ZTV6dd4560[3]),  3,10},
  {&(_tg__ZTV5cc560__6dd4560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd4560[4]),  4,6},
  {&(_ZTV6dd4560[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static VTBL_ENTRY alt_thunk_names312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4560 = {  "dd4560", // class name
  bases_dd4560, 3,
  &(vtc_dd4560[0]), // expected_vtbl_contents
  &(vtt_dd4560[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4560),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4560),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names312,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04560  : dd4560 {
  int e;
  ~ee04560(); // tgen
  ee04560(); // tgen
};
//SIG(1 ee04560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee04560 ::~ee04560(){ note_dtor("ee04560", this);} // tgen
ee04560 ::ee04560(){ note_ctor("ee04560", this);} // tgen

static void Test_ee04560()
{
  extern Class_Descriptor cd_ee04560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04560, buf);
    ee04560 *dp, &lv = *(dp=new (buf) ee04560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee04560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(24,16), "ee04560");
    check_base_class_offset(lv, (cc560*)(dd4560*), 0, "ee04560");
    check_base_class_offset(lv, (dd4560*), 0, "ee04560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04560.e");
    test_class_info(&lv, &cd_ee04560);
    dp->~ee04560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04560(Test_ee04560, "ee04560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04560C1Ev();
extern void _ZN7ee04560D1Ev();
Name_Map name_map_ee04560[] = {
  NSPAIR(_ZN7ee04560C1Ev),
  NSPAIR(_ZN7ee04560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee04560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04560[];
extern void _ZN6dd45603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee04560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee04560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee04560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee04560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee04560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee04560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee04560[] = {
  {&(_ZTV7ee04560[3]),  3,10},
  {&(_tg__ZTV6dd4560__7ee04560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee04560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee04560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee04560[4]),  4,6},
  {&(_ZTV7ee04560[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee04560[];
extern  VTBL_ENTRY _ZTV7ee04560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04560[];
static VTBL_ENTRY alt_thunk_names313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04560 = {  "ee04560", // class name
  bases_ee04560, 4,
  &(vtc_ee04560[0]), // expected_vtbl_contents
  &(vtt_ee04560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04560),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names313,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14560  : virtual dd4560 {
  int e;
  ~ee14560(); // tgen
  ee14560(); // tgen
};
//SIG(1 ee14560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee14560 ::~ee14560(){ note_dtor("ee14560", this);} // tgen
ee14560 ::ee14560(){ note_ctor("ee14560", this);} // tgen

static void Test_ee14560()
{
  extern Class_Descriptor cd_ee14560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14560, buf);
    ee14560 *dp, &lv = *(dp=new (buf) ee14560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee14560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(32,20), "ee14560");
    check_base_class_offset(lv, (cc560*)(dd4560*), ABISELECT(16,8), "ee14560");
    check_base_class_offset(lv, (dd4560*), ABISELECT(16,8), "ee14560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14560.e");
    test_class_info(&lv, &cd_ee14560);
    dp->~ee14560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14560(Test_ee14560, "ee14560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14560C1Ev();
extern void _ZN7ee14560D1Ev();
Name_Map name_map_ee14560[] = {
  NSPAIR(_ZN7ee14560C1Ev),
  NSPAIR(_ZN7ee14560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee14560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14560[];
extern void _ZN6dd45603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee14560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14560[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee14560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee14560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee14560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee14560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee14560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee14560[] = {
  {&(_ZTV7ee14560[4]),  4,15},
  {&(_ZTV7ee14560[8]),  8,15},
  {&(_ZTV7ee14560[13]),  13,15},
  {&(_tg__ZTV6dd4560__7ee14560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee14560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee14560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee14560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14560[];
extern  VTBL_ENTRY _ZTV7ee14560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14560[];
static VTBL_ENTRY alt_thunk_names314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14560 = {  "ee14560", // class name
  bases_ee14560, 4,
  &(vtc_ee14560[0]), // expected_vtbl_contents
  &(vtt_ee14560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14560),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names314,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24560  : dd4560 {
  int e;
  virtual void  foo(); // _ZN7ee245603fooEv
  ~ee24560(); // tgen
  ee24560(); // tgen
};
//SIG(1 ee24560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee24560 ::foo(){vfunc_called(this, "_ZN7ee245603fooEv");}
ee24560 ::~ee24560(){ note_dtor("ee24560", this);} // tgen
ee24560 ::ee24560(){ note_ctor("ee24560", this);} // tgen

static void Test_ee24560()
{
  extern Class_Descriptor cd_ee24560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24560, buf);
    ee24560 *dp, &lv = *(dp=new (buf) ee24560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee24560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(24,16), "ee24560");
    check_base_class_offset(lv, (cc560*)(dd4560*), 0, "ee24560");
    check_base_class_offset(lv, (dd4560*), 0, "ee24560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24560.e");
    test_class_info(&lv, &cd_ee24560);
    dp->~ee24560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24560(Test_ee24560, "ee24560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24560C1Ev();
extern void _ZN7ee24560D1Ev();
Name_Map name_map_ee24560[] = {
  NSPAIR(_ZN7ee24560C1Ev),
  NSPAIR(_ZN7ee24560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee24560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24560[];
extern void _ZN6dd45603barEv();
extern void _ZN7ee245603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee245603fooEv,_ZTv0_n16_N7ee245603fooEv)();
extern void ABISELECT(_ZThn24_N7ee245603fooEv,_ZThn16_N7ee245603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
  (VTBL_ENTRY)&_ZN7ee245603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee245603fooEv,_ZTv0_n16_N7ee245603fooEv),
};
extern VTBL_ENTRY _ZTV7ee24560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee24560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee24560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee24560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee24560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee24560[] = {
  {&(_ZTV7ee24560[3]),  3,11},
  {&(_tg__ZTV6dd4560__7ee24560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee24560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee24560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee24560[4]),  4,6},
  {&(_ZTV7ee24560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24560[];
extern  VTBL_ENTRY _ZTV7ee24560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24560[];
static VTBL_ENTRY alt_thunk_names315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee245603fooEv,_ZTv0_n16_N7ee245603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee245603fooEv,_ZThn16_N7ee245603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24560 = {  "ee24560", // class name
  bases_ee24560, 4,
  &(vtc_ee24560[0]), // expected_vtbl_contents
  &(vtt_ee24560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24560),6, //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  ee34560  : virtual dd4560 {
  int e;
  virtual void  foo(); // _ZN7ee345603fooEv
  ~ee34560(); // tgen
  ee34560(); // tgen
};
//SIG(1 ee34560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee34560 ::foo(){vfunc_called(this, "_ZN7ee345603fooEv");}
ee34560 ::~ee34560(){ note_dtor("ee34560", this);} // tgen
ee34560 ::ee34560(){ note_ctor("ee34560", this);} // tgen

static void Test_ee34560()
{
  extern Class_Descriptor cd_ee34560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34560, buf);
    ee34560 *dp, &lv = *(dp=new (buf) ee34560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee34560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(32,20), "ee34560");
    check_base_class_offset(lv, (cc560*)(dd4560*), ABISELECT(16,8), "ee34560");
    check_base_class_offset(lv, (dd4560*), ABISELECT(16,8), "ee34560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34560.e");
    test_class_info(&lv, &cd_ee34560);
    dp->~ee34560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34560(Test_ee34560, "ee34560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34560C1Ev();
extern void _ZN7ee34560D1Ev();
Name_Map name_map_ee34560[] = {
  NSPAIR(_ZN7ee34560C1Ev),
  NSPAIR(_ZN7ee34560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee34560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34560[];
extern void _ZN7ee345603fooEv();
extern void _ZN6dd45603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee345603fooEv,_ZTv0_n16_N7ee345603fooEv)();
extern void ABISELECT(_ZThn32_N7ee345603fooEv,_ZThn20_N7ee345603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34560[0]),
  (VTBL_ENTRY)&_ZN7ee345603fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee345603fooEv,_ZTv0_n16_N7ee345603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee34560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee34560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee34560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee34560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee34560[] = {
  {&(_ZTV7ee34560[4]),  4,16},
  {&(_ZTV7ee34560[9]),  9,16},
  {&(_ZTV7ee34560[14]),  14,16},
  {&(_tg__ZTV6dd4560__7ee34560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee34560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee34560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee34560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34560[];
extern  VTBL_ENTRY _ZTV7ee34560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34560[];
static VTBL_ENTRY alt_thunk_names316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee345603fooEv,_ZTv0_n16_N7ee345603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee345603fooEv,_ZThn20_N7ee345603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34560 = {  "ee34560", // class name
  bases_ee34560, 4,
  &(vtc_ee34560[0]), // expected_vtbl_contents
  &(vtt_ee34560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34560),7, //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  ee44560  : dd4560 {
  int e;
  virtual void  bar(); // _ZN7ee445603barEv
  ~ee44560(); // tgen
  ee44560(); // tgen
};
//SIG(1 ee44560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee44560 ::bar(){vfunc_called(this, "_ZN7ee445603barEv");}
ee44560 ::~ee44560(){ note_dtor("ee44560", this);} // tgen
ee44560 ::ee44560(){ note_ctor("ee44560", this);} // tgen

static void Test_ee44560()
{
  extern Class_Descriptor cd_ee44560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44560, buf);
    ee44560 *dp, &lv = *(dp=new (buf) ee44560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee44560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(24,16), "ee44560");
    check_base_class_offset(lv, (cc560*)(dd4560*), 0, "ee44560");
    check_base_class_offset(lv, (dd4560*), 0, "ee44560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44560.e");
    test_class_info(&lv, &cd_ee44560);
    dp->~ee44560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44560(Test_ee44560, "ee44560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44560C1Ev();
extern void _ZN7ee44560D1Ev();
Name_Map name_map_ee44560[] = {
  NSPAIR(_ZN7ee44560C1Ev),
  NSPAIR(_ZN7ee44560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee44560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44560[];
extern void _ZN7ee445603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee445603barEv,_ZTv0_n12_N7ee445603barEv)();
extern void ABISELECT(_ZThn24_N7ee445603barEv,_ZThn16_N7ee445603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee44560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44560[0]),
  (VTBL_ENTRY)&_ZN7ee445603barEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee445603barEv,_ZTv0_n12_N7ee445603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee44560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee44560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee44560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee44560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee44560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee44560[] = {
  {&(_ZTV7ee44560[3]),  3,10},
  {&(_tg__ZTV6dd4560__7ee44560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee44560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee44560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee44560[4]),  4,6},
  {&(_ZTV7ee44560[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee44560[];
extern  VTBL_ENTRY _ZTV7ee44560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44560[];
static VTBL_ENTRY alt_thunk_names317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee445603barEv,_ZTv0_n12_N7ee445603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee445603barEv,_ZThn16_N7ee445603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44560 = {  "ee44560", // class name
  bases_ee44560, 4,
  &(vtc_ee44560[0]), // expected_vtbl_contents
  &(vtt_ee44560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44560),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44560),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  ee54560  : virtual dd4560 {
  int e;
  virtual void  bar(); // _ZN7ee545603barEv
  ~ee54560(); // tgen
  ee54560(); // tgen
};
//SIG(1 ee54560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee54560 ::bar(){vfunc_called(this, "_ZN7ee545603barEv");}
ee54560 ::~ee54560(){ note_dtor("ee54560", this);} // tgen
ee54560 ::ee54560(){ note_ctor("ee54560", this);} // tgen

static void Test_ee54560()
{
  extern Class_Descriptor cd_ee54560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54560, buf);
    ee54560 *dp, &lv = *(dp=new (buf) ee54560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee54560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(32,20), "ee54560");
    check_base_class_offset(lv, (cc560*)(dd4560*), ABISELECT(16,8), "ee54560");
    check_base_class_offset(lv, (dd4560*), ABISELECT(16,8), "ee54560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54560.e");
    test_class_info(&lv, &cd_ee54560);
    dp->~ee54560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54560(Test_ee54560, "ee54560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54560C1Ev();
extern void _ZN7ee54560D1Ev();
Name_Map name_map_ee54560[] = {
  NSPAIR(_ZN7ee54560C1Ev),
  NSPAIR(_ZN7ee54560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee54560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54560[];
extern void _ZN7ee545603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee545603barEv,_ZTv0_n16_N7ee545603barEv)();
extern void ABISELECT(_ZThn16_N7ee545603barEv,_ZThn8_N7ee545603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee545603barEv,_ZTv0_n12_N7ee545603barEv)();
extern void ABISELECT(_ZThn32_N7ee545603barEv,_ZThn20_N7ee545603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee54560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54560[0]),
  (VTBL_ENTRY)&_ZN7ee545603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee545603barEv,_ZTv0_n16_N7ee545603barEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee545603barEv,_ZTv0_n12_N7ee545603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee54560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee54560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee54560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee54560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee54560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee54560[] = {
  {&(_ZTV7ee54560[4]),  4,16},
  {&(_ZTV7ee54560[9]),  9,16},
  {&(_ZTV7ee54560[14]),  14,16},
  {&(_tg__ZTV6dd4560__7ee54560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee54560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee54560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee54560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54560[];
extern  VTBL_ENTRY _ZTV7ee54560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54560[];
static VTBL_ENTRY alt_thunk_names318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee545603barEv,_ZTv0_n12_N7ee545603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee545603barEv,_ZThn20_N7ee545603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee545603barEv,_ZTv0_n16_N7ee545603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee545603barEv,_ZThn8_N7ee545603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54560 = {  "ee54560", // class name
  bases_ee54560, 4,
  &(vtc_ee54560[0]), // expected_vtbl_contents
  &(vtt_ee54560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54560),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  ee64560  : dd4560 {
  int e;
  virtual void  foo(); // _ZN7ee645603fooEv
  virtual void  bar(); // _ZN7ee645603barEv
  ~ee64560(); // tgen
  ee64560(); // tgen
};
//SIG(1 ee64560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64560 ::foo(){vfunc_called(this, "_ZN7ee645603fooEv");}
void  ee64560 ::bar(){vfunc_called(this, "_ZN7ee645603barEv");}
ee64560 ::~ee64560(){ note_dtor("ee64560", this);} // tgen
ee64560 ::ee64560(){ note_ctor("ee64560", this);} // tgen

static void Test_ee64560()
{
  extern Class_Descriptor cd_ee64560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64560, buf);
    ee64560 *dp, &lv = *(dp=new (buf) ee64560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee64560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(24,16), "ee64560");
    check_base_class_offset(lv, (cc560*)(dd4560*), 0, "ee64560");
    check_base_class_offset(lv, (dd4560*), 0, "ee64560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64560.e");
    test_class_info(&lv, &cd_ee64560);
    dp->~ee64560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64560(Test_ee64560, "ee64560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64560C1Ev();
extern void _ZN7ee64560D1Ev();
Name_Map name_map_ee64560[] = {
  NSPAIR(_ZN7ee64560C1Ev),
  NSPAIR(_ZN7ee64560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee64560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64560[];
extern void _ZN7ee645603barEv();
extern void _ZN7ee645603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee645603barEv,_ZTv0_n12_N7ee645603barEv)();
extern void ABISELECT(_ZThn24_N7ee645603barEv,_ZThn16_N7ee645603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee645603fooEv,_ZTv0_n16_N7ee645603fooEv)();
extern void ABISELECT(_ZThn24_N7ee645603fooEv,_ZThn16_N7ee645603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64560[0]),
  (VTBL_ENTRY)&_ZN7ee645603barEv,
  (VTBL_ENTRY)&_ZN7ee645603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee645603barEv,_ZTv0_n12_N7ee645603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee645603fooEv,_ZTv0_n16_N7ee645603fooEv),
};
extern VTBL_ENTRY _ZTV7ee64560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee64560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee64560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee64560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee64560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee64560[] = {
  {&(_ZTV7ee64560[3]),  3,11},
  {&(_tg__ZTV6dd4560__7ee64560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee64560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee64560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee64560[4]),  4,6},
  {&(_ZTV7ee64560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64560[];
extern  VTBL_ENTRY _ZTV7ee64560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64560[];
static VTBL_ENTRY alt_thunk_names319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45603barEv,_ZThn16_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee645603fooEv,_ZTv0_n16_N7ee645603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee645603fooEv,_ZThn16_N7ee645603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee645603barEv,_ZTv0_n12_N7ee645603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee645603barEv,_ZThn16_N7ee645603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64560 = {  "ee64560", // class name
  bases_ee64560, 4,
  &(vtc_ee64560[0]), // expected_vtbl_contents
  &(vtt_ee64560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names319,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74560  : virtual dd4560 {
  int e;
  virtual void  foo(); // _ZN7ee745603fooEv
  virtual void  bar(); // _ZN7ee745603barEv
  ~ee74560(); // tgen
  ee74560(); // tgen
};
//SIG(1 ee74560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74560 ::foo(){vfunc_called(this, "_ZN7ee745603fooEv");}
void  ee74560 ::bar(){vfunc_called(this, "_ZN7ee745603barEv");}
ee74560 ::~ee74560(){ note_dtor("ee74560", this);} // tgen
ee74560 ::ee74560(){ note_ctor("ee74560", this);} // tgen

static void Test_ee74560()
{
  extern Class_Descriptor cd_ee74560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74560, buf);
    ee74560 *dp, &lv = *(dp=new (buf) ee74560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee74560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd4560*), ABISELECT(32,20), "ee74560");
    check_base_class_offset(lv, (cc560*)(dd4560*), ABISELECT(16,8), "ee74560");
    check_base_class_offset(lv, (dd4560*), ABISELECT(16,8), "ee74560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74560.e");
    test_class_info(&lv, &cd_ee74560);
    dp->~ee74560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74560(Test_ee74560, "ee74560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74560C1Ev();
extern void _ZN7ee74560D1Ev();
Name_Map name_map_ee74560[] = {
  NSPAIR(_ZN7ee74560C1Ev),
  NSPAIR(_ZN7ee74560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd4560;
extern VTBL_ENTRY _ZTI6dd4560[];
extern  VTBL_ENTRY _ZTV6dd4560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4560[];
static Base_Class bases_ee74560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74560[];
extern void _ZN7ee745603fooEv();
extern void _ZN7ee745603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee745603barEv,_ZTv0_n16_N7ee745603barEv)();
extern void ABISELECT(_ZThn16_N7ee745603barEv,_ZThn8_N7ee745603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee745603barEv,_ZTv0_n12_N7ee745603barEv)();
extern void ABISELECT(_ZThn32_N7ee745603barEv,_ZThn20_N7ee745603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee745603fooEv,_ZTv0_n16_N7ee745603fooEv)();
extern void ABISELECT(_ZThn32_N7ee745603fooEv,_ZThn20_N7ee745603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74560[0]),
  (VTBL_ENTRY)&_ZN7ee745603fooEv,
  (VTBL_ENTRY)&_ZN7ee745603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee745603barEv,_ZTv0_n16_N7ee745603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee745603barEv,_ZTv0_n12_N7ee745603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee745603fooEv,_ZTv0_n16_N7ee745603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74560[];
extern void _ZN6dd45603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4560__7ee74560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&_ZN6dd45603barEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd4560__7ee74560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd4560__7ee74560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv)();
extern void ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4560__7ee74560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee74560[] = {
  {&(_ZTV7ee74560[4]),  4,17},
  {&(_ZTV7ee74560[10]),  10,17},
  {&(_ZTV7ee74560[15]),  15,17},
  {&(_tg__ZTV6dd4560__7ee74560[3]),  3,4},
  {&(_tg__ZTV5cc5606dd4560__7ee74560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd4560__7ee74560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4560__7ee74560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74560[];
extern  VTBL_ENTRY _ZTV7ee74560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74560[];
static VTBL_ENTRY alt_thunk_names320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd45603barEv,_ZTv0_n12_N6dd45603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45603barEv,_ZThn12_N6dd45603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee745603fooEv,_ZTv0_n16_N7ee745603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee745603fooEv,_ZThn20_N7ee745603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee745603barEv,_ZTv0_n12_N7ee745603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee745603barEv,_ZThn20_N7ee745603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee745603barEv,_ZTv0_n16_N7ee745603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee745603barEv,_ZThn8_N7ee745603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74560 = {  "ee74560", // class name
  bases_ee74560, 4,
  &(vtc_ee74560[0]), // expected_vtbl_contents
  &(vtt_ee74560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names320,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5560  : virtual cc560 {
  int d;
  virtual void  bar(); // _ZN6dd55603barEv
  ~dd5560(); // tgen
  dd5560(); // tgen
};
//SIG(-1 dd5560) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd5560 ::bar(){vfunc_called(this, "_ZN6dd55603barEv");}
dd5560 ::~dd5560(){ note_dtor("dd5560", this);} // tgen
dd5560 ::dd5560(){ note_ctor("dd5560", this);} // tgen

static void Test_dd5560()
{
  extern Class_Descriptor cd_dd5560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5560, buf);
    dd5560 *dp, &lv = *(dp=new (buf) dd5560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd5560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,16), "dd5560");
    check_base_class_offset(lv, (cc560*), ABISELECT(16,8), "dd5560");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5560.d");
    test_class_info(&lv, &cd_dd5560);
    dp->~dd5560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5560(Test_dd5560, "dd5560", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5560C1Ev();
extern void _ZN6dd5560D1Ev();
Name_Map name_map_dd5560[] = {
  NSPAIR(_ZN6dd5560C1Ev),
  NSPAIR(_ZN6dd5560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd5560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5560[];
extern void _ZN6dd55603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_dd5560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV6dd5560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd5560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd5560[] = {
  {&(_ZTV6dd5560[4]),  4,16},
  {&(_ZTV6dd5560[9]),  9,16},
  {&(_ZTV6dd5560[14]),  14,16},
  {&(_tg__ZTV5cc560__6dd5560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd5560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static VTBL_ENTRY alt_thunk_names321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5560 = {  "dd5560", // class name
  bases_dd5560, 3,
  &(vtc_dd5560[0]), // expected_vtbl_contents
  &(vtt_dd5560[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5560),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  ee05560  : dd5560 {
  int e;
  ~ee05560(); // tgen
  ee05560(); // tgen
};
//SIG(1 ee05560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee05560 ::~ee05560(){ note_dtor("ee05560", this);} // tgen
ee05560 ::ee05560(){ note_ctor("ee05560", this);} // tgen

static void Test_ee05560()
{
  extern Class_Descriptor cd_ee05560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05560, buf);
    ee05560 *dp, &lv = *(dp=new (buf) ee05560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee05560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee05560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(16,12), "ee05560");
    check_base_class_offset(lv, (dd5560*), 0, "ee05560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05560.e");
    test_class_info(&lv, &cd_ee05560);
    dp->~ee05560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05560(Test_ee05560, "ee05560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05560C1Ev();
extern void _ZN7ee05560D1Ev();
Name_Map name_map_ee05560[] = {
  NSPAIR(_ZN7ee05560C1Ev),
  NSPAIR(_ZN7ee05560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee05560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05560[];
extern void _ZN6dd55603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee05560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee05560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee05560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee05560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee05560[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee05560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee05560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee05560[] = {
  {&(_ZTV7ee05560[4]),  4,16},
  {&(_tg__ZTV6dd5560__7ee05560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee05560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee05560[4]),  4,6},
  {&(_ZTV7ee05560[9]),  9,16},
  {&(_ZTV7ee05560[14]),  14,16},
  {&(_tg__ZTV5cc560__7ee05560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee05560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05560[];
extern  VTBL_ENTRY _ZTV7ee05560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05560[];
static VTBL_ENTRY alt_thunk_names322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05560 = {  "ee05560", // class name
  bases_ee05560, 4,
  &(vtc_ee05560[0]), // expected_vtbl_contents
  &(vtt_ee05560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names322,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15560  : virtual dd5560 {
  int e;
  ~ee15560(); // tgen
  ee15560(); // tgen
};
//SIG(1 ee15560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee15560 ::~ee15560(){ note_dtor("ee15560", this);} // tgen
ee15560 ::ee15560(){ note_ctor("ee15560", this);} // tgen

static void Test_ee15560()
{
  extern Class_Descriptor cd_ee15560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15560, buf);
    ee15560 *dp, &lv = *(dp=new (buf) ee15560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee15560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee15560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(32,16), "ee15560");
    check_base_class_offset(lv, (dd5560*), ABISELECT(16,8), "ee15560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15560.e");
    test_class_info(&lv, &cd_ee15560);
    dp->~ee15560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15560(Test_ee15560, "ee15560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15560C1Ev();
extern void _ZN7ee15560D1Ev();
Name_Map name_map_ee15560[] = {
  NSPAIR(_ZN7ee15560C1Ev),
  NSPAIR(_ZN7ee15560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee15560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15560[];
extern void _ZN6dd55603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee15560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15560[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee15560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee15560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee15560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee15560[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee15560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee15560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee15560[] = {
  {&(_ZTV7ee15560[5]),  5,22},
  {&(_ZTV7ee15560[10]),  10,22},
  {&(_ZTV7ee15560[15]),  15,22},
  {&(_ZTV7ee15560[20]),  20,22},
  {&(_tg__ZTV6dd5560__7ee15560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee15560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee15560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee15560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee15560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15560[];
extern  VTBL_ENTRY _ZTV7ee15560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15560[];
static VTBL_ENTRY alt_thunk_names323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15560 = {  "ee15560", // class name
  bases_ee15560, 4,
  &(vtc_ee15560[0]), // expected_vtbl_contents
  &(vtt_ee15560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15560),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names323,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25560  : dd5560 {
  int e;
  virtual void  foo(); // _ZN7ee255603fooEv
  ~ee25560(); // tgen
  ee25560(); // tgen
};
//SIG(1 ee25560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee25560 ::foo(){vfunc_called(this, "_ZN7ee255603fooEv");}
ee25560 ::~ee25560(){ note_dtor("ee25560", this);} // tgen
ee25560 ::ee25560(){ note_ctor("ee25560", this);} // tgen

static void Test_ee25560()
{
  extern Class_Descriptor cd_ee25560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25560, buf);
    ee25560 *dp, &lv = *(dp=new (buf) ee25560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee25560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee25560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(16,12), "ee25560");
    check_base_class_offset(lv, (dd5560*), 0, "ee25560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25560.e");
    test_class_info(&lv, &cd_ee25560);
    dp->~ee25560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25560(Test_ee25560, "ee25560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25560C1Ev();
extern void _ZN7ee25560D1Ev();
Name_Map name_map_ee25560[] = {
  NSPAIR(_ZN7ee25560C1Ev),
  NSPAIR(_ZN7ee25560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee25560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25560[];
extern void _ZN6dd55603barEv();
extern void _ZN7ee255603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee255603fooEv,_ZTv0_n16_N7ee255603fooEv)();
extern void ABISELECT(_ZThn32_N7ee255603fooEv,_ZThn20_N7ee255603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
  (VTBL_ENTRY)&_ZN7ee255603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee255603fooEv,_ZTv0_n16_N7ee255603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee25560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee25560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee25560[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee25560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee25560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee25560[] = {
  {&(_ZTV7ee25560[4]),  4,17},
  {&(_tg__ZTV6dd5560__7ee25560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee25560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee25560[4]),  4,6},
  {&(_ZTV7ee25560[10]),  10,17},
  {&(_ZTV7ee25560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee25560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee25560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25560[];
extern  VTBL_ENTRY _ZTV7ee25560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25560[];
static VTBL_ENTRY alt_thunk_names324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee255603fooEv,_ZTv0_n16_N7ee255603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee255603fooEv,_ZThn20_N7ee255603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25560 = {  "ee25560", // class name
  bases_ee25560, 4,
  &(vtc_ee25560[0]), // expected_vtbl_contents
  &(vtt_ee25560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names324,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35560  : virtual dd5560 {
  int e;
  virtual void  foo(); // _ZN7ee355603fooEv
  ~ee35560(); // tgen
  ee35560(); // tgen
};
//SIG(1 ee35560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee35560 ::foo(){vfunc_called(this, "_ZN7ee355603fooEv");}
ee35560 ::~ee35560(){ note_dtor("ee35560", this);} // tgen
ee35560 ::ee35560(){ note_ctor("ee35560", this);} // tgen

static void Test_ee35560()
{
  extern Class_Descriptor cd_ee35560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35560, buf);
    ee35560 *dp, &lv = *(dp=new (buf) ee35560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee35560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee35560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(32,16), "ee35560");
    check_base_class_offset(lv, (dd5560*), ABISELECT(16,8), "ee35560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35560.e");
    test_class_info(&lv, &cd_ee35560);
    dp->~ee35560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35560(Test_ee35560, "ee35560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35560C1Ev();
extern void _ZN7ee35560D1Ev();
Name_Map name_map_ee35560[] = {
  NSPAIR(_ZN7ee35560C1Ev),
  NSPAIR(_ZN7ee35560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee35560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35560[];
extern void _ZN7ee355603fooEv();
extern void _ZN6dd55603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee355603fooEv,_ZTv0_n16_N7ee355603fooEv)();
extern void ABISELECT(_ZThn48_N7ee355603fooEv,_ZThn24_N7ee355603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35560[0]),
  (VTBL_ENTRY)&_ZN7ee355603fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee355603fooEv,_ZTv0_n16_N7ee355603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee35560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee35560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee35560[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee35560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee35560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee35560[] = {
  {&(_ZTV7ee35560[5]),  5,23},
  {&(_ZTV7ee35560[11]),  11,23},
  {&(_ZTV7ee35560[16]),  16,23},
  {&(_ZTV7ee35560[21]),  21,23},
  {&(_tg__ZTV6dd5560__7ee35560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee35560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee35560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee35560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee35560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35560[];
extern  VTBL_ENTRY _ZTV7ee35560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35560[];
static VTBL_ENTRY alt_thunk_names325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee355603fooEv,_ZTv0_n16_N7ee355603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee355603fooEv,_ZThn24_N7ee355603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35560 = {  "ee35560", // class name
  bases_ee35560, 4,
  &(vtc_ee35560[0]), // expected_vtbl_contents
  &(vtt_ee35560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35560),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names325,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45560  : dd5560 {
  int e;
  virtual void  bar(); // _ZN7ee455603barEv
  ~ee45560(); // tgen
  ee45560(); // tgen
};
//SIG(1 ee45560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee45560 ::bar(){vfunc_called(this, "_ZN7ee455603barEv");}
ee45560 ::~ee45560(){ note_dtor("ee45560", this);} // tgen
ee45560 ::ee45560(){ note_ctor("ee45560", this);} // tgen

static void Test_ee45560()
{
  extern Class_Descriptor cd_ee45560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45560, buf);
    ee45560 *dp, &lv = *(dp=new (buf) ee45560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee45560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee45560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(16,12), "ee45560");
    check_base_class_offset(lv, (dd5560*), 0, "ee45560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45560.e");
    test_class_info(&lv, &cd_ee45560);
    dp->~ee45560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45560(Test_ee45560, "ee45560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45560C1Ev();
extern void _ZN7ee45560D1Ev();
Name_Map name_map_ee45560[] = {
  NSPAIR(_ZN7ee45560C1Ev),
  NSPAIR(_ZN7ee45560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee45560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45560[];
extern void _ZN7ee455603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee455603barEv,_ZTv0_n16_N7ee455603barEv)();
extern void ABISELECT(_ZThn16_N7ee455603barEv,_ZThn12_N7ee455603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee455603barEv,_ZTv0_n12_N7ee455603barEv)();
extern void ABISELECT(_ZThn32_N7ee455603barEv,_ZThn20_N7ee455603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee45560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45560[0]),
  (VTBL_ENTRY)&_ZN7ee455603barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee455603barEv,_ZTv0_n16_N7ee455603barEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee455603barEv,_ZTv0_n12_N7ee455603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee45560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee45560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee45560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee45560[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee45560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee45560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee45560[] = {
  {&(_ZTV7ee45560[4]),  4,16},
  {&(_tg__ZTV6dd5560__7ee45560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee45560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee45560[4]),  4,6},
  {&(_ZTV7ee45560[9]),  9,16},
  {&(_ZTV7ee45560[14]),  14,16},
  {&(_tg__ZTV5cc560__7ee45560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee45560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45560[];
extern  VTBL_ENTRY _ZTV7ee45560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45560[];
static VTBL_ENTRY alt_thunk_names326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee455603barEv,_ZTv0_n12_N7ee455603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee455603barEv,_ZThn20_N7ee455603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee455603barEv,_ZTv0_n16_N7ee455603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee455603barEv,_ZThn12_N7ee455603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45560 = {  "ee45560", // class name
  bases_ee45560, 4,
  &(vtc_ee45560[0]), // expected_vtbl_contents
  &(vtt_ee45560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45560),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names326,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55560  : virtual dd5560 {
  int e;
  virtual void  bar(); // _ZN7ee555603barEv
  ~ee55560(); // tgen
  ee55560(); // tgen
};
//SIG(1 ee55560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee55560 ::bar(){vfunc_called(this, "_ZN7ee555603barEv");}
ee55560 ::~ee55560(){ note_dtor("ee55560", this);} // tgen
ee55560 ::ee55560(){ note_ctor("ee55560", this);} // tgen

static void Test_ee55560()
{
  extern Class_Descriptor cd_ee55560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55560, buf);
    ee55560 *dp, &lv = *(dp=new (buf) ee55560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee55560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee55560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(32,16), "ee55560");
    check_base_class_offset(lv, (dd5560*), ABISELECT(16,8), "ee55560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55560.e");
    test_class_info(&lv, &cd_ee55560);
    dp->~ee55560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55560(Test_ee55560, "ee55560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55560C1Ev();
extern void _ZN7ee55560D1Ev();
Name_Map name_map_ee55560[] = {
  NSPAIR(_ZN7ee55560C1Ev),
  NSPAIR(_ZN7ee55560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee55560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55560[];
extern void _ZN7ee555603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee555603barEv,_ZTv0_n20_N7ee555603barEv)();
extern void ABISELECT(_ZThn16_N7ee555603barEv,_ZThn8_N7ee555603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee555603barEv,_ZTv0_n16_N7ee555603barEv)();
extern void ABISELECT(_ZThn32_N7ee555603barEv,_ZThn16_N7ee555603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee555603barEv,_ZTv0_n12_N7ee555603barEv)();
extern void ABISELECT(_ZThn48_N7ee555603barEv,_ZThn24_N7ee555603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY vtc_ee55560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55560[0]),
  (VTBL_ENTRY)&_ZN7ee555603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee555603barEv,_ZTv0_n20_N7ee555603barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee555603barEv,_ZTv0_n16_N7ee555603barEv),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee555603barEv,_ZTv0_n12_N7ee555603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern VTBL_ENTRY _ZTV7ee55560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee55560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee55560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee55560[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee55560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee55560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee55560[] = {
  {&(_ZTV7ee55560[5]),  5,23},
  {&(_ZTV7ee55560[11]),  11,23},
  {&(_ZTV7ee55560[16]),  16,23},
  {&(_ZTV7ee55560[21]),  21,23},
  {&(_tg__ZTV6dd5560__7ee55560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee55560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee55560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee55560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee55560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55560[];
extern  VTBL_ENTRY _ZTV7ee55560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55560[];
static VTBL_ENTRY alt_thunk_names327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee555603barEv,_ZTv0_n12_N7ee555603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee555603barEv,_ZThn24_N7ee555603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee555603barEv,_ZTv0_n16_N7ee555603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee555603barEv,_ZThn16_N7ee555603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee555603barEv,_ZTv0_n20_N7ee555603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee555603barEv,_ZThn8_N7ee555603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55560 = {  "ee55560", // class name
  bases_ee55560, 4,
  &(vtc_ee55560[0]), // expected_vtbl_contents
  &(vtt_ee55560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55560),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names327,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65560  : dd5560 {
  int e;
  virtual void  foo(); // _ZN7ee655603fooEv
  virtual void  bar(); // _ZN7ee655603barEv
  ~ee65560(); // tgen
  ee65560(); // tgen
};
//SIG(1 ee65560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65560 ::foo(){vfunc_called(this, "_ZN7ee655603fooEv");}
void  ee65560 ::bar(){vfunc_called(this, "_ZN7ee655603barEv");}
ee65560 ::~ee65560(){ note_dtor("ee65560", this);} // tgen
ee65560 ::ee65560(){ note_ctor("ee65560", this);} // tgen

static void Test_ee65560()
{
  extern Class_Descriptor cd_ee65560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65560, buf);
    ee65560 *dp, &lv = *(dp=new (buf) ee65560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee65560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee65560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(16,12), "ee65560");
    check_base_class_offset(lv, (dd5560*), 0, "ee65560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65560.e");
    test_class_info(&lv, &cd_ee65560);
    dp->~ee65560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65560(Test_ee65560, "ee65560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65560C1Ev();
extern void _ZN7ee65560D1Ev();
Name_Map name_map_ee65560[] = {
  NSPAIR(_ZN7ee65560C1Ev),
  NSPAIR(_ZN7ee65560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee65560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65560[];
extern void _ZN7ee655603barEv();
extern void _ZN7ee655603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee655603barEv,_ZTv0_n16_N7ee655603barEv)();
extern void ABISELECT(_ZThn16_N7ee655603barEv,_ZThn12_N7ee655603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee655603barEv,_ZTv0_n12_N7ee655603barEv)();
extern void ABISELECT(_ZThn32_N7ee655603barEv,_ZThn20_N7ee655603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee655603fooEv,_ZTv0_n16_N7ee655603fooEv)();
extern void ABISELECT(_ZThn32_N7ee655603fooEv,_ZThn20_N7ee655603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65560[0]),
  (VTBL_ENTRY)&_ZN7ee655603barEv,
  (VTBL_ENTRY)&_ZN7ee655603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee655603barEv,_ZTv0_n16_N7ee655603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee655603barEv,_ZTv0_n12_N7ee655603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee655603fooEv,_ZTv0_n16_N7ee655603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee65560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee65560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee65560[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee65560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee65560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee65560[] = {
  {&(_ZTV7ee65560[4]),  4,17},
  {&(_tg__ZTV6dd5560__7ee65560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee65560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee65560[4]),  4,6},
  {&(_ZTV7ee65560[10]),  10,17},
  {&(_ZTV7ee65560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee65560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee65560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65560[];
extern  VTBL_ENTRY _ZTV7ee65560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65560[];
static VTBL_ENTRY alt_thunk_names328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn20_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn12_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee655603fooEv,_ZTv0_n16_N7ee655603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee655603fooEv,_ZThn20_N7ee655603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee655603barEv,_ZTv0_n12_N7ee655603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee655603barEv,_ZThn20_N7ee655603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee655603barEv,_ZTv0_n16_N7ee655603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee655603barEv,_ZThn12_N7ee655603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65560 = {  "ee65560", // class name
  bases_ee65560, 4,
  &(vtc_ee65560[0]), // expected_vtbl_contents
  &(vtt_ee65560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65560),8, //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  ee75560  : virtual dd5560 {
  int e;
  virtual void  foo(); // _ZN7ee755603fooEv
  virtual void  bar(); // _ZN7ee755603barEv
  ~ee75560(); // tgen
  ee75560(); // tgen
};
//SIG(1 ee75560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75560 ::foo(){vfunc_called(this, "_ZN7ee755603fooEv");}
void  ee75560 ::bar(){vfunc_called(this, "_ZN7ee755603barEv");}
ee75560 ::~ee75560(){ note_dtor("ee75560", this);} // tgen
ee75560 ::ee75560(){ note_ctor("ee75560", this);} // tgen

static void Test_ee75560()
{
  extern Class_Descriptor cd_ee75560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75560, buf);
    ee75560 *dp, &lv = *(dp=new (buf) ee75560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee75560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee75560");
    check_base_class_offset(lv, (cc560*)(dd5560*), ABISELECT(32,16), "ee75560");
    check_base_class_offset(lv, (dd5560*), ABISELECT(16,8), "ee75560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75560.e");
    test_class_info(&lv, &cd_ee75560);
    dp->~ee75560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75560(Test_ee75560, "ee75560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75560C1Ev();
extern void _ZN7ee75560D1Ev();
Name_Map name_map_ee75560[] = {
  NSPAIR(_ZN7ee75560C1Ev),
  NSPAIR(_ZN7ee75560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd5560;
extern VTBL_ENTRY _ZTI6dd5560[];
extern  VTBL_ENTRY _ZTV6dd5560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5560[];
static Base_Class bases_ee75560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75560[];
extern void _ZN7ee755603fooEv();
extern void _ZN7ee755603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee755603barEv,_ZTv0_n20_N7ee755603barEv)();
extern void ABISELECT(_ZThn16_N7ee755603barEv,_ZThn8_N7ee755603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee755603barEv,_ZTv0_n16_N7ee755603barEv)();
extern void ABISELECT(_ZThn32_N7ee755603barEv,_ZThn16_N7ee755603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee755603barEv,_ZTv0_n12_N7ee755603barEv)();
extern void ABISELECT(_ZThn48_N7ee755603barEv,_ZThn24_N7ee755603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee755603fooEv,_ZTv0_n16_N7ee755603fooEv)();
extern void ABISELECT(_ZThn48_N7ee755603fooEv,_ZThn24_N7ee755603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75560[0]),
  (VTBL_ENTRY)&_ZN7ee755603fooEv,
  (VTBL_ENTRY)&_ZN7ee755603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee755603barEv,_ZTv0_n20_N7ee755603barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee755603barEv,_ZTv0_n16_N7ee755603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee755603barEv,_ZTv0_n12_N7ee755603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee755603fooEv,_ZTv0_n16_N7ee755603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75560[];
extern void _ZN6dd55603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5560__7ee75560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&_ZN6dd55603barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv)();
extern void ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd5560__7ee75560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv)();
extern void ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5560__7ee75560[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee75560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee75560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee75560[] = {
  {&(_ZTV7ee75560[5]),  5,24},
  {&(_ZTV7ee75560[12]),  12,24},
  {&(_ZTV7ee75560[17]),  17,24},
  {&(_ZTV7ee75560[22]),  22,24},
  {&(_tg__ZTV6dd5560__7ee75560[4]),  4,5},
  {&(_tg__ZTV5cc560__6dd5560__7ee75560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd5560__7ee75560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee75560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee75560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75560[];
extern  VTBL_ENTRY _ZTV7ee75560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75560[];
static VTBL_ENTRY alt_thunk_names329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd55603barEv,_ZTv0_n12_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55603barEv,_ZThn16_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55603barEv,_ZTv0_n16_N6dd55603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55603barEv,_ZThn8_N6dd55603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee755603fooEv,_ZTv0_n16_N7ee755603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee755603fooEv,_ZThn24_N7ee755603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee755603barEv,_ZTv0_n12_N7ee755603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee755603barEv,_ZThn24_N7ee755603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee755603barEv,_ZTv0_n16_N7ee755603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee755603barEv,_ZThn16_N7ee755603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee755603barEv,_ZTv0_n20_N7ee755603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee755603barEv,_ZThn8_N7ee755603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75560 = {  "ee75560", // class name
  bases_ee75560, 4,
  &(vtc_ee75560[0]), // expected_vtbl_contents
  &(vtt_ee75560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75560),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75560),9, //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  dd6560  : cc560 {
  int d;
  virtual void  bar(); // _ZN6dd65603barEv
  virtual void  foo(); // _ZN6dd65603fooEv
  ~dd6560(); // tgen
  dd6560(); // tgen
};
//SIG(-1 dd6560) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd6560 ::bar(){vfunc_called(this, "_ZN6dd65603barEv");}
void  dd6560 ::foo(){vfunc_called(this, "_ZN6dd65603fooEv");}
dd6560 ::~dd6560(){ note_dtor("dd6560", this);} // tgen
dd6560 ::dd6560(){ note_ctor("dd6560", this);} // tgen

static void Test_dd6560()
{
  extern Class_Descriptor cd_dd6560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6560, buf);
    dd6560 *dp, &lv = *(dp=new (buf) dd6560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd6560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(16,12), "dd6560");
    check_base_class_offset(lv, (cc560*), 0, "dd6560");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6560.d");
    test_class_info(&lv, &cd_dd6560);
    dp->~dd6560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6560(Test_dd6560, "dd6560", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6560C1Ev();
extern void _ZN6dd6560D1Ev();
Name_Map name_map_dd6560[] = {
  NSPAIR(_ZN6dd6560C1Ev),
  NSPAIR(_ZN6dd6560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd6560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
extern VTBL_ENTRY _ZTV6dd6560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd6560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd6560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd6560[] = {
  {&(_ZTV6dd6560[3]),  3,11},
  {&(_tg__ZTV5cc560__6dd6560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd6560[4]),  4,6},
  {&(_ZTV6dd6560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static VTBL_ENTRY alt_thunk_names330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6560 = {  "dd6560", // class name
  bases_dd6560, 3,
  &(vtc_dd6560[0]), // expected_vtbl_contents
  &(vtt_dd6560[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6560),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names330,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06560  : dd6560 {
  int e;
  ~ee06560(); // tgen
  ee06560(); // tgen
};
//SIG(1 ee06560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee06560 ::~ee06560(){ note_dtor("ee06560", this);} // tgen
ee06560 ::ee06560(){ note_ctor("ee06560", this);} // tgen

static void Test_ee06560()
{
  extern Class_Descriptor cd_ee06560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06560, buf);
    ee06560 *dp, &lv = *(dp=new (buf) ee06560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee06560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(24,16), "ee06560");
    check_base_class_offset(lv, (cc560*)(dd6560*), 0, "ee06560");
    check_base_class_offset(lv, (dd6560*), 0, "ee06560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06560.e");
    test_class_info(&lv, &cd_ee06560);
    dp->~ee06560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06560(Test_ee06560, "ee06560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06560C1Ev();
extern void _ZN7ee06560D1Ev();
Name_Map name_map_ee06560[] = {
  NSPAIR(_ZN7ee06560C1Ev),
  NSPAIR(_ZN7ee06560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee06560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
extern VTBL_ENTRY _ZTV7ee06560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee06560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee06560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee06560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee06560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee06560[] = {
  {&(_ZTV7ee06560[3]),  3,11},
  {&(_tg__ZTV6dd6560__7ee06560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee06560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee06560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee06560[4]),  4,6},
  {&(_ZTV7ee06560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06560[];
extern  VTBL_ENTRY _ZTV7ee06560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06560[];
static VTBL_ENTRY alt_thunk_names331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06560 = {  "ee06560", // class name
  bases_ee06560, 4,
  &(vtc_ee06560[0]), // expected_vtbl_contents
  &(vtt_ee06560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06560),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  ee16560  : virtual dd6560 {
  int e;
  ~ee16560(); // tgen
  ee16560(); // tgen
};
//SIG(1 ee16560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee16560 ::~ee16560(){ note_dtor("ee16560", this);} // tgen
ee16560 ::ee16560(){ note_ctor("ee16560", this);} // tgen

static void Test_ee16560()
{
  extern Class_Descriptor cd_ee16560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16560, buf);
    ee16560 *dp, &lv = *(dp=new (buf) ee16560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee16560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(32,20), "ee16560");
    check_base_class_offset(lv, (cc560*)(dd6560*), ABISELECT(16,8), "ee16560");
    check_base_class_offset(lv, (dd6560*), ABISELECT(16,8), "ee16560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16560.e");
    test_class_info(&lv, &cd_ee16560);
    dp->~ee16560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16560(Test_ee16560, "ee16560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16560C1Ev();
extern void _ZN7ee16560D1Ev();
Name_Map name_map_ee16560[] = {
  NSPAIR(_ZN7ee16560C1Ev),
  NSPAIR(_ZN7ee16560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee16560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16560[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
extern VTBL_ENTRY _ZTV7ee16560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee16560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee16560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee16560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee16560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee16560[] = {
  {&(_ZTV7ee16560[4]),  4,17},
  {&(_ZTV7ee16560[9]),  9,17},
  {&(_ZTV7ee16560[15]),  15,17},
  {&(_tg__ZTV6dd6560__7ee16560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee16560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee16560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee16560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16560[];
extern  VTBL_ENTRY _ZTV7ee16560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16560[];
static VTBL_ENTRY alt_thunk_names332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16560 = {  "ee16560", // class name
  bases_ee16560, 4,
  &(vtc_ee16560[0]), // expected_vtbl_contents
  &(vtt_ee16560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names332,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26560  : dd6560 {
  int e;
  virtual void  foo(); // _ZN7ee265603fooEv
  ~ee26560(); // tgen
  ee26560(); // tgen
};
//SIG(1 ee26560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26560 ::foo(){vfunc_called(this, "_ZN7ee265603fooEv");}
ee26560 ::~ee26560(){ note_dtor("ee26560", this);} // tgen
ee26560 ::ee26560(){ note_ctor("ee26560", this);} // tgen

static void Test_ee26560()
{
  extern Class_Descriptor cd_ee26560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26560, buf);
    ee26560 *dp, &lv = *(dp=new (buf) ee26560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee26560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(24,16), "ee26560");
    check_base_class_offset(lv, (cc560*)(dd6560*), 0, "ee26560");
    check_base_class_offset(lv, (dd6560*), 0, "ee26560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26560.e");
    test_class_info(&lv, &cd_ee26560);
    dp->~ee26560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26560(Test_ee26560, "ee26560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26560C1Ev();
extern void _ZN7ee26560D1Ev();
Name_Map name_map_ee26560[] = {
  NSPAIR(_ZN7ee26560C1Ev),
  NSPAIR(_ZN7ee26560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee26560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26560[];
extern void _ZN6dd65603barEv();
extern void _ZN7ee265603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee265603fooEv,_ZTv0_n16_N7ee265603fooEv)();
extern void ABISELECT(_ZThn24_N7ee265603fooEv,_ZThn16_N7ee265603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN7ee265603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee265603fooEv,_ZTv0_n16_N7ee265603fooEv),
};
extern VTBL_ENTRY _ZTV7ee26560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee26560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee26560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee26560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee26560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee26560[] = {
  {&(_ZTV7ee26560[3]),  3,11},
  {&(_tg__ZTV6dd6560__7ee26560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee26560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee26560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee26560[4]),  4,6},
  {&(_ZTV7ee26560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26560[];
extern  VTBL_ENTRY _ZTV7ee26560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26560[];
static VTBL_ENTRY alt_thunk_names333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee265603fooEv,_ZTv0_n16_N7ee265603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee265603fooEv,_ZThn16_N7ee265603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26560 = {  "ee26560", // class name
  bases_ee26560, 4,
  &(vtc_ee26560[0]), // expected_vtbl_contents
  &(vtt_ee26560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26560),6, //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  ee36560  : virtual dd6560 {
  int e;
  virtual void  foo(); // _ZN7ee365603fooEv
  ~ee36560(); // tgen
  ee36560(); // tgen
};
//SIG(1 ee36560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36560 ::foo(){vfunc_called(this, "_ZN7ee365603fooEv");}
ee36560 ::~ee36560(){ note_dtor("ee36560", this);} // tgen
ee36560 ::ee36560(){ note_ctor("ee36560", this);} // tgen

static void Test_ee36560()
{
  extern Class_Descriptor cd_ee36560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36560, buf);
    ee36560 *dp, &lv = *(dp=new (buf) ee36560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee36560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(32,20), "ee36560");
    check_base_class_offset(lv, (cc560*)(dd6560*), ABISELECT(16,8), "ee36560");
    check_base_class_offset(lv, (dd6560*), ABISELECT(16,8), "ee36560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36560.e");
    test_class_info(&lv, &cd_ee36560);
    dp->~ee36560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36560(Test_ee36560, "ee36560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36560C1Ev();
extern void _ZN7ee36560D1Ev();
Name_Map name_map_ee36560[] = {
  NSPAIR(_ZN7ee36560C1Ev),
  NSPAIR(_ZN7ee36560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee36560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36560[];
extern void _ZN7ee365603fooEv();
extern void _ZN6dd65603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee365603fooEv,_ZTv0_n20_N7ee365603fooEv)();
extern void ABISELECT(_ZThn16_N7ee365603fooEv,_ZThn8_N7ee365603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee365603fooEv,_ZTv0_n16_N7ee365603fooEv)();
extern void ABISELECT(_ZThn32_N7ee365603fooEv,_ZThn20_N7ee365603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36560[0]),
  (VTBL_ENTRY)&_ZN7ee365603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee365603fooEv,_ZTv0_n20_N7ee365603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee365603fooEv,_ZTv0_n16_N7ee365603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee36560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee36560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee36560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee36560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee36560[] = {
  {&(_ZTV7ee36560[4]),  4,18},
  {&(_ZTV7ee36560[10]),  10,18},
  {&(_ZTV7ee36560[16]),  16,18},
  {&(_tg__ZTV6dd6560__7ee36560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee36560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee36560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee36560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36560[];
extern  VTBL_ENTRY _ZTV7ee36560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36560[];
static VTBL_ENTRY alt_thunk_names334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee365603fooEv,_ZTv0_n16_N7ee365603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee365603fooEv,_ZThn20_N7ee365603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee365603fooEv,_ZTv0_n20_N7ee365603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee365603fooEv,_ZThn8_N7ee365603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36560 = {  "ee36560", // class name
  bases_ee36560, 4,
  &(vtc_ee36560[0]), // expected_vtbl_contents
  &(vtt_ee36560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36560),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36560),7, //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  ee46560  : dd6560 {
  int e;
  virtual void  bar(); // _ZN7ee465603barEv
  ~ee46560(); // tgen
  ee46560(); // tgen
};
//SIG(1 ee46560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46560 ::bar(){vfunc_called(this, "_ZN7ee465603barEv");}
ee46560 ::~ee46560(){ note_dtor("ee46560", this);} // tgen
ee46560 ::ee46560(){ note_ctor("ee46560", this);} // tgen

static void Test_ee46560()
{
  extern Class_Descriptor cd_ee46560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46560, buf);
    ee46560 *dp, &lv = *(dp=new (buf) ee46560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee46560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(24,16), "ee46560");
    check_base_class_offset(lv, (cc560*)(dd6560*), 0, "ee46560");
    check_base_class_offset(lv, (dd6560*), 0, "ee46560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46560.e");
    test_class_info(&lv, &cd_ee46560);
    dp->~ee46560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46560(Test_ee46560, "ee46560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46560C1Ev();
extern void _ZN7ee46560D1Ev();
Name_Map name_map_ee46560[] = {
  NSPAIR(_ZN7ee46560C1Ev),
  NSPAIR(_ZN7ee46560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee46560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46560[];
extern void _ZN7ee465603barEv();
extern void _ZN6dd65603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee465603barEv,_ZTv0_n12_N7ee465603barEv)();
extern void ABISELECT(_ZThn24_N7ee465603barEv,_ZThn16_N7ee465603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46560[0]),
  (VTBL_ENTRY)&_ZN7ee465603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee465603barEv,_ZTv0_n12_N7ee465603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
extern VTBL_ENTRY _ZTV7ee46560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee46560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee46560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee46560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee46560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee46560[] = {
  {&(_ZTV7ee46560[3]),  3,11},
  {&(_tg__ZTV6dd6560__7ee46560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee46560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee46560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee46560[4]),  4,6},
  {&(_ZTV7ee46560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46560[];
extern  VTBL_ENTRY _ZTV7ee46560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46560[];
static VTBL_ENTRY alt_thunk_names335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee465603barEv,_ZTv0_n12_N7ee465603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee465603barEv,_ZThn16_N7ee465603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46560 = {  "ee46560", // class name
  bases_ee46560, 4,
  &(vtc_ee46560[0]), // expected_vtbl_contents
  &(vtt_ee46560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46560),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  ee56560  : virtual dd6560 {
  int e;
  virtual void  bar(); // _ZN7ee565603barEv
  ~ee56560(); // tgen
  ee56560(); // tgen
};
//SIG(1 ee56560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56560 ::bar(){vfunc_called(this, "_ZN7ee565603barEv");}
ee56560 ::~ee56560(){ note_dtor("ee56560", this);} // tgen
ee56560 ::ee56560(){ note_ctor("ee56560", this);} // tgen

static void Test_ee56560()
{
  extern Class_Descriptor cd_ee56560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56560, buf);
    ee56560 *dp, &lv = *(dp=new (buf) ee56560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee56560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(32,20), "ee56560");
    check_base_class_offset(lv, (cc560*)(dd6560*), ABISELECT(16,8), "ee56560");
    check_base_class_offset(lv, (dd6560*), ABISELECT(16,8), "ee56560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56560.e");
    test_class_info(&lv, &cd_ee56560);
    dp->~ee56560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56560(Test_ee56560, "ee56560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56560C1Ev();
extern void _ZN7ee56560D1Ev();
Name_Map name_map_ee56560[] = {
  NSPAIR(_ZN7ee56560C1Ev),
  NSPAIR(_ZN7ee56560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee56560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56560[];
extern void _ZN7ee565603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee565603barEv,_ZTv0_n16_N7ee565603barEv)();
extern void ABISELECT(_ZThn16_N7ee565603barEv,_ZThn8_N7ee565603barEv)() __attribute__((weak));
extern void _ZN6dd65603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee565603barEv,_ZTv0_n12_N7ee565603barEv)();
extern void ABISELECT(_ZThn32_N7ee565603barEv,_ZThn20_N7ee565603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56560[0]),
  (VTBL_ENTRY)&_ZN7ee565603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee565603barEv,_ZTv0_n16_N7ee565603barEv),
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee565603barEv,_ZTv0_n12_N7ee565603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
extern VTBL_ENTRY _ZTV7ee56560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee56560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee56560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee56560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee56560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee56560[] = {
  {&(_ZTV7ee56560[4]),  4,18},
  {&(_ZTV7ee56560[10]),  10,18},
  {&(_ZTV7ee56560[16]),  16,18},
  {&(_tg__ZTV6dd6560__7ee56560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee56560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee56560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee56560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56560[];
extern  VTBL_ENTRY _ZTV7ee56560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56560[];
static VTBL_ENTRY alt_thunk_names336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee565603barEv,_ZTv0_n12_N7ee565603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee565603barEv,_ZThn20_N7ee565603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee565603barEv,_ZTv0_n16_N7ee565603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee565603barEv,_ZThn8_N7ee565603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56560 = {  "ee56560", // class name
  bases_ee56560, 4,
  &(vtc_ee56560[0]), // expected_vtbl_contents
  &(vtt_ee56560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56560),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56560),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  ee66560  : dd6560 {
  int e;
  virtual void  foo(); // _ZN7ee665603fooEv
  virtual void  bar(); // _ZN7ee665603barEv
  ~ee66560(); // tgen
  ee66560(); // tgen
};
//SIG(1 ee66560) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66560 ::foo(){vfunc_called(this, "_ZN7ee665603fooEv");}
void  ee66560 ::bar(){vfunc_called(this, "_ZN7ee665603barEv");}
ee66560 ::~ee66560(){ note_dtor("ee66560", this);} // tgen
ee66560 ::ee66560(){ note_ctor("ee66560", this);} // tgen

static void Test_ee66560()
{
  extern Class_Descriptor cd_ee66560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66560, buf);
    ee66560 *dp, &lv = *(dp=new (buf) ee66560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee66560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(24,16), "ee66560");
    check_base_class_offset(lv, (cc560*)(dd6560*), 0, "ee66560");
    check_base_class_offset(lv, (dd6560*), 0, "ee66560");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66560.e");
    test_class_info(&lv, &cd_ee66560);
    dp->~ee66560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66560(Test_ee66560, "ee66560", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66560C1Ev();
extern void _ZN7ee66560D1Ev();
Name_Map name_map_ee66560[] = {
  NSPAIR(_ZN7ee66560C1Ev),
  NSPAIR(_ZN7ee66560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee66560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66560[];
extern void _ZN7ee665603barEv();
extern void _ZN7ee665603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee665603barEv,_ZTv0_n12_N7ee665603barEv)();
extern void ABISELECT(_ZThn24_N7ee665603barEv,_ZThn16_N7ee665603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee665603fooEv,_ZTv0_n16_N7ee665603fooEv)();
extern void ABISELECT(_ZThn24_N7ee665603fooEv,_ZThn16_N7ee665603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66560[0]),
  (VTBL_ENTRY)&_ZN7ee665603barEv,
  (VTBL_ENTRY)&_ZN7ee665603fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee665603barEv,_ZTv0_n12_N7ee665603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee665603fooEv,_ZTv0_n16_N7ee665603fooEv),
};
extern VTBL_ENTRY _ZTV7ee66560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee66560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee66560[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee66560[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee66560[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee66560[] = {
  {&(_ZTV7ee66560[3]),  3,11},
  {&(_tg__ZTV6dd6560__7ee66560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee66560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee66560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee66560[4]),  4,6},
  {&(_ZTV7ee66560[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66560[];
extern  VTBL_ENTRY _ZTV7ee66560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66560[];
static VTBL_ENTRY alt_thunk_names337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603fooEv,_ZThn16_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65603barEv,_ZThn16_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5603barEv,_ZThn16_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee665603fooEv,_ZTv0_n16_N7ee665603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee665603fooEv,_ZThn16_N7ee665603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee665603barEv,_ZTv0_n12_N7ee665603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee665603barEv,_ZThn16_N7ee665603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66560 = {  "ee66560", // class name
  bases_ee66560, 4,
  &(vtc_ee66560[0]), // expected_vtbl_contents
  &(vtt_ee66560[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66560),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66560),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names337,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76560  : virtual dd6560 {
  int e;
  virtual void  foo(); // _ZN7ee765603fooEv
  virtual void  bar(); // _ZN7ee765603barEv
  ~ee76560(); // tgen
  ee76560(); // tgen
};
//SIG(1 ee76560) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76560 ::foo(){vfunc_called(this, "_ZN7ee765603fooEv");}
void  ee76560 ::bar(){vfunc_called(this, "_ZN7ee765603barEv");}
ee76560 ::~ee76560(){ note_dtor("ee76560", this);} // tgen
ee76560 ::ee76560(){ note_ctor("ee76560", this);} // tgen

static void Test_ee76560()
{
  extern Class_Descriptor cd_ee76560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76560, buf);
    ee76560 *dp, &lv = *(dp=new (buf) ee76560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee76560");
    check_base_class_offset(lv, (bb60*)(cc560*)(dd6560*), ABISELECT(32,20), "ee76560");
    check_base_class_offset(lv, (cc560*)(dd6560*), ABISELECT(16,8), "ee76560");
    check_base_class_offset(lv, (dd6560*), ABISELECT(16,8), "ee76560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76560.e");
    test_class_info(&lv, &cd_ee76560);
    dp->~ee76560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76560(Test_ee76560, "ee76560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76560C1Ev();
extern void _ZN7ee76560D1Ev();
Name_Map name_map_ee76560[] = {
  NSPAIR(_ZN7ee76560C1Ev),
  NSPAIR(_ZN7ee76560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd6560;
extern VTBL_ENTRY _ZTI6dd6560[];
extern  VTBL_ENTRY _ZTV6dd6560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6560[];
static Base_Class bases_ee76560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76560[];
extern void _ZN7ee765603fooEv();
extern void _ZN7ee765603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee765603barEv,_ZTv0_n16_N7ee765603barEv)();
extern void ABISELECT(_ZThn16_N7ee765603barEv,_ZThn8_N7ee765603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee765603fooEv,_ZTv0_n20_N7ee765603fooEv)();
extern void ABISELECT(_ZThn16_N7ee765603fooEv,_ZThn8_N7ee765603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee765603barEv,_ZTv0_n12_N7ee765603barEv)();
extern void ABISELECT(_ZThn32_N7ee765603barEv,_ZThn20_N7ee765603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee765603fooEv,_ZTv0_n16_N7ee765603fooEv)();
extern void ABISELECT(_ZThn32_N7ee765603fooEv,_ZThn20_N7ee765603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76560[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76560[0]),
  (VTBL_ENTRY)&_ZN7ee765603fooEv,
  (VTBL_ENTRY)&_ZN7ee765603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee765603barEv,_ZTv0_n16_N7ee765603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee765603fooEv,_ZTv0_n20_N7ee765603fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee765603barEv,_ZTv0_n12_N7ee765603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee765603fooEv,_ZTv0_n16_N7ee765603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76560[];
extern void _ZN6dd65603barEv();
extern void _ZN6dd65603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6560__7ee76560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&_ZN6dd65603barEv,
  (VTBL_ENTRY)&_ZN6dd65603fooEv,
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc5606dd6560__7ee76560[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc5606dd6560__7ee76560[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv)();
extern void ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv)();
extern void ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6560__7ee76560[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv),
};
static  VTT_ENTRY vtt_ee76560[] = {
  {&(_ZTV7ee76560[4]),  4,19},
  {&(_ZTV7ee76560[11]),  11,19},
  {&(_ZTV7ee76560[17]),  17,19},
  {&(_tg__ZTV6dd6560__7ee76560[3]),  3,5},
  {&(_tg__ZTV5cc5606dd6560__7ee76560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc5606dd6560__7ee76560[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6560__7ee76560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76560[];
extern  VTBL_ENTRY _ZTV7ee76560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76560[];
static VTBL_ENTRY alt_thunk_names338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65603fooEv,_ZTv0_n16_N6dd65603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603fooEv,_ZThn12_N6dd65603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65603barEv,_ZTv0_n12_N6dd65603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65603barEv,_ZThn12_N6dd65603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn12_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee765603fooEv,_ZTv0_n16_N7ee765603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee765603fooEv,_ZThn20_N7ee765603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee765603barEv,_ZTv0_n12_N7ee765603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee765603barEv,_ZThn20_N7ee765603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee765603fooEv,_ZTv0_n20_N7ee765603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee765603fooEv,_ZThn8_N7ee765603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee765603barEv,_ZTv0_n16_N7ee765603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee765603barEv,_ZThn8_N7ee765603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76560 = {  "ee76560", // class name
  bases_ee76560, 4,
  &(vtc_ee76560[0]), // expected_vtbl_contents
  &(vtt_ee76560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76560),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76560),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names338,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7560  : virtual cc560 {
  int d;
  virtual void  bar(); // _ZN6dd75603barEv
  virtual void  foo(); // _ZN6dd75603fooEv
  ~dd7560(); // tgen
  dd7560(); // tgen
};
//SIG(-1 dd7560) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd7560 ::bar(){vfunc_called(this, "_ZN6dd75603barEv");}
void  dd7560 ::foo(){vfunc_called(this, "_ZN6dd75603fooEv");}
dd7560 ::~dd7560(){ note_dtor("dd7560", this);} // tgen
dd7560 ::dd7560(){ note_ctor("dd7560", this);} // tgen

static void Test_dd7560()
{
  extern Class_Descriptor cd_dd7560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7560, buf);
    dd7560 *dp, &lv = *(dp=new (buf) dd7560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd7560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,16), "dd7560");
    check_base_class_offset(lv, (cc560*), ABISELECT(16,8), "dd7560");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7560.d");
    test_class_info(&lv, &cd_dd7560);
    dp->~dd7560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7560(Test_dd7560, "dd7560", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7560C1Ev();
extern void _ZN6dd7560D1Ev();
Name_Map name_map_dd7560[] = {
  NSPAIR(_ZN6dd7560C1Ev),
  NSPAIR(_ZN6dd7560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
static Base_Class bases_dd7560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7560[];
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__6dd7560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_dd7560[] = {
  {&(_ZTV6dd7560[4]),  4,17},
  {&(_ZTV6dd7560[10]),  10,17},
  {&(_ZTV6dd7560[15]),  15,17},
  {&(_tg__ZTV5cc560__6dd7560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__6dd7560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static VTBL_ENTRY alt_thunk_names339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7560 = {  "dd7560", // class name
  bases_dd7560, 3,
  &(vtc_dd7560[0]), // expected_vtbl_contents
  &(vtt_dd7560[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7560),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  ee07560  : dd7560 {
  int e;
  ~ee07560(); // tgen
  ee07560(); // tgen
};
//SIG(1 ee07560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee07560 ::~ee07560(){ note_dtor("ee07560", this);} // tgen
ee07560 ::ee07560(){ note_ctor("ee07560", this);} // tgen

static void Test_ee07560()
{
  extern Class_Descriptor cd_ee07560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07560, buf);
    ee07560 *dp, &lv = *(dp=new (buf) ee07560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee07560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee07560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(16,12), "ee07560");
    check_base_class_offset(lv, (dd7560*), 0, "ee07560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07560.e");
    test_class_info(&lv, &cd_ee07560);
    dp->~ee07560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07560(Test_ee07560, "ee07560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07560C1Ev();
extern void _ZN7ee07560D1Ev();
Name_Map name_map_ee07560[] = {
  NSPAIR(_ZN7ee07560C1Ev),
  NSPAIR(_ZN7ee07560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee07560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee07560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee07560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee07560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee07560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee07560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee07560[] = {
  {&(_ZTV7ee07560[4]),  4,17},
  {&(_tg__ZTV6dd7560__7ee07560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee07560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee07560[4]),  4,6},
  {&(_ZTV7ee07560[10]),  10,17},
  {&(_ZTV7ee07560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee07560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee07560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07560[];
extern  VTBL_ENTRY _ZTV7ee07560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07560[];
static VTBL_ENTRY alt_thunk_names340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07560 = {  "ee07560", // class name
  bases_ee07560, 4,
  &(vtc_ee07560[0]), // expected_vtbl_contents
  &(vtt_ee07560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names340,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17560  : virtual dd7560 {
  int e;
  ~ee17560(); // tgen
  ee17560(); // tgen
};
//SIG(1 ee17560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee17560 ::~ee17560(){ note_dtor("ee17560", this);} // tgen
ee17560 ::ee17560(){ note_ctor("ee17560", this);} // tgen

static void Test_ee17560()
{
  extern Class_Descriptor cd_ee17560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17560, buf);
    ee17560 *dp, &lv = *(dp=new (buf) ee17560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee17560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee17560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(32,16), "ee17560");
    check_base_class_offset(lv, (dd7560*), ABISELECT(16,8), "ee17560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17560.e");
    test_class_info(&lv, &cd_ee17560);
    dp->~ee17560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17560(Test_ee17560, "ee17560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17560C1Ev();
extern void _ZN7ee17560D1Ev();
Name_Map name_map_ee17560[] = {
  NSPAIR(_ZN7ee17560C1Ev),
  NSPAIR(_ZN7ee17560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee17560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17560[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee17560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee17560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee17560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee17560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee17560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee17560[] = {
  {&(_ZTV7ee17560[5]),  5,24},
  {&(_ZTV7ee17560[11]),  11,24},
  {&(_ZTV7ee17560[17]),  17,24},
  {&(_ZTV7ee17560[22]),  22,24},
  {&(_tg__ZTV6dd7560__7ee17560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee17560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee17560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee17560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee17560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17560[];
extern  VTBL_ENTRY _ZTV7ee17560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17560[];
static VTBL_ENTRY alt_thunk_names341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17560 = {  "ee17560", // class name
  bases_ee17560, 4,
  &(vtc_ee17560[0]), // expected_vtbl_contents
  &(vtt_ee17560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17560),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names341,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27560  : dd7560 {
  int e;
  virtual void  foo(); // _ZN7ee275603fooEv
  ~ee27560(); // tgen
  ee27560(); // tgen
};
//SIG(1 ee27560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27560 ::foo(){vfunc_called(this, "_ZN7ee275603fooEv");}
ee27560 ::~ee27560(){ note_dtor("ee27560", this);} // tgen
ee27560 ::ee27560(){ note_ctor("ee27560", this);} // tgen

static void Test_ee27560()
{
  extern Class_Descriptor cd_ee27560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27560, buf);
    ee27560 *dp, &lv = *(dp=new (buf) ee27560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee27560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee27560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(16,12), "ee27560");
    check_base_class_offset(lv, (dd7560*), 0, "ee27560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27560.e");
    test_class_info(&lv, &cd_ee27560);
    dp->~ee27560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27560(Test_ee27560, "ee27560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27560C1Ev();
extern void _ZN7ee27560D1Ev();
Name_Map name_map_ee27560[] = {
  NSPAIR(_ZN7ee27560C1Ev),
  NSPAIR(_ZN7ee27560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee27560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27560[];
extern void _ZN6dd75603barEv();
extern void _ZN7ee275603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee275603fooEv,_ZTv0_n16_N7ee275603fooEv)();
extern void ABISELECT(_ZThn32_N7ee275603fooEv,_ZThn20_N7ee275603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN7ee275603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee275603fooEv,_ZTv0_n16_N7ee275603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee27560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee27560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee27560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee27560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee27560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee27560[] = {
  {&(_ZTV7ee27560[4]),  4,17},
  {&(_tg__ZTV6dd7560__7ee27560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee27560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee27560[4]),  4,6},
  {&(_ZTV7ee27560[10]),  10,17},
  {&(_ZTV7ee27560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee27560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee27560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27560[];
extern  VTBL_ENTRY _ZTV7ee27560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27560[];
static VTBL_ENTRY alt_thunk_names342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee275603fooEv,_ZTv0_n16_N7ee275603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee275603fooEv,_ZThn20_N7ee275603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27560 = {  "ee27560", // class name
  bases_ee27560, 4,
  &(vtc_ee27560[0]), // expected_vtbl_contents
  &(vtt_ee27560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names342,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37560  : virtual dd7560 {
  int e;
  virtual void  foo(); // _ZN7ee375603fooEv
  ~ee37560(); // tgen
  ee37560(); // tgen
};
//SIG(1 ee37560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37560 ::foo(){vfunc_called(this, "_ZN7ee375603fooEv");}
ee37560 ::~ee37560(){ note_dtor("ee37560", this);} // tgen
ee37560 ::ee37560(){ note_ctor("ee37560", this);} // tgen

static void Test_ee37560()
{
  extern Class_Descriptor cd_ee37560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37560, buf);
    ee37560 *dp, &lv = *(dp=new (buf) ee37560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee37560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee37560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(32,16), "ee37560");
    check_base_class_offset(lv, (dd7560*), ABISELECT(16,8), "ee37560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37560.e");
    test_class_info(&lv, &cd_ee37560);
    dp->~ee37560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37560(Test_ee37560, "ee37560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37560C1Ev();
extern void _ZN7ee37560D1Ev();
Name_Map name_map_ee37560[] = {
  NSPAIR(_ZN7ee37560C1Ev),
  NSPAIR(_ZN7ee37560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee37560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37560[];
extern void _ZN7ee375603fooEv();
extern void _ZN6dd75603barEv();
extern void ABISELECT(_ZTv0_n48_N7ee375603fooEv,_ZTv0_n24_N7ee375603fooEv)();
extern void ABISELECT(_ZThn16_N7ee375603fooEv,_ZThn8_N7ee375603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee375603fooEv,_ZTv0_n16_N7ee375603fooEv)();
extern void ABISELECT(_ZThn48_N7ee375603fooEv,_ZThn24_N7ee375603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37560[0]),
  (VTBL_ENTRY)&_ZN7ee375603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee375603fooEv,_ZTv0_n24_N7ee375603fooEv),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee375603fooEv,_ZTv0_n16_N7ee375603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee37560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee37560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee37560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee37560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee37560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee37560[] = {
  {&(_ZTV7ee37560[5]),  5,25},
  {&(_ZTV7ee37560[12]),  12,25},
  {&(_ZTV7ee37560[18]),  18,25},
  {&(_ZTV7ee37560[23]),  23,25},
  {&(_tg__ZTV6dd7560__7ee37560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee37560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee37560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee37560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee37560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37560[];
extern  VTBL_ENTRY _ZTV7ee37560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37560[];
static VTBL_ENTRY alt_thunk_names343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee375603fooEv,_ZTv0_n16_N7ee375603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee375603fooEv,_ZThn24_N7ee375603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee375603fooEv,_ZTv0_n24_N7ee375603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee375603fooEv,_ZThn8_N7ee375603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37560 = {  "ee37560", // class name
  bases_ee37560, 4,
  &(vtc_ee37560[0]), // expected_vtbl_contents
  &(vtt_ee37560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37560),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names343,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47560  : dd7560 {
  int e;
  virtual void  bar(); // _ZN7ee475603barEv
  ~ee47560(); // tgen
  ee47560(); // tgen
};
//SIG(1 ee47560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47560 ::bar(){vfunc_called(this, "_ZN7ee475603barEv");}
ee47560 ::~ee47560(){ note_dtor("ee47560", this);} // tgen
ee47560 ::ee47560(){ note_ctor("ee47560", this);} // tgen

static void Test_ee47560()
{
  extern Class_Descriptor cd_ee47560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47560, buf);
    ee47560 *dp, &lv = *(dp=new (buf) ee47560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee47560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee47560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(16,12), "ee47560");
    check_base_class_offset(lv, (dd7560*), 0, "ee47560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47560.e");
    test_class_info(&lv, &cd_ee47560);
    dp->~ee47560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47560(Test_ee47560, "ee47560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47560C1Ev();
extern void _ZN7ee47560D1Ev();
Name_Map name_map_ee47560[] = {
  NSPAIR(_ZN7ee47560C1Ev),
  NSPAIR(_ZN7ee47560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee47560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47560[];
extern void _ZN7ee475603barEv();
extern void _ZN6dd75603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee475603barEv,_ZTv0_n16_N7ee475603barEv)();
extern void ABISELECT(_ZThn16_N7ee475603barEv,_ZThn12_N7ee475603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee475603barEv,_ZTv0_n12_N7ee475603barEv)();
extern void ABISELECT(_ZThn32_N7ee475603barEv,_ZThn20_N7ee475603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47560[0]),
  (VTBL_ENTRY)&_ZN7ee475603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee475603barEv,_ZTv0_n16_N7ee475603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee475603barEv,_ZTv0_n12_N7ee475603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee47560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee47560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee47560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee47560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee47560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee47560[] = {
  {&(_ZTV7ee47560[4]),  4,17},
  {&(_tg__ZTV6dd7560__7ee47560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee47560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee47560[4]),  4,6},
  {&(_ZTV7ee47560[10]),  10,17},
  {&(_ZTV7ee47560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee47560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee47560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47560[];
extern  VTBL_ENTRY _ZTV7ee47560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47560[];
static VTBL_ENTRY alt_thunk_names344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee475603barEv,_ZTv0_n12_N7ee475603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee475603barEv,_ZThn20_N7ee475603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee475603barEv,_ZTv0_n16_N7ee475603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee475603barEv,_ZThn12_N7ee475603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47560 = {  "ee47560", // class name
  bases_ee47560, 4,
  &(vtc_ee47560[0]), // expected_vtbl_contents
  &(vtt_ee47560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47560),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names344,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57560  : virtual dd7560 {
  int e;
  virtual void  bar(); // _ZN7ee575603barEv
  ~ee57560(); // tgen
  ee57560(); // tgen
};
//SIG(1 ee57560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57560 ::bar(){vfunc_called(this, "_ZN7ee575603barEv");}
ee57560 ::~ee57560(){ note_dtor("ee57560", this);} // tgen
ee57560 ::ee57560(){ note_ctor("ee57560", this);} // tgen

static void Test_ee57560()
{
  extern Class_Descriptor cd_ee57560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57560, buf);
    ee57560 *dp, &lv = *(dp=new (buf) ee57560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee57560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee57560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(32,16), "ee57560");
    check_base_class_offset(lv, (dd7560*), ABISELECT(16,8), "ee57560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57560.e");
    test_class_info(&lv, &cd_ee57560);
    dp->~ee57560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57560(Test_ee57560, "ee57560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57560C1Ev();
extern void _ZN7ee57560D1Ev();
Name_Map name_map_ee57560[] = {
  NSPAIR(_ZN7ee57560C1Ev),
  NSPAIR(_ZN7ee57560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee57560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57560[];
extern void _ZN7ee575603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee575603barEv,_ZTv0_n20_N7ee575603barEv)();
extern void ABISELECT(_ZThn16_N7ee575603barEv,_ZThn8_N7ee575603barEv)() __attribute__((weak));
extern void _ZN6dd75603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee575603barEv,_ZTv0_n16_N7ee575603barEv)();
extern void ABISELECT(_ZThn32_N7ee575603barEv,_ZThn16_N7ee575603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee575603barEv,_ZTv0_n12_N7ee575603barEv)();
extern void ABISELECT(_ZThn48_N7ee575603barEv,_ZThn24_N7ee575603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57560[0]),
  (VTBL_ENTRY)&_ZN7ee575603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee575603barEv,_ZTv0_n20_N7ee575603barEv),
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee575603barEv,_ZTv0_n16_N7ee575603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee575603barEv,_ZTv0_n12_N7ee575603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee57560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee57560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee57560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee57560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee57560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee57560[] = {
  {&(_ZTV7ee57560[5]),  5,25},
  {&(_ZTV7ee57560[12]),  12,25},
  {&(_ZTV7ee57560[18]),  18,25},
  {&(_ZTV7ee57560[23]),  23,25},
  {&(_tg__ZTV6dd7560__7ee57560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee57560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee57560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee57560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee57560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57560[];
extern  VTBL_ENTRY _ZTV7ee57560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57560[];
static VTBL_ENTRY alt_thunk_names345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee575603barEv,_ZTv0_n12_N7ee575603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee575603barEv,_ZThn24_N7ee575603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee575603barEv,_ZTv0_n16_N7ee575603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee575603barEv,_ZThn16_N7ee575603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee575603barEv,_ZTv0_n20_N7ee575603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee575603barEv,_ZThn8_N7ee575603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57560 = {  "ee57560", // class name
  bases_ee57560, 4,
  &(vtc_ee57560[0]), // expected_vtbl_contents
  &(vtt_ee57560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57560),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57560),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names345,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67560  : dd7560 {
  int e;
  virtual void  foo(); // _ZN7ee675603fooEv
  virtual void  bar(); // _ZN7ee675603barEv
  ~ee67560(); // tgen
  ee67560(); // tgen
};
//SIG(1 ee67560) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67560 ::foo(){vfunc_called(this, "_ZN7ee675603fooEv");}
void  ee67560 ::bar(){vfunc_called(this, "_ZN7ee675603barEv");}
ee67560 ::~ee67560(){ note_dtor("ee67560", this);} // tgen
ee67560 ::ee67560(){ note_ctor("ee67560", this);} // tgen

static void Test_ee67560()
{
  extern Class_Descriptor cd_ee67560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67560, buf);
    ee67560 *dp, &lv = *(dp=new (buf) ee67560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee67560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(32,20), "ee67560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(16,12), "ee67560");
    check_base_class_offset(lv, (dd7560*), 0, "ee67560");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67560.e");
    test_class_info(&lv, &cd_ee67560);
    dp->~ee67560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67560(Test_ee67560, "ee67560", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67560C1Ev();
extern void _ZN7ee67560D1Ev();
Name_Map name_map_ee67560[] = {
  NSPAIR(_ZN7ee67560C1Ev),
  NSPAIR(_ZN7ee67560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee67560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67560[];
extern void _ZN7ee675603barEv();
extern void _ZN7ee675603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee675603barEv,_ZTv0_n16_N7ee675603barEv)();
extern void ABISELECT(_ZThn16_N7ee675603barEv,_ZThn12_N7ee675603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee675603barEv,_ZTv0_n12_N7ee675603barEv)();
extern void ABISELECT(_ZThn32_N7ee675603barEv,_ZThn20_N7ee675603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee675603fooEv,_ZTv0_n16_N7ee675603fooEv)();
extern void ABISELECT(_ZThn32_N7ee675603fooEv,_ZThn20_N7ee675603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67560[0]),
  (VTBL_ENTRY)&_ZN7ee675603barEv,
  (VTBL_ENTRY)&_ZN7ee675603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee675603barEv,_ZTv0_n16_N7ee675603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee675603barEv,_ZTv0_n12_N7ee675603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee675603fooEv,_ZTv0_n16_N7ee675603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee67560[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee67560[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee67560[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee67560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee67560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee67560[] = {
  {&(_ZTV7ee67560[4]),  4,17},
  {&(_tg__ZTV6dd7560__7ee67560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee67560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee67560[4]),  4,6},
  {&(_ZTV7ee67560[10]),  10,17},
  {&(_ZTV7ee67560[15]),  15,17},
  {&(_tg__ZTV5cc560__7ee67560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee67560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67560[];
extern  VTBL_ENTRY _ZTV7ee67560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67560[];
static VTBL_ENTRY alt_thunk_names346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn20_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn20_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn12_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee675603fooEv,_ZTv0_n16_N7ee675603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee675603fooEv,_ZThn20_N7ee675603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee675603barEv,_ZTv0_n12_N7ee675603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee675603barEv,_ZThn20_N7ee675603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee675603barEv,_ZTv0_n16_N7ee675603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee675603barEv,_ZThn12_N7ee675603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67560 = {  "ee67560", // class name
  bases_ee67560, 4,
  &(vtc_ee67560[0]), // expected_vtbl_contents
  &(vtt_ee67560[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67560),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67560),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67560),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  ee77560  : virtual dd7560 {
  int e;
  virtual void  foo(); // _ZN7ee775603fooEv
  virtual void  bar(); // _ZN7ee775603barEv
  ~ee77560(); // tgen
  ee77560(); // tgen
};
//SIG(1 ee77560) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77560 ::foo(){vfunc_called(this, "_ZN7ee775603fooEv");}
void  ee77560 ::bar(){vfunc_called(this, "_ZN7ee775603barEv");}
ee77560 ::~ee77560(){ note_dtor("ee77560", this);} // tgen
ee77560 ::ee77560(){ note_ctor("ee77560", this);} // tgen

static void Test_ee77560()
{
  extern Class_Descriptor cd_ee77560;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77560, buf);
    ee77560 *dp, &lv = *(dp=new (buf) ee77560());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77560)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77560)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee77560");
    check_base_class_offset(lv, (bb60*)(cc560*), ABISELECT(48,24), "ee77560");
    check_base_class_offset(lv, (cc560*)(dd7560*), ABISELECT(32,16), "ee77560");
    check_base_class_offset(lv, (dd7560*), ABISELECT(16,8), "ee77560");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77560.e");
    test_class_info(&lv, &cd_ee77560);
    dp->~ee77560();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77560(Test_ee77560, "ee77560", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77560C1Ev();
extern void _ZN7ee77560D1Ev();
Name_Map name_map_ee77560[] = {
  NSPAIR(_ZN7ee77560C1Ev),
  NSPAIR(_ZN7ee77560D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc560;
extern VTBL_ENTRY _ZTI5cc560[];
extern  VTBL_ENTRY _ZTV5cc560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc560[];
extern Class_Descriptor cd_dd7560;
extern VTBL_ENTRY _ZTI6dd7560[];
extern  VTBL_ENTRY _ZTV6dd7560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7560[];
static Base_Class bases_ee77560[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc560,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7560,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77560[];
extern void _ZN7ee775603fooEv();
extern void _ZN7ee775603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee775603barEv,_ZTv0_n20_N7ee775603barEv)();
extern void ABISELECT(_ZThn16_N7ee775603barEv,_ZThn8_N7ee775603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee775603fooEv,_ZTv0_n24_N7ee775603fooEv)();
extern void ABISELECT(_ZThn16_N7ee775603fooEv,_ZThn8_N7ee775603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee775603barEv,_ZTv0_n16_N7ee775603barEv)();
extern void ABISELECT(_ZThn32_N7ee775603barEv,_ZThn16_N7ee775603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee775603barEv,_ZTv0_n12_N7ee775603barEv)();
extern void ABISELECT(_ZThn48_N7ee775603barEv,_ZThn24_N7ee775603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee775603fooEv,_ZTv0_n16_N7ee775603fooEv)();
extern void ABISELECT(_ZThn48_N7ee775603fooEv,_ZThn24_N7ee775603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77560[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77560[0]),
  (VTBL_ENTRY)&_ZN7ee775603fooEv,
  (VTBL_ENTRY)&_ZN7ee775603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee775603barEv,_ZTv0_n20_N7ee775603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee775603fooEv,_ZTv0_n24_N7ee775603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee775603barEv,_ZTv0_n16_N7ee775603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee775603barEv,_ZTv0_n12_N7ee775603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee775603fooEv,_ZTv0_n16_N7ee775603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77560[];
extern void _ZN6dd75603barEv();
extern void _ZN6dd75603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7560__7ee77560[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&_ZN6dd75603barEv,
  (VTBL_ENTRY)&_ZN6dd75603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv)();
extern void ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc560__6dd7560__7ee77560[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv)();
extern void ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv)();
extern void ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7560__7ee77560[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv),
};
extern void _ZN5cc5603barEv();
static  VTBL_ENTRY _tg__ZTV5cc560__7ee77560[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&_ZN5cc5603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv)();
extern void ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv)() __attribute__((weak));
extern void _ZN4bb603fooEv();
static  VTBL_ENTRY _tg__ZTV4bb60__5cc560__7ee77560[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc560[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv),
  (VTBL_ENTRY)&_ZN4bb603fooEv,
};
static  VTT_ENTRY vtt_ee77560[] = {
  {&(_ZTV7ee77560[5]),  5,26},
  {&(_ZTV7ee77560[13]),  13,26},
  {&(_ZTV7ee77560[19]),  19,26},
  {&(_ZTV7ee77560[24]),  24,26},
  {&(_tg__ZTV6dd7560__7ee77560[4]),  4,6},
  {&(_tg__ZTV5cc560__6dd7560__7ee77560[4]),  4,5},
  {&(_tg__ZTV4bb60__6dd7560__7ee77560[4]),  4,6},
  {&(_tg__ZTV5cc560__7ee77560[3]),  3,4},
  {&(_tg__ZTV4bb60__5cc560__7ee77560[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77560[];
extern  VTBL_ENTRY _ZTV7ee77560[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77560[];
static VTBL_ENTRY alt_thunk_names347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc5603barEv,_ZTv0_n12_N5cc5603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5603barEv,_ZThn8_N5cc5603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603fooEv,_ZTv0_n16_N6dd75603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603fooEv,_ZThn16_N6dd75603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75603barEv,_ZTv0_n12_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75603barEv,_ZThn16_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75603barEv,_ZTv0_n16_N6dd75603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75603barEv,_ZThn8_N6dd75603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee775603fooEv,_ZTv0_n16_N7ee775603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee775603fooEv,_ZThn24_N7ee775603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee775603barEv,_ZTv0_n12_N7ee775603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee775603barEv,_ZThn24_N7ee775603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee775603barEv,_ZTv0_n16_N7ee775603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee775603barEv,_ZThn16_N7ee775603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee775603fooEv,_ZTv0_n24_N7ee775603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee775603fooEv,_ZThn8_N7ee775603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee775603barEv,_ZTv0_n20_N7ee775603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee775603barEv,_ZThn8_N7ee775603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77560 = {  "ee77560", // class name
  bases_ee77560, 4,
  &(vtc_ee77560[0]), // expected_vtbl_contents
  &(vtt_ee77560[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77560),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77560),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77560),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  cc660  : bb60 {
  int c;
  virtual void  foo(); // _ZN5cc6603fooEv
  virtual void  bar(); // _ZN5cc6603barEv
  ~cc660(); // tgen
  cc660(); // tgen
};
//SIG(-1 cc660) C1{ BC2{ BC3{ Fi} v2 v1 Fi} v1 v2 Fi}


void  cc660 ::foo(){vfunc_called(this, "_ZN5cc6603fooEv");}
void  cc660 ::bar(){vfunc_called(this, "_ZN5cc6603barEv");}
cc660 ::~cc660(){ note_dtor("cc660", this);} // tgen
cc660 ::cc660(){ note_ctor("cc660", this);} // tgen

static void Test_cc660()
{
  extern Class_Descriptor cd_cc660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc660, buf);
    cc660 *dp, &lv = *(dp=new (buf) cc660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc660)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(8,4), "cc660");
    check_base_class_offset(lv, (bb60*), 0, "cc660");
    check_field_offset(lv, c, ABISELECT(16,12), "cc660.c");
    test_class_info(&lv, &cd_cc660);
    dp->~cc660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc660(Test_cc660, "cc660", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc660C1Ev();
extern void _ZN5cc660D1Ev();
Name_Map name_map_cc660[] = {
  NSPAIR(_ZN5cc660C1Ev),
  NSPAIR(_ZN5cc660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5cc660[];
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_cc660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
Class_Descriptor cd_cc660 = {  "cc660", // class name
  bases_cc660, 2,
  &(vtc_cc660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc660),4, //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  dd0660  : cc660 {
  int d;
  ~dd0660(); // tgen
  dd0660(); // tgen
};
//SIG(-1 dd0660) C1{ BC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd0660 ::~dd0660(){ note_dtor("dd0660", this);} // tgen
dd0660 ::dd0660(){ note_ctor("dd0660", this);} // tgen

static void Test_dd0660()
{
  extern Class_Descriptor cd_dd0660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0660, buf);
    dd0660 *dp, &lv = *(dp=new (buf) dd0660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(8,4), "dd0660");
    check_base_class_offset(lv, (bb60*)(cc660*), 0, "dd0660");
    check_base_class_offset(lv, (cc660*), 0, "dd0660");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0660.d");
    test_class_info(&lv, &cd_dd0660);
    dp->~dd0660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0660(Test_dd0660, "dd0660", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0660C1Ev();
extern void _ZN6dd0660D1Ev();
Name_Map name_map_dd0660[] = {
  NSPAIR(_ZN6dd0660C1Ev),
  NSPAIR(_ZN6dd0660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd0660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0660[];
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_dd0660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
Class_Descriptor cd_dd0660 = {  "dd0660", // class name
  bases_dd0660, 3,
  &(vtc_dd0660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0660),4, //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  ee00660  : dd0660 {
  int e;
  ~ee00660(); // tgen
  ee00660(); // tgen
};
//SIG(1 ee00660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee00660 ::~ee00660(){ note_dtor("ee00660", this);} // tgen
ee00660 ::ee00660(){ note_ctor("ee00660", this);} // tgen

static void Test_ee00660()
{
  extern Class_Descriptor cd_ee00660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00660, buf);
    ee00660 *dp, &lv = *(dp=new (buf) ee00660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(8,4), "ee00660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), 0, "ee00660");
    check_base_class_offset(lv, (cc660*)(dd0660*), 0, "ee00660");
    check_base_class_offset(lv, (dd0660*), 0, "ee00660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00660.e");
    test_class_info(&lv, &cd_ee00660);
    dp->~ee00660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00660(Test_ee00660, "ee00660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00660C1Ev();
extern void _ZN7ee00660D1Ev();
Name_Map name_map_ee00660[] = {
  NSPAIR(_ZN7ee00660C1Ev),
  NSPAIR(_ZN7ee00660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee00660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee00660[];
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee00660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTI7ee00660[];
extern  VTBL_ENTRY _ZTV7ee00660[];
Class_Descriptor cd_ee00660 = {  "ee00660", // class name
  bases_ee00660, 4,
  &(vtc_ee00660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00660),4, //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  ee10660  : virtual dd0660 {
  int e;
  ~ee10660(); // tgen
  ee10660(); // tgen
};
//SIG(1 ee10660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee10660 ::~ee10660(){ note_dtor("ee10660", this);} // tgen
ee10660 ::ee10660(){ note_ctor("ee10660", this);} // tgen

static void Test_ee10660()
{
  extern Class_Descriptor cd_ee10660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10660, buf);
    ee10660 *dp, &lv = *(dp=new (buf) ee10660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(24,12), "ee10660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), ABISELECT(16,8), "ee10660");
    check_base_class_offset(lv, (cc660*)(dd0660*), ABISELECT(16,8), "ee10660");
    check_base_class_offset(lv, (dd0660*), ABISELECT(16,8), "ee10660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10660.e");
    test_class_info(&lv, &cd_ee10660);
    dp->~ee10660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10660(Test_ee10660, "ee10660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10660C1Ev();
extern void _ZN7ee10660D1Ev();
Name_Map name_map_ee10660[] = {
  NSPAIR(_ZN7ee10660C1Ev),
  NSPAIR(_ZN7ee10660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee10660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10660[];
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee10660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10660[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee10660[];
static  VTT_ENTRY vtt_ee10660[] = {
  {&(_ZTV7ee10660[3]),  3,9},
  {&(_ZTV7ee10660[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10660[];
extern  VTBL_ENTRY _ZTV7ee10660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10660[];
Class_Descriptor cd_ee10660 = {  "ee10660", // class name
  bases_ee10660, 4,
  &(vtc_ee10660[0]), // expected_vtbl_contents
  &(vtt_ee10660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10660),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10660),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  ee20660  : dd0660 {
  int e;
  virtual void  foo(); // _ZN7ee206603fooEv
  ~ee20660(); // tgen
  ee20660(); // tgen
};
//SIG(1 ee20660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee20660 ::foo(){vfunc_called(this, "_ZN7ee206603fooEv");}
ee20660 ::~ee20660(){ note_dtor("ee20660", this);} // tgen
ee20660 ::ee20660(){ note_ctor("ee20660", this);} // tgen

static void Test_ee20660()
{
  extern Class_Descriptor cd_ee20660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20660, buf);
    ee20660 *dp, &lv = *(dp=new (buf) ee20660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(8,4), "ee20660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), 0, "ee20660");
    check_base_class_offset(lv, (cc660*)(dd0660*), 0, "ee20660");
    check_base_class_offset(lv, (dd0660*), 0, "ee20660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20660.e");
    test_class_info(&lv, &cd_ee20660);
    dp->~ee20660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20660(Test_ee20660, "ee20660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20660C1Ev();
extern void _ZN7ee20660D1Ev();
Name_Map name_map_ee20660[] = {
  NSPAIR(_ZN7ee20660C1Ev),
  NSPAIR(_ZN7ee20660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee20660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee20660[];
extern void _ZN5cc6603barEv();
extern void _ZN7ee206603fooEv();
static  VTBL_ENTRY vtc_ee20660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN7ee206603fooEv,
};
extern VTBL_ENTRY _ZTI7ee20660[];
extern  VTBL_ENTRY _ZTV7ee20660[];
Class_Descriptor cd_ee20660 = {  "ee20660", // class name
  bases_ee20660, 4,
  &(vtc_ee20660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20660),4, //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  ee30660  : virtual dd0660 {
  int e;
  virtual void  foo(); // _ZN7ee306603fooEv
  ~ee30660(); // tgen
  ee30660(); // tgen
};
//SIG(1 ee30660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee30660 ::foo(){vfunc_called(this, "_ZN7ee306603fooEv");}
ee30660 ::~ee30660(){ note_dtor("ee30660", this);} // tgen
ee30660 ::ee30660(){ note_ctor("ee30660", this);} // tgen

static void Test_ee30660()
{
  extern Class_Descriptor cd_ee30660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30660, buf);
    ee30660 *dp, &lv = *(dp=new (buf) ee30660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(24,12), "ee30660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), ABISELECT(16,8), "ee30660");
    check_base_class_offset(lv, (cc660*)(dd0660*), ABISELECT(16,8), "ee30660");
    check_base_class_offset(lv, (dd0660*), ABISELECT(16,8), "ee30660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30660.e");
    test_class_info(&lv, &cd_ee30660);
    dp->~ee30660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30660(Test_ee30660, "ee30660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30660C1Ev();
extern void _ZN7ee30660D1Ev();
Name_Map name_map_ee30660[] = {
  NSPAIR(_ZN7ee30660C1Ev),
  NSPAIR(_ZN7ee30660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee30660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30660[];
extern void _ZN7ee306603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee306603fooEv,_ZTv0_n16_N7ee306603fooEv)();
extern void ABISELECT(_ZThn16_N7ee306603fooEv,_ZThn8_N7ee306603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30660[0]),
  (VTBL_ENTRY)&_ZN7ee306603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee306603fooEv,_ZTv0_n16_N7ee306603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30660[];
static  VTT_ENTRY vtt_ee30660[] = {
  {&(_ZTV7ee30660[3]),  3,10},
  {&(_ZTV7ee30660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30660[];
extern  VTBL_ENTRY _ZTV7ee30660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30660[];
static VTBL_ENTRY alt_thunk_names348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee306603fooEv,_ZTv0_n16_N7ee306603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee306603fooEv,_ZThn8_N7ee306603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30660 = {  "ee30660", // class name
  bases_ee30660, 4,
  &(vtc_ee30660[0]), // expected_vtbl_contents
  &(vtt_ee30660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30660),2, //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  ee40660  : dd0660 {
  int e;
  virtual void  bar(); // _ZN7ee406603barEv
  ~ee40660(); // tgen
  ee40660(); // tgen
};
//SIG(1 ee40660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee40660 ::bar(){vfunc_called(this, "_ZN7ee406603barEv");}
ee40660 ::~ee40660(){ note_dtor("ee40660", this);} // tgen
ee40660 ::ee40660(){ note_ctor("ee40660", this);} // tgen

static void Test_ee40660()
{
  extern Class_Descriptor cd_ee40660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40660, buf);
    ee40660 *dp, &lv = *(dp=new (buf) ee40660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(8,4), "ee40660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), 0, "ee40660");
    check_base_class_offset(lv, (cc660*)(dd0660*), 0, "ee40660");
    check_base_class_offset(lv, (dd0660*), 0, "ee40660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40660.e");
    test_class_info(&lv, &cd_ee40660);
    dp->~ee40660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40660(Test_ee40660, "ee40660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40660C1Ev();
extern void _ZN7ee40660D1Ev();
Name_Map name_map_ee40660[] = {
  NSPAIR(_ZN7ee40660C1Ev),
  NSPAIR(_ZN7ee40660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee40660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee40660[];
extern void _ZN7ee406603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee40660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40660[0]),
  (VTBL_ENTRY)&_ZN7ee406603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTI7ee40660[];
extern  VTBL_ENTRY _ZTV7ee40660[];
Class_Descriptor cd_ee40660 = {  "ee40660", // class name
  bases_ee40660, 4,
  &(vtc_ee40660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40660),4, //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  ee50660  : virtual dd0660 {
  int e;
  virtual void  bar(); // _ZN7ee506603barEv
  ~ee50660(); // tgen
  ee50660(); // tgen
};
//SIG(1 ee50660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee50660 ::bar(){vfunc_called(this, "_ZN7ee506603barEv");}
ee50660 ::~ee50660(){ note_dtor("ee50660", this);} // tgen
ee50660 ::ee50660(){ note_ctor("ee50660", this);} // tgen

static void Test_ee50660()
{
  extern Class_Descriptor cd_ee50660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50660, buf);
    ee50660 *dp, &lv = *(dp=new (buf) ee50660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(24,12), "ee50660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), ABISELECT(16,8), "ee50660");
    check_base_class_offset(lv, (cc660*)(dd0660*), ABISELECT(16,8), "ee50660");
    check_base_class_offset(lv, (dd0660*), ABISELECT(16,8), "ee50660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50660.e");
    test_class_info(&lv, &cd_ee50660);
    dp->~ee50660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50660(Test_ee50660, "ee50660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50660C1Ev();
extern void _ZN7ee50660D1Ev();
Name_Map name_map_ee50660[] = {
  NSPAIR(_ZN7ee50660C1Ev),
  NSPAIR(_ZN7ee50660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee50660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50660[];
extern void _ZN7ee506603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee506603barEv,_ZTv0_n12_N7ee506603barEv)();
extern void ABISELECT(_ZThn16_N7ee506603barEv,_ZThn8_N7ee506603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee50660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50660[0]),
  (VTBL_ENTRY)&_ZN7ee506603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee506603barEv,_ZTv0_n12_N7ee506603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee50660[];
static  VTT_ENTRY vtt_ee50660[] = {
  {&(_ZTV7ee50660[3]),  3,10},
  {&(_ZTV7ee50660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50660[];
extern  VTBL_ENTRY _ZTV7ee50660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50660[];
static VTBL_ENTRY alt_thunk_names349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee506603barEv,_ZTv0_n12_N7ee506603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee506603barEv,_ZThn8_N7ee506603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50660 = {  "ee50660", // class name
  bases_ee50660, 4,
  &(vtc_ee50660[0]), // expected_vtbl_contents
  &(vtt_ee50660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50660),2, //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  ee60660  : dd0660 {
  int e;
  virtual void  foo(); // _ZN7ee606603fooEv
  virtual void  bar(); // _ZN7ee606603barEv
  ~ee60660(); // tgen
  ee60660(); // tgen
};
//SIG(1 ee60660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee60660 ::foo(){vfunc_called(this, "_ZN7ee606603fooEv");}
void  ee60660 ::bar(){vfunc_called(this, "_ZN7ee606603barEv");}
ee60660 ::~ee60660(){ note_dtor("ee60660", this);} // tgen
ee60660 ::ee60660(){ note_ctor("ee60660", this);} // tgen

static void Test_ee60660()
{
  extern Class_Descriptor cd_ee60660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60660, buf);
    ee60660 *dp, &lv = *(dp=new (buf) ee60660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(8,4), "ee60660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), 0, "ee60660");
    check_base_class_offset(lv, (cc660*)(dd0660*), 0, "ee60660");
    check_base_class_offset(lv, (dd0660*), 0, "ee60660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60660.e");
    test_class_info(&lv, &cd_ee60660);
    dp->~ee60660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60660(Test_ee60660, "ee60660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60660C1Ev();
extern void _ZN7ee60660D1Ev();
Name_Map name_map_ee60660[] = {
  NSPAIR(_ZN7ee60660C1Ev),
  NSPAIR(_ZN7ee60660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee60660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee60660[];
extern void _ZN7ee606603barEv();
extern void _ZN7ee606603fooEv();
static  VTBL_ENTRY vtc_ee60660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60660[0]),
  (VTBL_ENTRY)&_ZN7ee606603barEv,
  (VTBL_ENTRY)&_ZN7ee606603fooEv,
};
extern VTBL_ENTRY _ZTI7ee60660[];
extern  VTBL_ENTRY _ZTV7ee60660[];
Class_Descriptor cd_ee60660 = {  "ee60660", // class name
  bases_ee60660, 4,
  &(vtc_ee60660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60660),4, //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  ee70660  : virtual dd0660 {
  int e;
  virtual void  foo(); // _ZN7ee706603fooEv
  virtual void  bar(); // _ZN7ee706603barEv
  ~ee70660(); // tgen
  ee70660(); // tgen
};
//SIG(1 ee70660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee70660 ::foo(){vfunc_called(this, "_ZN7ee706603fooEv");}
void  ee70660 ::bar(){vfunc_called(this, "_ZN7ee706603barEv");}
ee70660 ::~ee70660(){ note_dtor("ee70660", this);} // tgen
ee70660 ::ee70660(){ note_ctor("ee70660", this);} // tgen

static void Test_ee70660()
{
  extern Class_Descriptor cd_ee70660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70660, buf);
    ee70660 *dp, &lv = *(dp=new (buf) ee70660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd0660*), ABISELECT(24,12), "ee70660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd0660*), ABISELECT(16,8), "ee70660");
    check_base_class_offset(lv, (cc660*)(dd0660*), ABISELECT(16,8), "ee70660");
    check_base_class_offset(lv, (dd0660*), ABISELECT(16,8), "ee70660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70660.e");
    test_class_info(&lv, &cd_ee70660);
    dp->~ee70660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70660(Test_ee70660, "ee70660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70660C1Ev();
extern void _ZN7ee70660D1Ev();
Name_Map name_map_ee70660[] = {
  NSPAIR(_ZN7ee70660C1Ev),
  NSPAIR(_ZN7ee70660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd0660;
extern VTBL_ENTRY _ZTI6dd0660[];
extern  VTBL_ENTRY _ZTV6dd0660[];
static Base_Class bases_ee70660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd0660,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70660[];
extern void _ZN7ee706603fooEv();
extern void _ZN7ee706603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee706603barEv,_ZTv0_n12_N7ee706603barEv)();
extern void ABISELECT(_ZThn16_N7ee706603barEv,_ZThn8_N7ee706603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee706603fooEv,_ZTv0_n16_N7ee706603fooEv)();
extern void ABISELECT(_ZThn16_N7ee706603fooEv,_ZThn8_N7ee706603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70660[0]),
  (VTBL_ENTRY)&_ZN7ee706603fooEv,
  (VTBL_ENTRY)&_ZN7ee706603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee706603barEv,_ZTv0_n12_N7ee706603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee706603fooEv,_ZTv0_n16_N7ee706603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70660[];
static  VTT_ENTRY vtt_ee70660[] = {
  {&(_ZTV7ee70660[3]),  3,11},
  {&(_ZTV7ee70660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70660[];
extern  VTBL_ENTRY _ZTV7ee70660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70660[];
static VTBL_ENTRY alt_thunk_names350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee706603fooEv,_ZTv0_n16_N7ee706603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee706603fooEv,_ZThn8_N7ee706603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee706603barEv,_ZTv0_n12_N7ee706603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee706603barEv,_ZThn8_N7ee706603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70660 = {  "ee70660", // class name
  bases_ee70660, 4,
  &(vtc_ee70660[0]), // expected_vtbl_contents
  &(vtt_ee70660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70660),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names350,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1660  : virtual cc660 {
  int d;
  ~dd1660(); // tgen
  dd1660(); // tgen
};
//SIG(-1 dd1660) C1{ VBC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd1660 ::~dd1660(){ note_dtor("dd1660", this);} // tgen
dd1660 ::dd1660(){ note_ctor("dd1660", this);} // tgen

static void Test_dd1660()
{
  extern Class_Descriptor cd_dd1660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1660, buf);
    dd1660 *dp, &lv = *(dp=new (buf) dd1660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,12), "dd1660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,8), "dd1660");
    check_base_class_offset(lv, (cc660*), ABISELECT(16,8), "dd1660");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1660.d");
    test_class_info(&lv, &cd_dd1660);
    dp->~dd1660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1660(Test_dd1660, "dd1660", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1660C1Ev();
extern void _ZN6dd1660D1Ev();
Name_Map name_map_dd1660[] = {
  NSPAIR(_ZN6dd1660C1Ev),
  NSPAIR(_ZN6dd1660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd1660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1660[];
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_dd1660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV6dd1660[];
static  VTT_ENTRY vtt_dd1660[] = {
  {&(_ZTV6dd1660[3]),  3,9},
  {&(_ZTV6dd1660[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
Class_Descriptor cd_dd1660 = {  "dd1660", // class name
  bases_dd1660, 3,
  &(vtc_dd1660[0]), // expected_vtbl_contents
  &(vtt_dd1660[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1660),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1660),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  ee01660  : dd1660 {
  int e;
  ~ee01660(); // tgen
  ee01660(); // tgen
};
//SIG(1 ee01660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee01660 ::~ee01660(){ note_dtor("ee01660", this);} // tgen
ee01660 ::ee01660(){ note_ctor("ee01660", this);} // tgen

static void Test_ee01660()
{
  extern Class_Descriptor cd_ee01660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01660, buf);
    ee01660 *dp, &lv = *(dp=new (buf) ee01660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee01660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee01660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(16,12), "ee01660");
    check_base_class_offset(lv, (dd1660*), 0, "ee01660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01660.e");
    test_class_info(&lv, &cd_ee01660);
    dp->~ee01660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01660(Test_ee01660, "ee01660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01660C1Ev();
extern void _ZN7ee01660D1Ev();
Name_Map name_map_ee01660[] = {
  NSPAIR(_ZN7ee01660C1Ev),
  NSPAIR(_ZN7ee01660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee01660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01660[];
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee01660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01660[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee01660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee01660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee01660[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee01660[] = {
  {&(_ZTV7ee01660[3]),  3,9},
  {&(_tg__ZTV6dd1660__7ee01660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee01660[4]),  4,6},
  {&(_ZTV7ee01660[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01660[];
extern  VTBL_ENTRY _ZTV7ee01660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01660[];
Class_Descriptor cd_ee01660 = {  "ee01660", // class name
  bases_ee01660, 4,
  &(vtc_ee01660[0]), // expected_vtbl_contents
  &(vtt_ee01660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01660),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01660),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  ee11660  : virtual dd1660 {
  int e;
  ~ee11660(); // tgen
  ee11660(); // tgen
};
//SIG(1 ee11660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee11660 ::~ee11660(){ note_dtor("ee11660", this);} // tgen
ee11660 ::ee11660(){ note_ctor("ee11660", this);} // tgen

static void Test_ee11660()
{
  extern Class_Descriptor cd_ee11660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11660, buf);
    ee11660 *dp, &lv = *(dp=new (buf) ee11660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee11660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee11660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(32,16), "ee11660");
    check_base_class_offset(lv, (dd1660*), ABISELECT(16,8), "ee11660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11660.e");
    test_class_info(&lv, &cd_ee11660);
    dp->~ee11660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11660(Test_ee11660, "ee11660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11660C1Ev();
extern void _ZN7ee11660D1Ev();
Name_Map name_map_ee11660[] = {
  NSPAIR(_ZN7ee11660C1Ev),
  NSPAIR(_ZN7ee11660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee11660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11660[];
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee11660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11660[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11660[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee11660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee11660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee11660[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee11660[] = {
  {&(_ZTV7ee11660[4]),  4,13},
  {&(_ZTV7ee11660[7]),  7,13},
  {&(_ZTV7ee11660[11]),  11,13},
  {&(_tg__ZTV6dd1660__7ee11660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee11660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11660[];
extern  VTBL_ENTRY _ZTV7ee11660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11660[];
Class_Descriptor cd_ee11660 = {  "ee11660", // class name
  bases_ee11660, 4,
  &(vtc_ee11660[0]), // expected_vtbl_contents
  &(vtt_ee11660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11660),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11660),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  ee21660  : dd1660 {
  int e;
  virtual void  foo(); // _ZN7ee216603fooEv
  ~ee21660(); // tgen
  ee21660(); // tgen
};
//SIG(1 ee21660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee21660 ::foo(){vfunc_called(this, "_ZN7ee216603fooEv");}
ee21660 ::~ee21660(){ note_dtor("ee21660", this);} // tgen
ee21660 ::ee21660(){ note_ctor("ee21660", this);} // tgen

static void Test_ee21660()
{
  extern Class_Descriptor cd_ee21660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21660, buf);
    ee21660 *dp, &lv = *(dp=new (buf) ee21660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee21660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee21660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(16,12), "ee21660");
    check_base_class_offset(lv, (dd1660*), 0, "ee21660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21660.e");
    test_class_info(&lv, &cd_ee21660);
    dp->~ee21660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21660(Test_ee21660, "ee21660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21660C1Ev();
extern void _ZN7ee21660D1Ev();
Name_Map name_map_ee21660[] = {
  NSPAIR(_ZN7ee21660C1Ev),
  NSPAIR(_ZN7ee21660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee21660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21660[];
extern void _ZN7ee216603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee216603fooEv,_ZTv0_n16_N7ee216603fooEv)();
extern void ABISELECT(_ZThn16_N7ee216603fooEv,_ZThn12_N7ee216603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21660[0]),
  (VTBL_ENTRY)&_ZN7ee216603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee216603fooEv,_ZTv0_n16_N7ee216603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee21660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee21660[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee21660[] = {
  {&(_ZTV7ee21660[3]),  3,10},
  {&(_tg__ZTV6dd1660__7ee21660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee21660[4]),  4,6},
  {&(_ZTV7ee21660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21660[];
extern  VTBL_ENTRY _ZTV7ee21660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21660[];
static VTBL_ENTRY alt_thunk_names351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee216603fooEv,_ZTv0_n16_N7ee216603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee216603fooEv,_ZThn12_N7ee216603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21660 = {  "ee21660", // class name
  bases_ee21660, 4,
  &(vtc_ee21660[0]), // expected_vtbl_contents
  &(vtt_ee21660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names351,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31660  : virtual dd1660 {
  int e;
  virtual void  foo(); // _ZN7ee316603fooEv
  ~ee31660(); // tgen
  ee31660(); // tgen
};
//SIG(1 ee31660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee31660 ::foo(){vfunc_called(this, "_ZN7ee316603fooEv");}
ee31660 ::~ee31660(){ note_dtor("ee31660", this);} // tgen
ee31660 ::ee31660(){ note_ctor("ee31660", this);} // tgen

static void Test_ee31660()
{
  extern Class_Descriptor cd_ee31660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31660, buf);
    ee31660 *dp, &lv = *(dp=new (buf) ee31660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee31660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee31660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(32,16), "ee31660");
    check_base_class_offset(lv, (dd1660*), ABISELECT(16,8), "ee31660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31660.e");
    test_class_info(&lv, &cd_ee31660);
    dp->~ee31660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31660(Test_ee31660, "ee31660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31660C1Ev();
extern void _ZN7ee31660D1Ev();
Name_Map name_map_ee31660[] = {
  NSPAIR(_ZN7ee31660C1Ev),
  NSPAIR(_ZN7ee31660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee31660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31660[];
extern void _ZN7ee316603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee316603fooEv,_ZTv0_n16_N7ee316603fooEv)();
extern void ABISELECT(_ZThn32_N7ee316603fooEv,_ZThn16_N7ee316603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31660[0]),
  (VTBL_ENTRY)&_ZN7ee316603fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31660[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee316603fooEv,_ZTv0_n16_N7ee316603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee31660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee31660[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee31660[] = {
  {&(_ZTV7ee31660[4]),  4,14},
  {&(_ZTV7ee31660[8]),  8,14},
  {&(_ZTV7ee31660[12]),  12,14},
  {&(_tg__ZTV6dd1660__7ee31660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee31660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31660[];
extern  VTBL_ENTRY _ZTV7ee31660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31660[];
static VTBL_ENTRY alt_thunk_names352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee316603fooEv,_ZTv0_n16_N7ee316603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee316603fooEv,_ZThn16_N7ee316603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31660 = {  "ee31660", // class name
  bases_ee31660, 4,
  &(vtc_ee31660[0]), // expected_vtbl_contents
  &(vtt_ee31660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31660),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names352,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41660  : dd1660 {
  int e;
  virtual void  bar(); // _ZN7ee416603barEv
  ~ee41660(); // tgen
  ee41660(); // tgen
};
//SIG(1 ee41660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee41660 ::bar(){vfunc_called(this, "_ZN7ee416603barEv");}
ee41660 ::~ee41660(){ note_dtor("ee41660", this);} // tgen
ee41660 ::ee41660(){ note_ctor("ee41660", this);} // tgen

static void Test_ee41660()
{
  extern Class_Descriptor cd_ee41660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41660, buf);
    ee41660 *dp, &lv = *(dp=new (buf) ee41660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee41660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee41660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(16,12), "ee41660");
    check_base_class_offset(lv, (dd1660*), 0, "ee41660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41660.e");
    test_class_info(&lv, &cd_ee41660);
    dp->~ee41660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41660(Test_ee41660, "ee41660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41660C1Ev();
extern void _ZN7ee41660D1Ev();
Name_Map name_map_ee41660[] = {
  NSPAIR(_ZN7ee41660C1Ev),
  NSPAIR(_ZN7ee41660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee41660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41660[];
extern void _ZN7ee416603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee416603barEv,_ZTv0_n12_N7ee416603barEv)();
extern void ABISELECT(_ZThn16_N7ee416603barEv,_ZThn12_N7ee416603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee41660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41660[0]),
  (VTBL_ENTRY)&_ZN7ee416603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee416603barEv,_ZTv0_n12_N7ee416603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee41660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee41660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee41660[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee41660[] = {
  {&(_ZTV7ee41660[3]),  3,10},
  {&(_tg__ZTV6dd1660__7ee41660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee41660[4]),  4,6},
  {&(_ZTV7ee41660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41660[];
extern  VTBL_ENTRY _ZTV7ee41660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41660[];
static VTBL_ENTRY alt_thunk_names353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee416603barEv,_ZTv0_n12_N7ee416603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee416603barEv,_ZThn12_N7ee416603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41660 = {  "ee41660", // class name
  bases_ee41660, 4,
  &(vtc_ee41660[0]), // expected_vtbl_contents
  &(vtt_ee41660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names353,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51660  : virtual dd1660 {
  int e;
  virtual void  bar(); // _ZN7ee516603barEv
  ~ee51660(); // tgen
  ee51660(); // tgen
};
//SIG(1 ee51660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee51660 ::bar(){vfunc_called(this, "_ZN7ee516603barEv");}
ee51660 ::~ee51660(){ note_dtor("ee51660", this);} // tgen
ee51660 ::ee51660(){ note_ctor("ee51660", this);} // tgen

static void Test_ee51660()
{
  extern Class_Descriptor cd_ee51660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51660, buf);
    ee51660 *dp, &lv = *(dp=new (buf) ee51660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee51660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee51660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(32,16), "ee51660");
    check_base_class_offset(lv, (dd1660*), ABISELECT(16,8), "ee51660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51660.e");
    test_class_info(&lv, &cd_ee51660);
    dp->~ee51660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51660(Test_ee51660, "ee51660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51660C1Ev();
extern void _ZN7ee51660D1Ev();
Name_Map name_map_ee51660[] = {
  NSPAIR(_ZN7ee51660C1Ev),
  NSPAIR(_ZN7ee51660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee51660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51660[];
extern void _ZN7ee516603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee516603barEv,_ZTv0_n12_N7ee516603barEv)();
extern void ABISELECT(_ZThn32_N7ee516603barEv,_ZThn16_N7ee516603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee51660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51660[0]),
  (VTBL_ENTRY)&_ZN7ee516603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51660[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee516603barEv,_ZTv0_n12_N7ee516603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee51660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee51660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee51660[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee51660[] = {
  {&(_ZTV7ee51660[4]),  4,14},
  {&(_ZTV7ee51660[8]),  8,14},
  {&(_ZTV7ee51660[12]),  12,14},
  {&(_tg__ZTV6dd1660__7ee51660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee51660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51660[];
extern  VTBL_ENTRY _ZTV7ee51660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51660[];
static VTBL_ENTRY alt_thunk_names354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee516603barEv,_ZTv0_n12_N7ee516603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee516603barEv,_ZThn16_N7ee516603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51660 = {  "ee51660", // class name
  bases_ee51660, 4,
  &(vtc_ee51660[0]), // expected_vtbl_contents
  &(vtt_ee51660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51660),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names354,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61660  : dd1660 {
  int e;
  virtual void  foo(); // _ZN7ee616603fooEv
  virtual void  bar(); // _ZN7ee616603barEv
  ~ee61660(); // tgen
  ee61660(); // tgen
};
//SIG(1 ee61660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee61660 ::foo(){vfunc_called(this, "_ZN7ee616603fooEv");}
void  ee61660 ::bar(){vfunc_called(this, "_ZN7ee616603barEv");}
ee61660 ::~ee61660(){ note_dtor("ee61660", this);} // tgen
ee61660 ::ee61660(){ note_ctor("ee61660", this);} // tgen

static void Test_ee61660()
{
  extern Class_Descriptor cd_ee61660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61660, buf);
    ee61660 *dp, &lv = *(dp=new (buf) ee61660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee61660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee61660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(16,12), "ee61660");
    check_base_class_offset(lv, (dd1660*), 0, "ee61660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61660.e");
    test_class_info(&lv, &cd_ee61660);
    dp->~ee61660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61660(Test_ee61660, "ee61660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61660C1Ev();
extern void _ZN7ee61660D1Ev();
Name_Map name_map_ee61660[] = {
  NSPAIR(_ZN7ee61660C1Ev),
  NSPAIR(_ZN7ee61660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee61660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61660[];
extern void _ZN7ee616603fooEv();
extern void _ZN7ee616603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee616603barEv,_ZTv0_n12_N7ee616603barEv)();
extern void ABISELECT(_ZThn16_N7ee616603barEv,_ZThn12_N7ee616603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee616603fooEv,_ZTv0_n16_N7ee616603fooEv)();
extern void ABISELECT(_ZThn16_N7ee616603fooEv,_ZThn12_N7ee616603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61660[0]),
  (VTBL_ENTRY)&_ZN7ee616603fooEv,
  (VTBL_ENTRY)&_ZN7ee616603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee616603barEv,_ZTv0_n12_N7ee616603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee616603fooEv,_ZTv0_n16_N7ee616603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee61660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee61660[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee61660[] = {
  {&(_ZTV7ee61660[3]),  3,11},
  {&(_tg__ZTV6dd1660__7ee61660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee61660[4]),  4,6},
  {&(_ZTV7ee61660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61660[];
extern  VTBL_ENTRY _ZTV7ee61660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61660[];
static VTBL_ENTRY alt_thunk_names355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee616603fooEv,_ZTv0_n16_N7ee616603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee616603fooEv,_ZThn12_N7ee616603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee616603barEv,_ZTv0_n12_N7ee616603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee616603barEv,_ZThn12_N7ee616603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61660 = {  "ee61660", // class name
  bases_ee61660, 4,
  &(vtc_ee61660[0]), // expected_vtbl_contents
  &(vtt_ee61660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61660),4, //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  ee71660  : virtual dd1660 {
  int e;
  virtual void  foo(); // _ZN7ee716603fooEv
  virtual void  bar(); // _ZN7ee716603barEv
  ~ee71660(); // tgen
  ee71660(); // tgen
};
//SIG(1 ee71660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee71660 ::foo(){vfunc_called(this, "_ZN7ee716603fooEv");}
void  ee71660 ::bar(){vfunc_called(this, "_ZN7ee716603barEv");}
ee71660 ::~ee71660(){ note_dtor("ee71660", this);} // tgen
ee71660 ::ee71660(){ note_ctor("ee71660", this);} // tgen

static void Test_ee71660()
{
  extern Class_Descriptor cd_ee71660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71660, buf);
    ee71660 *dp, &lv = *(dp=new (buf) ee71660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee71660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee71660");
    check_base_class_offset(lv, (cc660*)(dd1660*), ABISELECT(32,16), "ee71660");
    check_base_class_offset(lv, (dd1660*), ABISELECT(16,8), "ee71660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71660.e");
    test_class_info(&lv, &cd_ee71660);
    dp->~ee71660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71660(Test_ee71660, "ee71660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71660C1Ev();
extern void _ZN7ee71660D1Ev();
Name_Map name_map_ee71660[] = {
  NSPAIR(_ZN7ee71660C1Ev),
  NSPAIR(_ZN7ee71660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd1660;
extern VTBL_ENTRY _ZTI6dd1660[];
extern  VTBL_ENTRY _ZTV6dd1660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1660[];
static Base_Class bases_ee71660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1660,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71660[];
extern void _ZN7ee716603fooEv();
extern void _ZN7ee716603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee716603barEv,_ZTv0_n12_N7ee716603barEv)();
extern void ABISELECT(_ZThn32_N7ee716603barEv,_ZThn16_N7ee716603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee716603fooEv,_ZTv0_n16_N7ee716603fooEv)();
extern void ABISELECT(_ZThn32_N7ee716603fooEv,_ZThn16_N7ee716603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71660[0]),
  (VTBL_ENTRY)&_ZN7ee716603fooEv,
  (VTBL_ENTRY)&_ZN7ee716603barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71660[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee716603barEv,_ZTv0_n12_N7ee716603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee716603fooEv,_ZTv0_n16_N7ee716603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71660[];
static  VTBL_ENTRY _tg__ZTV6dd1660__7ee71660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
};
extern void _ZN5cc6603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd1660__7ee71660[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee71660[] = {
  {&(_ZTV7ee71660[4]),  4,15},
  {&(_ZTV7ee71660[9]),  9,15},
  {&(_ZTV7ee71660[13]),  13,15},
  {&(_tg__ZTV6dd1660__7ee71660[3]),  3,3},
  {&(_tg__ZTV5cc660__6dd1660__7ee71660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71660[];
extern  VTBL_ENTRY _ZTV7ee71660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71660[];
static VTBL_ENTRY alt_thunk_names356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee716603fooEv,_ZTv0_n16_N7ee716603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee716603fooEv,_ZThn16_N7ee716603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee716603barEv,_ZTv0_n12_N7ee716603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee716603barEv,_ZThn16_N7ee716603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71660 = {  "ee71660", // class name
  bases_ee71660, 4,
  &(vtc_ee71660[0]), // expected_vtbl_contents
  &(vtt_ee71660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71660),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71660),5, //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  dd2660  : cc660 {
  int d;
  virtual void  foo(); // _ZN6dd26603fooEv
  ~dd2660(); // tgen
  dd2660(); // tgen
};
//SIG(-1 dd2660) C1{ BC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd2660 ::foo(){vfunc_called(this, "_ZN6dd26603fooEv");}
dd2660 ::~dd2660(){ note_dtor("dd2660", this);} // tgen
dd2660 ::dd2660(){ note_ctor("dd2660", this);} // tgen

static void Test_dd2660()
{
  extern Class_Descriptor cd_dd2660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2660, buf);
    dd2660 *dp, &lv = *(dp=new (buf) dd2660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(8,4), "dd2660");
    check_base_class_offset(lv, (bb60*)(cc660*), 0, "dd2660");
    check_base_class_offset(lv, (cc660*), 0, "dd2660");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2660.d");
    test_class_info(&lv, &cd_dd2660);
    dp->~dd2660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2660(Test_dd2660, "dd2660", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2660C1Ev();
extern void _ZN6dd2660D1Ev();
Name_Map name_map_dd2660[] = {
  NSPAIR(_ZN6dd2660C1Ev),
  NSPAIR(_ZN6dd2660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd2660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd2660[];
extern void _ZN5cc6603barEv();
extern void _ZN6dd26603fooEv();
static  VTBL_ENTRY vtc_dd2660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN6dd26603fooEv,
};
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
Class_Descriptor cd_dd2660 = {  "dd2660", // class name
  bases_dd2660, 3,
  &(vtc_dd2660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2660),4, //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  ee02660  : dd2660 {
  int e;
  ~ee02660(); // tgen
  ee02660(); // tgen
};
//SIG(1 ee02660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee02660 ::~ee02660(){ note_dtor("ee02660", this);} // tgen
ee02660 ::ee02660(){ note_ctor("ee02660", this);} // tgen

static void Test_ee02660()
{
  extern Class_Descriptor cd_ee02660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02660, buf);
    ee02660 *dp, &lv = *(dp=new (buf) ee02660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(8,4), "ee02660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), 0, "ee02660");
    check_base_class_offset(lv, (cc660*)(dd2660*), 0, "ee02660");
    check_base_class_offset(lv, (dd2660*), 0, "ee02660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02660.e");
    test_class_info(&lv, &cd_ee02660);
    dp->~ee02660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02660(Test_ee02660, "ee02660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02660C1Ev();
extern void _ZN7ee02660D1Ev();
Name_Map name_map_ee02660[] = {
  NSPAIR(_ZN7ee02660C1Ev),
  NSPAIR(_ZN7ee02660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee02660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02660[];
extern void _ZN5cc6603barEv();
extern void _ZN6dd26603fooEv();
static  VTBL_ENTRY vtc_ee02660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN6dd26603fooEv,
};
extern VTBL_ENTRY _ZTI7ee02660[];
extern  VTBL_ENTRY _ZTV7ee02660[];
Class_Descriptor cd_ee02660 = {  "ee02660", // class name
  bases_ee02660, 4,
  &(vtc_ee02660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02660),4, //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  ee12660  : virtual dd2660 {
  int e;
  ~ee12660(); // tgen
  ee12660(); // tgen
};
//SIG(1 ee12660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee12660 ::~ee12660(){ note_dtor("ee12660", this);} // tgen
ee12660 ::ee12660(){ note_ctor("ee12660", this);} // tgen

static void Test_ee12660()
{
  extern Class_Descriptor cd_ee12660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12660, buf);
    ee12660 *dp, &lv = *(dp=new (buf) ee12660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(24,12), "ee12660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), ABISELECT(16,8), "ee12660");
    check_base_class_offset(lv, (cc660*)(dd2660*), ABISELECT(16,8), "ee12660");
    check_base_class_offset(lv, (dd2660*), ABISELECT(16,8), "ee12660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12660.e");
    test_class_info(&lv, &cd_ee12660);
    dp->~ee12660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12660(Test_ee12660, "ee12660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12660C1Ev();
extern void _ZN7ee12660D1Ev();
Name_Map name_map_ee12660[] = {
  NSPAIR(_ZN7ee12660C1Ev),
  NSPAIR(_ZN7ee12660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee12660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12660[];
extern void _ZN5cc6603barEv();
extern void _ZN6dd26603fooEv();
static  VTBL_ENTRY vtc_ee12660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12660[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN6dd26603fooEv,
};
extern VTBL_ENTRY _ZTV7ee12660[];
static  VTT_ENTRY vtt_ee12660[] = {
  {&(_ZTV7ee12660[3]),  3,9},
  {&(_ZTV7ee12660[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12660[];
extern  VTBL_ENTRY _ZTV7ee12660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12660[];
Class_Descriptor cd_ee12660 = {  "ee12660", // class name
  bases_ee12660, 4,
  &(vtc_ee12660[0]), // expected_vtbl_contents
  &(vtt_ee12660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12660),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12660),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  ee22660  : dd2660 {
  int e;
  virtual void  foo(); // _ZN7ee226603fooEv
  ~ee22660(); // tgen
  ee22660(); // tgen
};
//SIG(1 ee22660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee22660 ::foo(){vfunc_called(this, "_ZN7ee226603fooEv");}
ee22660 ::~ee22660(){ note_dtor("ee22660", this);} // tgen
ee22660 ::ee22660(){ note_ctor("ee22660", this);} // tgen

static void Test_ee22660()
{
  extern Class_Descriptor cd_ee22660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22660, buf);
    ee22660 *dp, &lv = *(dp=new (buf) ee22660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(8,4), "ee22660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), 0, "ee22660");
    check_base_class_offset(lv, (cc660*)(dd2660*), 0, "ee22660");
    check_base_class_offset(lv, (dd2660*), 0, "ee22660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22660.e");
    test_class_info(&lv, &cd_ee22660);
    dp->~ee22660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22660(Test_ee22660, "ee22660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22660C1Ev();
extern void _ZN7ee22660D1Ev();
Name_Map name_map_ee22660[] = {
  NSPAIR(_ZN7ee22660C1Ev),
  NSPAIR(_ZN7ee22660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee22660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee22660[];
extern void _ZN5cc6603barEv();
extern void _ZN7ee226603fooEv();
static  VTBL_ENTRY vtc_ee22660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&_ZN7ee226603fooEv,
};
extern VTBL_ENTRY _ZTI7ee22660[];
extern  VTBL_ENTRY _ZTV7ee22660[];
Class_Descriptor cd_ee22660 = {  "ee22660", // class name
  bases_ee22660, 4,
  &(vtc_ee22660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22660),4, //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  ee32660  : virtual dd2660 {
  int e;
  virtual void  foo(); // _ZN7ee326603fooEv
  ~ee32660(); // tgen
  ee32660(); // tgen
};
//SIG(1 ee32660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee32660 ::foo(){vfunc_called(this, "_ZN7ee326603fooEv");}
ee32660 ::~ee32660(){ note_dtor("ee32660", this);} // tgen
ee32660 ::ee32660(){ note_ctor("ee32660", this);} // tgen

static void Test_ee32660()
{
  extern Class_Descriptor cd_ee32660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32660, buf);
    ee32660 *dp, &lv = *(dp=new (buf) ee32660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(24,12), "ee32660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), ABISELECT(16,8), "ee32660");
    check_base_class_offset(lv, (cc660*)(dd2660*), ABISELECT(16,8), "ee32660");
    check_base_class_offset(lv, (dd2660*), ABISELECT(16,8), "ee32660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32660.e");
    test_class_info(&lv, &cd_ee32660);
    dp->~ee32660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32660(Test_ee32660, "ee32660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32660C1Ev();
extern void _ZN7ee32660D1Ev();
Name_Map name_map_ee32660[] = {
  NSPAIR(_ZN7ee32660C1Ev),
  NSPAIR(_ZN7ee32660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee32660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32660[];
extern void _ZN7ee326603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee326603fooEv,_ZTv0_n16_N7ee326603fooEv)();
extern void ABISELECT(_ZThn16_N7ee326603fooEv,_ZThn8_N7ee326603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32660[0]),
  (VTBL_ENTRY)&_ZN7ee326603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee326603fooEv,_ZTv0_n16_N7ee326603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32660[];
static  VTT_ENTRY vtt_ee32660[] = {
  {&(_ZTV7ee32660[3]),  3,10},
  {&(_ZTV7ee32660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32660[];
extern  VTBL_ENTRY _ZTV7ee32660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32660[];
static VTBL_ENTRY alt_thunk_names357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee326603fooEv,_ZTv0_n16_N7ee326603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee326603fooEv,_ZThn8_N7ee326603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32660 = {  "ee32660", // class name
  bases_ee32660, 4,
  &(vtc_ee32660[0]), // expected_vtbl_contents
  &(vtt_ee32660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32660),2, //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  ee42660  : dd2660 {
  int e;
  virtual void  bar(); // _ZN7ee426603barEv
  ~ee42660(); // tgen
  ee42660(); // tgen
};
//SIG(1 ee42660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee42660 ::bar(){vfunc_called(this, "_ZN7ee426603barEv");}
ee42660 ::~ee42660(){ note_dtor("ee42660", this);} // tgen
ee42660 ::ee42660(){ note_ctor("ee42660", this);} // tgen

static void Test_ee42660()
{
  extern Class_Descriptor cd_ee42660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42660, buf);
    ee42660 *dp, &lv = *(dp=new (buf) ee42660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(8,4), "ee42660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), 0, "ee42660");
    check_base_class_offset(lv, (cc660*)(dd2660*), 0, "ee42660");
    check_base_class_offset(lv, (dd2660*), 0, "ee42660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42660.e");
    test_class_info(&lv, &cd_ee42660);
    dp->~ee42660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42660(Test_ee42660, "ee42660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42660C1Ev();
extern void _ZN7ee42660D1Ev();
Name_Map name_map_ee42660[] = {
  NSPAIR(_ZN7ee42660C1Ev),
  NSPAIR(_ZN7ee42660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee42660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee42660[];
extern void _ZN7ee426603barEv();
extern void _ZN6dd26603fooEv();
static  VTBL_ENTRY vtc_ee42660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42660[0]),
  (VTBL_ENTRY)&_ZN7ee426603barEv,
  (VTBL_ENTRY)&_ZN6dd26603fooEv,
};
extern VTBL_ENTRY _ZTI7ee42660[];
extern  VTBL_ENTRY _ZTV7ee42660[];
Class_Descriptor cd_ee42660 = {  "ee42660", // class name
  bases_ee42660, 4,
  &(vtc_ee42660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42660),4, //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  ee52660  : virtual dd2660 {
  int e;
  virtual void  bar(); // _ZN7ee526603barEv
  ~ee52660(); // tgen
  ee52660(); // tgen
};
//SIG(1 ee52660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee52660 ::bar(){vfunc_called(this, "_ZN7ee526603barEv");}
ee52660 ::~ee52660(){ note_dtor("ee52660", this);} // tgen
ee52660 ::ee52660(){ note_ctor("ee52660", this);} // tgen

static void Test_ee52660()
{
  extern Class_Descriptor cd_ee52660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52660, buf);
    ee52660 *dp, &lv = *(dp=new (buf) ee52660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(24,12), "ee52660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), ABISELECT(16,8), "ee52660");
    check_base_class_offset(lv, (cc660*)(dd2660*), ABISELECT(16,8), "ee52660");
    check_base_class_offset(lv, (dd2660*), ABISELECT(16,8), "ee52660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52660.e");
    test_class_info(&lv, &cd_ee52660);
    dp->~ee52660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52660(Test_ee52660, "ee52660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52660C1Ev();
extern void _ZN7ee52660D1Ev();
Name_Map name_map_ee52660[] = {
  NSPAIR(_ZN7ee52660C1Ev),
  NSPAIR(_ZN7ee52660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee52660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52660[];
extern void _ZN7ee526603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee526603barEv,_ZTv0_n12_N7ee526603barEv)();
extern void ABISELECT(_ZThn16_N7ee526603barEv,_ZThn8_N7ee526603barEv)() __attribute__((weak));
extern void _ZN6dd26603fooEv();
static  VTBL_ENTRY vtc_ee52660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52660[0]),
  (VTBL_ENTRY)&_ZN7ee526603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee526603barEv,_ZTv0_n12_N7ee526603barEv),
  (VTBL_ENTRY)&_ZN6dd26603fooEv,
};
extern VTBL_ENTRY _ZTV7ee52660[];
static  VTT_ENTRY vtt_ee52660[] = {
  {&(_ZTV7ee52660[3]),  3,10},
  {&(_ZTV7ee52660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52660[];
extern  VTBL_ENTRY _ZTV7ee52660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52660[];
static VTBL_ENTRY alt_thunk_names358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee526603barEv,_ZTv0_n12_N7ee526603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee526603barEv,_ZThn8_N7ee526603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52660 = {  "ee52660", // class name
  bases_ee52660, 4,
  &(vtc_ee52660[0]), // expected_vtbl_contents
  &(vtt_ee52660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52660),2, //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  ee62660  : dd2660 {
  int e;
  virtual void  foo(); // _ZN7ee626603fooEv
  virtual void  bar(); // _ZN7ee626603barEv
  ~ee62660(); // tgen
  ee62660(); // tgen
};
//SIG(1 ee62660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62660 ::foo(){vfunc_called(this, "_ZN7ee626603fooEv");}
void  ee62660 ::bar(){vfunc_called(this, "_ZN7ee626603barEv");}
ee62660 ::~ee62660(){ note_dtor("ee62660", this);} // tgen
ee62660 ::ee62660(){ note_ctor("ee62660", this);} // tgen

static void Test_ee62660()
{
  extern Class_Descriptor cd_ee62660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62660, buf);
    ee62660 *dp, &lv = *(dp=new (buf) ee62660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(8,4), "ee62660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), 0, "ee62660");
    check_base_class_offset(lv, (cc660*)(dd2660*), 0, "ee62660");
    check_base_class_offset(lv, (dd2660*), 0, "ee62660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62660.e");
    test_class_info(&lv, &cd_ee62660);
    dp->~ee62660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62660(Test_ee62660, "ee62660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62660C1Ev();
extern void _ZN7ee62660D1Ev();
Name_Map name_map_ee62660[] = {
  NSPAIR(_ZN7ee62660C1Ev),
  NSPAIR(_ZN7ee62660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee62660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee62660[];
extern void _ZN7ee626603barEv();
extern void _ZN7ee626603fooEv();
static  VTBL_ENTRY vtc_ee62660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62660[0]),
  (VTBL_ENTRY)&_ZN7ee626603barEv,
  (VTBL_ENTRY)&_ZN7ee626603fooEv,
};
extern VTBL_ENTRY _ZTI7ee62660[];
extern  VTBL_ENTRY _ZTV7ee62660[];
Class_Descriptor cd_ee62660 = {  "ee62660", // class name
  bases_ee62660, 4,
  &(vtc_ee62660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62660),4, //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  ee72660  : virtual dd2660 {
  int e;
  virtual void  foo(); // _ZN7ee726603fooEv
  virtual void  bar(); // _ZN7ee726603barEv
  ~ee72660(); // tgen
  ee72660(); // tgen
};
//SIG(1 ee72660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72660 ::foo(){vfunc_called(this, "_ZN7ee726603fooEv");}
void  ee72660 ::bar(){vfunc_called(this, "_ZN7ee726603barEv");}
ee72660 ::~ee72660(){ note_dtor("ee72660", this);} // tgen
ee72660 ::ee72660(){ note_ctor("ee72660", this);} // tgen

static void Test_ee72660()
{
  extern Class_Descriptor cd_ee72660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72660, buf);
    ee72660 *dp, &lv = *(dp=new (buf) ee72660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd2660*), ABISELECT(24,12), "ee72660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd2660*), ABISELECT(16,8), "ee72660");
    check_base_class_offset(lv, (cc660*)(dd2660*), ABISELECT(16,8), "ee72660");
    check_base_class_offset(lv, (dd2660*), ABISELECT(16,8), "ee72660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72660.e");
    test_class_info(&lv, &cd_ee72660);
    dp->~ee72660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72660(Test_ee72660, "ee72660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72660C1Ev();
extern void _ZN7ee72660D1Ev();
Name_Map name_map_ee72660[] = {
  NSPAIR(_ZN7ee72660C1Ev),
  NSPAIR(_ZN7ee72660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd2660;
extern VTBL_ENTRY _ZTI6dd2660[];
extern  VTBL_ENTRY _ZTV6dd2660[];
static Base_Class bases_ee72660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2660,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72660[];
extern void _ZN7ee726603fooEv();
extern void _ZN7ee726603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee726603barEv,_ZTv0_n12_N7ee726603barEv)();
extern void ABISELECT(_ZThn16_N7ee726603barEv,_ZThn8_N7ee726603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee726603fooEv,_ZTv0_n16_N7ee726603fooEv)();
extern void ABISELECT(_ZThn16_N7ee726603fooEv,_ZThn8_N7ee726603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72660[0]),
  (VTBL_ENTRY)&_ZN7ee726603fooEv,
  (VTBL_ENTRY)&_ZN7ee726603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee726603barEv,_ZTv0_n12_N7ee726603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee726603fooEv,_ZTv0_n16_N7ee726603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72660[];
static  VTT_ENTRY vtt_ee72660[] = {
  {&(_ZTV7ee72660[3]),  3,11},
  {&(_ZTV7ee72660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72660[];
extern  VTBL_ENTRY _ZTV7ee72660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72660[];
static VTBL_ENTRY alt_thunk_names359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee726603fooEv,_ZTv0_n16_N7ee726603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee726603fooEv,_ZThn8_N7ee726603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee726603barEv,_ZTv0_n12_N7ee726603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee726603barEv,_ZThn8_N7ee726603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72660 = {  "ee72660", // class name
  bases_ee72660, 4,
  &(vtc_ee72660[0]), // expected_vtbl_contents
  &(vtt_ee72660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72660),2, //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  dd3660  : virtual cc660 {
  int d;
  virtual void  foo(); // _ZN6dd36603fooEv
  ~dd3660(); // tgen
  dd3660(); // tgen
};
//SIG(-1 dd3660) C1{ VBC2{ BC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd3660 ::foo(){vfunc_called(this, "_ZN6dd36603fooEv");}
dd3660 ::~dd3660(){ note_dtor("dd3660", this);} // tgen
dd3660 ::dd3660(){ note_ctor("dd3660", this);} // tgen

static void Test_dd3660()
{
  extern Class_Descriptor cd_dd3660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3660, buf);
    dd3660 *dp, &lv = *(dp=new (buf) dd3660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,12), "dd3660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,8), "dd3660");
    check_base_class_offset(lv, (cc660*), ABISELECT(16,8), "dd3660");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3660.d");
    test_class_info(&lv, &cd_dd3660);
    dp->~dd3660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3660(Test_dd3660, "dd3660", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3660C1Ev();
extern void _ZN6dd3660D1Ev();
Name_Map name_map_dd3660[] = {
  NSPAIR(_ZN6dd3660C1Ev),
  NSPAIR(_ZN6dd3660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd3660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3660[];
extern void _ZN6dd36603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3660[];
static  VTT_ENTRY vtt_dd3660[] = {
  {&(_ZTV6dd3660[3]),  3,10},
  {&(_ZTV6dd3660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static VTBL_ENTRY alt_thunk_names360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3660 = {  "dd3660", // class name
  bases_dd3660, 3,
  &(vtc_dd3660[0]), // expected_vtbl_contents
  &(vtt_dd3660[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3660),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names360,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03660  : dd3660 {
  int e;
  ~ee03660(); // tgen
  ee03660(); // tgen
};
//SIG(1 ee03660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee03660 ::~ee03660(){ note_dtor("ee03660", this);} // tgen
ee03660 ::ee03660(){ note_ctor("ee03660", this);} // tgen

static void Test_ee03660()
{
  extern Class_Descriptor cd_ee03660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03660, buf);
    ee03660 *dp, &lv = *(dp=new (buf) ee03660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee03660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee03660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(16,12), "ee03660");
    check_base_class_offset(lv, (dd3660*), 0, "ee03660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03660.e");
    test_class_info(&lv, &cd_ee03660);
    dp->~ee03660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03660(Test_ee03660, "ee03660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03660C1Ev();
extern void _ZN7ee03660D1Ev();
Name_Map name_map_ee03660[] = {
  NSPAIR(_ZN7ee03660C1Ev),
  NSPAIR(_ZN7ee03660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee03660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03660[];
extern void _ZN6dd36603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee03660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee03660[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee03660[] = {
  {&(_ZTV7ee03660[3]),  3,10},
  {&(_tg__ZTV6dd3660__7ee03660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee03660[4]),  4,6},
  {&(_ZTV7ee03660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03660[];
extern  VTBL_ENTRY _ZTV7ee03660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03660[];
static VTBL_ENTRY alt_thunk_names361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03660 = {  "ee03660", // class name
  bases_ee03660, 4,
  &(vtc_ee03660[0]), // expected_vtbl_contents
  &(vtt_ee03660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names361,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13660  : virtual dd3660 {
  int e;
  ~ee13660(); // tgen
  ee13660(); // tgen
};
//SIG(1 ee13660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee13660 ::~ee13660(){ note_dtor("ee13660", this);} // tgen
ee13660 ::ee13660(){ note_ctor("ee13660", this);} // tgen

static void Test_ee13660()
{
  extern Class_Descriptor cd_ee13660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13660, buf);
    ee13660 *dp, &lv = *(dp=new (buf) ee13660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee13660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee13660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(32,16), "ee13660");
    check_base_class_offset(lv, (dd3660*), ABISELECT(16,8), "ee13660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13660.e");
    test_class_info(&lv, &cd_ee13660);
    dp->~ee13660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13660(Test_ee13660, "ee13660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13660C1Ev();
extern void _ZN7ee13660D1Ev();
Name_Map name_map_ee13660[] = {
  NSPAIR(_ZN7ee13660C1Ev),
  NSPAIR(_ZN7ee13660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee13660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13660[];
extern void _ZN6dd36603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13660[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee13660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee13660[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee13660[] = {
  {&(_ZTV7ee13660[4]),  4,15},
  {&(_ZTV7ee13660[8]),  8,15},
  {&(_ZTV7ee13660[13]),  13,15},
  {&(_tg__ZTV6dd3660__7ee13660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee13660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13660[];
extern  VTBL_ENTRY _ZTV7ee13660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13660[];
static VTBL_ENTRY alt_thunk_names362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13660 = {  "ee13660", // class name
  bases_ee13660, 4,
  &(vtc_ee13660[0]), // expected_vtbl_contents
  &(vtt_ee13660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13660),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names362,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23660  : dd3660 {
  int e;
  virtual void  foo(); // _ZN7ee236603fooEv
  ~ee23660(); // tgen
  ee23660(); // tgen
};
//SIG(1 ee23660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee23660 ::foo(){vfunc_called(this, "_ZN7ee236603fooEv");}
ee23660 ::~ee23660(){ note_dtor("ee23660", this);} // tgen
ee23660 ::ee23660(){ note_ctor("ee23660", this);} // tgen

static void Test_ee23660()
{
  extern Class_Descriptor cd_ee23660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23660, buf);
    ee23660 *dp, &lv = *(dp=new (buf) ee23660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee23660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee23660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(16,12), "ee23660");
    check_base_class_offset(lv, (dd3660*), 0, "ee23660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23660.e");
    test_class_info(&lv, &cd_ee23660);
    dp->~ee23660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23660(Test_ee23660, "ee23660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23660C1Ev();
extern void _ZN7ee23660D1Ev();
Name_Map name_map_ee23660[] = {
  NSPAIR(_ZN7ee23660C1Ev),
  NSPAIR(_ZN7ee23660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee23660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23660[];
extern void _ZN7ee236603fooEv();
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee236603fooEv,_ZTv0_n16_N7ee236603fooEv)();
extern void ABISELECT(_ZThn16_N7ee236603fooEv,_ZThn12_N7ee236603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23660[0]),
  (VTBL_ENTRY)&_ZN7ee236603fooEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee236603fooEv,_ZTv0_n16_N7ee236603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee23660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee23660[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee23660[] = {
  {&(_ZTV7ee23660[3]),  3,10},
  {&(_tg__ZTV6dd3660__7ee23660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee23660[4]),  4,6},
  {&(_ZTV7ee23660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23660[];
extern  VTBL_ENTRY _ZTV7ee23660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23660[];
static VTBL_ENTRY alt_thunk_names363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee236603fooEv,_ZTv0_n16_N7ee236603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee236603fooEv,_ZThn12_N7ee236603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23660 = {  "ee23660", // class name
  bases_ee23660, 4,
  &(vtc_ee23660[0]), // expected_vtbl_contents
  &(vtt_ee23660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names363,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33660  : virtual dd3660 {
  int e;
  virtual void  foo(); // _ZN7ee336603fooEv
  ~ee33660(); // tgen
  ee33660(); // tgen
};
//SIG(1 ee33660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee33660 ::foo(){vfunc_called(this, "_ZN7ee336603fooEv");}
ee33660 ::~ee33660(){ note_dtor("ee33660", this);} // tgen
ee33660 ::ee33660(){ note_ctor("ee33660", this);} // tgen

static void Test_ee33660()
{
  extern Class_Descriptor cd_ee33660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33660, buf);
    ee33660 *dp, &lv = *(dp=new (buf) ee33660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee33660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee33660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(32,16), "ee33660");
    check_base_class_offset(lv, (dd3660*), ABISELECT(16,8), "ee33660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33660.e");
    test_class_info(&lv, &cd_ee33660);
    dp->~ee33660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33660(Test_ee33660, "ee33660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33660C1Ev();
extern void _ZN7ee33660D1Ev();
Name_Map name_map_ee33660[] = {
  NSPAIR(_ZN7ee33660C1Ev),
  NSPAIR(_ZN7ee33660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee33660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33660[];
extern void _ZN7ee336603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee336603fooEv,_ZTv0_n16_N7ee336603fooEv)();
extern void ABISELECT(_ZThn16_N7ee336603fooEv,_ZThn8_N7ee336603fooEv)() __attribute__((weak));
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee336603fooEv,_ZTv0_n16_N7ee336603fooEv)();
extern void ABISELECT(_ZThn32_N7ee336603fooEv,_ZThn16_N7ee336603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33660[0]),
  (VTBL_ENTRY)&_ZN7ee336603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee336603fooEv,_ZTv0_n16_N7ee336603fooEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee336603fooEv,_ZTv0_n16_N7ee336603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee33660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee33660[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee33660[] = {
  {&(_ZTV7ee33660[4]),  4,16},
  {&(_ZTV7ee33660[9]),  9,16},
  {&(_ZTV7ee33660[14]),  14,16},
  {&(_tg__ZTV6dd3660__7ee33660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee33660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33660[];
extern  VTBL_ENTRY _ZTV7ee33660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33660[];
static VTBL_ENTRY alt_thunk_names364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee336603fooEv,_ZTv0_n16_N7ee336603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee336603fooEv,_ZThn16_N7ee336603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee336603fooEv,_ZThn8_N7ee336603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33660 = {  "ee33660", // class name
  bases_ee33660, 4,
  &(vtc_ee33660[0]), // expected_vtbl_contents
  &(vtt_ee33660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33660),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names364,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43660  : dd3660 {
  int e;
  virtual void  bar(); // _ZN7ee436603barEv
  ~ee43660(); // tgen
  ee43660(); // tgen
};
//SIG(1 ee43660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee43660 ::bar(){vfunc_called(this, "_ZN7ee436603barEv");}
ee43660 ::~ee43660(){ note_dtor("ee43660", this);} // tgen
ee43660 ::ee43660(){ note_ctor("ee43660", this);} // tgen

static void Test_ee43660()
{
  extern Class_Descriptor cd_ee43660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43660, buf);
    ee43660 *dp, &lv = *(dp=new (buf) ee43660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee43660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee43660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(16,12), "ee43660");
    check_base_class_offset(lv, (dd3660*), 0, "ee43660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43660.e");
    test_class_info(&lv, &cd_ee43660);
    dp->~ee43660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43660(Test_ee43660, "ee43660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43660C1Ev();
extern void _ZN7ee43660D1Ev();
Name_Map name_map_ee43660[] = {
  NSPAIR(_ZN7ee43660C1Ev),
  NSPAIR(_ZN7ee43660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee43660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43660[];
extern void _ZN6dd36603fooEv();
extern void _ZN7ee436603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee436603barEv,_ZTv0_n12_N7ee436603barEv)();
extern void ABISELECT(_ZThn16_N7ee436603barEv,_ZThn12_N7ee436603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
  (VTBL_ENTRY)&_ZN7ee436603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee436603barEv,_ZTv0_n12_N7ee436603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee43660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee43660[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee43660[] = {
  {&(_ZTV7ee43660[3]),  3,11},
  {&(_tg__ZTV6dd3660__7ee43660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee43660[4]),  4,6},
  {&(_ZTV7ee43660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43660[];
extern  VTBL_ENTRY _ZTV7ee43660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43660[];
static VTBL_ENTRY alt_thunk_names365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee436603barEv,_ZTv0_n12_N7ee436603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee436603barEv,_ZThn12_N7ee436603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43660 = {  "ee43660", // class name
  bases_ee43660, 4,
  &(vtc_ee43660[0]), // expected_vtbl_contents
  &(vtt_ee43660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names365,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53660  : virtual dd3660 {
  int e;
  virtual void  bar(); // _ZN7ee536603barEv
  ~ee53660(); // tgen
  ee53660(); // tgen
};
//SIG(1 ee53660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee53660 ::bar(){vfunc_called(this, "_ZN7ee536603barEv");}
ee53660 ::~ee53660(){ note_dtor("ee53660", this);} // tgen
ee53660 ::ee53660(){ note_ctor("ee53660", this);} // tgen

static void Test_ee53660()
{
  extern Class_Descriptor cd_ee53660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53660, buf);
    ee53660 *dp, &lv = *(dp=new (buf) ee53660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee53660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee53660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(32,16), "ee53660");
    check_base_class_offset(lv, (dd3660*), ABISELECT(16,8), "ee53660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53660.e");
    test_class_info(&lv, &cd_ee53660);
    dp->~ee53660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53660(Test_ee53660, "ee53660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53660C1Ev();
extern void _ZN7ee53660D1Ev();
Name_Map name_map_ee53660[] = {
  NSPAIR(_ZN7ee53660C1Ev),
  NSPAIR(_ZN7ee53660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee53660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53660[];
extern void _ZN7ee536603barEv();
extern void _ZN6dd36603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee536603barEv,_ZTv0_n12_N7ee536603barEv)();
extern void ABISELECT(_ZThn32_N7ee536603barEv,_ZThn16_N7ee536603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53660[0]),
  (VTBL_ENTRY)&_ZN7ee536603barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee536603barEv,_ZTv0_n12_N7ee536603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee53660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee53660[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee53660[] = {
  {&(_ZTV7ee53660[4]),  4,16},
  {&(_ZTV7ee53660[9]),  9,16},
  {&(_ZTV7ee53660[14]),  14,16},
  {&(_tg__ZTV6dd3660__7ee53660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee53660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53660[];
extern  VTBL_ENTRY _ZTV7ee53660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53660[];
static VTBL_ENTRY alt_thunk_names366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee536603barEv,_ZTv0_n12_N7ee536603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee536603barEv,_ZThn16_N7ee536603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53660 = {  "ee53660", // class name
  bases_ee53660, 4,
  &(vtc_ee53660[0]), // expected_vtbl_contents
  &(vtt_ee53660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53660),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names366,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63660  : dd3660 {
  int e;
  virtual void  foo(); // _ZN7ee636603fooEv
  virtual void  bar(); // _ZN7ee636603barEv
  ~ee63660(); // tgen
  ee63660(); // tgen
};
//SIG(1 ee63660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63660 ::foo(){vfunc_called(this, "_ZN7ee636603fooEv");}
void  ee63660 ::bar(){vfunc_called(this, "_ZN7ee636603barEv");}
ee63660 ::~ee63660(){ note_dtor("ee63660", this);} // tgen
ee63660 ::ee63660(){ note_ctor("ee63660", this);} // tgen

static void Test_ee63660()
{
  extern Class_Descriptor cd_ee63660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63660, buf);
    ee63660 *dp, &lv = *(dp=new (buf) ee63660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee63660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee63660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(16,12), "ee63660");
    check_base_class_offset(lv, (dd3660*), 0, "ee63660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63660.e");
    test_class_info(&lv, &cd_ee63660);
    dp->~ee63660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63660(Test_ee63660, "ee63660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63660C1Ev();
extern void _ZN7ee63660D1Ev();
Name_Map name_map_ee63660[] = {
  NSPAIR(_ZN7ee63660C1Ev),
  NSPAIR(_ZN7ee63660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee63660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63660[];
extern void _ZN7ee636603fooEv();
extern void _ZN7ee636603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee636603barEv,_ZTv0_n12_N7ee636603barEv)();
extern void ABISELECT(_ZThn16_N7ee636603barEv,_ZThn12_N7ee636603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee636603fooEv,_ZTv0_n16_N7ee636603fooEv)();
extern void ABISELECT(_ZThn16_N7ee636603fooEv,_ZThn12_N7ee636603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63660[0]),
  (VTBL_ENTRY)&_ZN7ee636603fooEv,
  (VTBL_ENTRY)&_ZN7ee636603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee636603barEv,_ZTv0_n12_N7ee636603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee636603fooEv,_ZTv0_n16_N7ee636603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee63660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee63660[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee63660[] = {
  {&(_ZTV7ee63660[3]),  3,11},
  {&(_tg__ZTV6dd3660__7ee63660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee63660[4]),  4,6},
  {&(_ZTV7ee63660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63660[];
extern  VTBL_ENTRY _ZTV7ee63660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63660[];
static VTBL_ENTRY alt_thunk_names367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn12_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee636603fooEv,_ZTv0_n16_N7ee636603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee636603fooEv,_ZThn12_N7ee636603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee636603barEv,_ZTv0_n12_N7ee636603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee636603barEv,_ZThn12_N7ee636603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63660 = {  "ee63660", // class name
  bases_ee63660, 4,
  &(vtc_ee63660[0]), // expected_vtbl_contents
  &(vtt_ee63660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names367,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73660  : virtual dd3660 {
  int e;
  virtual void  foo(); // _ZN7ee736603fooEv
  virtual void  bar(); // _ZN7ee736603barEv
  ~ee73660(); // tgen
  ee73660(); // tgen
};
//SIG(1 ee73660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73660 ::foo(){vfunc_called(this, "_ZN7ee736603fooEv");}
void  ee73660 ::bar(){vfunc_called(this, "_ZN7ee736603barEv");}
ee73660 ::~ee73660(){ note_dtor("ee73660", this);} // tgen
ee73660 ::ee73660(){ note_ctor("ee73660", this);} // tgen

static void Test_ee73660()
{
  extern Class_Descriptor cd_ee73660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73660, buf);
    ee73660 *dp, &lv = *(dp=new (buf) ee73660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee73660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee73660");
    check_base_class_offset(lv, (cc660*)(dd3660*), ABISELECT(32,16), "ee73660");
    check_base_class_offset(lv, (dd3660*), ABISELECT(16,8), "ee73660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73660.e");
    test_class_info(&lv, &cd_ee73660);
    dp->~ee73660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73660(Test_ee73660, "ee73660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73660C1Ev();
extern void _ZN7ee73660D1Ev();
Name_Map name_map_ee73660[] = {
  NSPAIR(_ZN7ee73660C1Ev),
  NSPAIR(_ZN7ee73660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd3660;
extern VTBL_ENTRY _ZTI6dd3660[];
extern  VTBL_ENTRY _ZTV6dd3660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3660[];
static Base_Class bases_ee73660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73660[];
extern void _ZN7ee736603fooEv();
extern void _ZN7ee736603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee736603fooEv,_ZTv0_n16_N7ee736603fooEv)();
extern void ABISELECT(_ZThn16_N7ee736603fooEv,_ZThn8_N7ee736603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee736603barEv,_ZTv0_n12_N7ee736603barEv)();
extern void ABISELECT(_ZThn32_N7ee736603barEv,_ZThn16_N7ee736603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee736603fooEv,_ZTv0_n16_N7ee736603fooEv)();
extern void ABISELECT(_ZThn32_N7ee736603fooEv,_ZThn16_N7ee736603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73660[0]),
  (VTBL_ENTRY)&_ZN7ee736603fooEv,
  (VTBL_ENTRY)&_ZN7ee736603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee736603fooEv,_ZTv0_n16_N7ee736603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee736603barEv,_ZTv0_n12_N7ee736603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee736603fooEv,_ZTv0_n16_N7ee736603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73660[];
extern void _ZN6dd36603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3660__7ee73660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN6dd36603fooEv,
};
extern void _ZN5cc6603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv)();
extern void ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd3660__7ee73660[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3660[0]),
  (VTBL_ENTRY)&_ZN5cc6603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv),
};
static  VTT_ENTRY vtt_ee73660[] = {
  {&(_ZTV7ee73660[4]),  4,17},
  {&(_ZTV7ee73660[10]),  10,17},
  {&(_ZTV7ee73660[15]),  15,17},
  {&(_tg__ZTV6dd3660__7ee73660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd3660__7ee73660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73660[];
extern  VTBL_ENTRY _ZTV7ee73660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73660[];
static VTBL_ENTRY alt_thunk_names368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd36603fooEv,_ZTv0_n16_N6dd36603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36603fooEv,_ZThn8_N6dd36603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee736603barEv,_ZTv0_n12_N7ee736603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee736603barEv,_ZThn16_N7ee736603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee736603fooEv,_ZTv0_n16_N7ee736603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee736603fooEv,_ZThn16_N7ee736603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee736603fooEv,_ZThn8_N7ee736603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73660 = {  "ee73660", // class name
  bases_ee73660, 4,
  &(vtc_ee73660[0]), // expected_vtbl_contents
  &(vtt_ee73660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73660),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names368,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4660  : cc660 {
  int d;
  virtual void  bar(); // _ZN6dd46603barEv
  ~dd4660(); // tgen
  dd4660(); // tgen
};
//SIG(-1 dd4660) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd4660 ::bar(){vfunc_called(this, "_ZN6dd46603barEv");}
dd4660 ::~dd4660(){ note_dtor("dd4660", this);} // tgen
dd4660 ::dd4660(){ note_ctor("dd4660", this);} // tgen

static void Test_dd4660()
{
  extern Class_Descriptor cd_dd4660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4660, buf);
    dd4660 *dp, &lv = *(dp=new (buf) dd4660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(8,4), "dd4660");
    check_base_class_offset(lv, (bb60*)(cc660*), 0, "dd4660");
    check_base_class_offset(lv, (cc660*), 0, "dd4660");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4660.d");
    test_class_info(&lv, &cd_dd4660);
    dp->~dd4660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4660(Test_dd4660, "dd4660", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4660C1Ev();
extern void _ZN6dd4660D1Ev();
Name_Map name_map_dd4660[] = {
  NSPAIR(_ZN6dd4660C1Ev),
  NSPAIR(_ZN6dd4660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd4660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd4660[];
extern void _ZN6dd46603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_dd4660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4660[0]),
  (VTBL_ENTRY)&_ZN6dd46603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
Class_Descriptor cd_dd4660 = {  "dd4660", // class name
  bases_dd4660, 3,
  &(vtc_dd4660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4660),4, //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  ee04660  : dd4660 {
  int e;
  ~ee04660(); // tgen
  ee04660(); // tgen
};
//SIG(1 ee04660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee04660 ::~ee04660(){ note_dtor("ee04660", this);} // tgen
ee04660 ::ee04660(){ note_ctor("ee04660", this);} // tgen

static void Test_ee04660()
{
  extern Class_Descriptor cd_ee04660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04660, buf);
    ee04660 *dp, &lv = *(dp=new (buf) ee04660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(8,4), "ee04660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), 0, "ee04660");
    check_base_class_offset(lv, (cc660*)(dd4660*), 0, "ee04660");
    check_base_class_offset(lv, (dd4660*), 0, "ee04660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04660.e");
    test_class_info(&lv, &cd_ee04660);
    dp->~ee04660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04660(Test_ee04660, "ee04660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04660C1Ev();
extern void _ZN7ee04660D1Ev();
Name_Map name_map_ee04660[] = {
  NSPAIR(_ZN7ee04660C1Ev),
  NSPAIR(_ZN7ee04660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee04660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04660[];
extern void _ZN6dd46603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee04660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04660[0]),
  (VTBL_ENTRY)&_ZN6dd46603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTI7ee04660[];
extern  VTBL_ENTRY _ZTV7ee04660[];
Class_Descriptor cd_ee04660 = {  "ee04660", // class name
  bases_ee04660, 4,
  &(vtc_ee04660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04660),4, //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  ee14660  : virtual dd4660 {
  int e;
  ~ee14660(); // tgen
  ee14660(); // tgen
};
//SIG(1 ee14660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee14660 ::~ee14660(){ note_dtor("ee14660", this);} // tgen
ee14660 ::ee14660(){ note_ctor("ee14660", this);} // tgen

static void Test_ee14660()
{
  extern Class_Descriptor cd_ee14660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14660, buf);
    ee14660 *dp, &lv = *(dp=new (buf) ee14660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(24,12), "ee14660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), ABISELECT(16,8), "ee14660");
    check_base_class_offset(lv, (cc660*)(dd4660*), ABISELECT(16,8), "ee14660");
    check_base_class_offset(lv, (dd4660*), ABISELECT(16,8), "ee14660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14660.e");
    test_class_info(&lv, &cd_ee14660);
    dp->~ee14660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14660(Test_ee14660, "ee14660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14660C1Ev();
extern void _ZN7ee14660D1Ev();
Name_Map name_map_ee14660[] = {
  NSPAIR(_ZN7ee14660C1Ev),
  NSPAIR(_ZN7ee14660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee14660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14660[];
extern void _ZN6dd46603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee14660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14660[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14660[0]),
  (VTBL_ENTRY)&_ZN6dd46603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee14660[];
static  VTT_ENTRY vtt_ee14660[] = {
  {&(_ZTV7ee14660[3]),  3,9},
  {&(_ZTV7ee14660[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14660[];
extern  VTBL_ENTRY _ZTV7ee14660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14660[];
Class_Descriptor cd_ee14660 = {  "ee14660", // class name
  bases_ee14660, 4,
  &(vtc_ee14660[0]), // expected_vtbl_contents
  &(vtt_ee14660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14660),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14660),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  ee24660  : dd4660 {
  int e;
  virtual void  foo(); // _ZN7ee246603fooEv
  ~ee24660(); // tgen
  ee24660(); // tgen
};
//SIG(1 ee24660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee24660 ::foo(){vfunc_called(this, "_ZN7ee246603fooEv");}
ee24660 ::~ee24660(){ note_dtor("ee24660", this);} // tgen
ee24660 ::ee24660(){ note_ctor("ee24660", this);} // tgen

static void Test_ee24660()
{
  extern Class_Descriptor cd_ee24660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24660, buf);
    ee24660 *dp, &lv = *(dp=new (buf) ee24660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(8,4), "ee24660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), 0, "ee24660");
    check_base_class_offset(lv, (cc660*)(dd4660*), 0, "ee24660");
    check_base_class_offset(lv, (dd4660*), 0, "ee24660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24660.e");
    test_class_info(&lv, &cd_ee24660);
    dp->~ee24660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24660(Test_ee24660, "ee24660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24660C1Ev();
extern void _ZN7ee24660D1Ev();
Name_Map name_map_ee24660[] = {
  NSPAIR(_ZN7ee24660C1Ev),
  NSPAIR(_ZN7ee24660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee24660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee24660[];
extern void _ZN6dd46603barEv();
extern void _ZN7ee246603fooEv();
static  VTBL_ENTRY vtc_ee24660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24660[0]),
  (VTBL_ENTRY)&_ZN6dd46603barEv,
  (VTBL_ENTRY)&_ZN7ee246603fooEv,
};
extern VTBL_ENTRY _ZTI7ee24660[];
extern  VTBL_ENTRY _ZTV7ee24660[];
Class_Descriptor cd_ee24660 = {  "ee24660", // class name
  bases_ee24660, 4,
  &(vtc_ee24660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24660),4, //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  ee34660  : virtual dd4660 {
  int e;
  virtual void  foo(); // _ZN7ee346603fooEv
  ~ee34660(); // tgen
  ee34660(); // tgen
};
//SIG(1 ee34660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee34660 ::foo(){vfunc_called(this, "_ZN7ee346603fooEv");}
ee34660 ::~ee34660(){ note_dtor("ee34660", this);} // tgen
ee34660 ::ee34660(){ note_ctor("ee34660", this);} // tgen

static void Test_ee34660()
{
  extern Class_Descriptor cd_ee34660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34660, buf);
    ee34660 *dp, &lv = *(dp=new (buf) ee34660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(24,12), "ee34660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), ABISELECT(16,8), "ee34660");
    check_base_class_offset(lv, (cc660*)(dd4660*), ABISELECT(16,8), "ee34660");
    check_base_class_offset(lv, (dd4660*), ABISELECT(16,8), "ee34660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34660.e");
    test_class_info(&lv, &cd_ee34660);
    dp->~ee34660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34660(Test_ee34660, "ee34660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34660C1Ev();
extern void _ZN7ee34660D1Ev();
Name_Map name_map_ee34660[] = {
  NSPAIR(_ZN7ee34660C1Ev),
  NSPAIR(_ZN7ee34660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee34660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34660[];
extern void _ZN7ee346603fooEv();
extern void _ZN6dd46603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee346603fooEv,_ZTv0_n16_N7ee346603fooEv)();
extern void ABISELECT(_ZThn16_N7ee346603fooEv,_ZThn8_N7ee346603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34660[0]),
  (VTBL_ENTRY)&_ZN7ee346603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34660[0]),
  (VTBL_ENTRY)&_ZN6dd46603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee346603fooEv,_ZTv0_n16_N7ee346603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34660[];
static  VTT_ENTRY vtt_ee34660[] = {
  {&(_ZTV7ee34660[3]),  3,10},
  {&(_ZTV7ee34660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34660[];
extern  VTBL_ENTRY _ZTV7ee34660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34660[];
static VTBL_ENTRY alt_thunk_names369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee346603fooEv,_ZTv0_n16_N7ee346603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee346603fooEv,_ZThn8_N7ee346603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34660 = {  "ee34660", // class name
  bases_ee34660, 4,
  &(vtc_ee34660[0]), // expected_vtbl_contents
  &(vtt_ee34660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34660),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names369,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44660  : dd4660 {
  int e;
  virtual void  bar(); // _ZN7ee446603barEv
  ~ee44660(); // tgen
  ee44660(); // tgen
};
//SIG(1 ee44660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee44660 ::bar(){vfunc_called(this, "_ZN7ee446603barEv");}
ee44660 ::~ee44660(){ note_dtor("ee44660", this);} // tgen
ee44660 ::ee44660(){ note_ctor("ee44660", this);} // tgen

static void Test_ee44660()
{
  extern Class_Descriptor cd_ee44660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44660, buf);
    ee44660 *dp, &lv = *(dp=new (buf) ee44660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(8,4), "ee44660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), 0, "ee44660");
    check_base_class_offset(lv, (cc660*)(dd4660*), 0, "ee44660");
    check_base_class_offset(lv, (dd4660*), 0, "ee44660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44660.e");
    test_class_info(&lv, &cd_ee44660);
    dp->~ee44660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44660(Test_ee44660, "ee44660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44660C1Ev();
extern void _ZN7ee44660D1Ev();
Name_Map name_map_ee44660[] = {
  NSPAIR(_ZN7ee44660C1Ev),
  NSPAIR(_ZN7ee44660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee44660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee44660[];
extern void _ZN7ee446603barEv();
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee44660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44660[0]),
  (VTBL_ENTRY)&_ZN7ee446603barEv,
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTI7ee44660[];
extern  VTBL_ENTRY _ZTV7ee44660[];
Class_Descriptor cd_ee44660 = {  "ee44660", // class name
  bases_ee44660, 4,
  &(vtc_ee44660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44660),4, //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  ee54660  : virtual dd4660 {
  int e;
  virtual void  bar(); // _ZN7ee546603barEv
  ~ee54660(); // tgen
  ee54660(); // tgen
};
//SIG(1 ee54660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee54660 ::bar(){vfunc_called(this, "_ZN7ee546603barEv");}
ee54660 ::~ee54660(){ note_dtor("ee54660", this);} // tgen
ee54660 ::ee54660(){ note_ctor("ee54660", this);} // tgen

static void Test_ee54660()
{
  extern Class_Descriptor cd_ee54660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54660, buf);
    ee54660 *dp, &lv = *(dp=new (buf) ee54660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(24,12), "ee54660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), ABISELECT(16,8), "ee54660");
    check_base_class_offset(lv, (cc660*)(dd4660*), ABISELECT(16,8), "ee54660");
    check_base_class_offset(lv, (dd4660*), ABISELECT(16,8), "ee54660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54660.e");
    test_class_info(&lv, &cd_ee54660);
    dp->~ee54660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54660(Test_ee54660, "ee54660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54660C1Ev();
extern void _ZN7ee54660D1Ev();
Name_Map name_map_ee54660[] = {
  NSPAIR(_ZN7ee54660C1Ev),
  NSPAIR(_ZN7ee54660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee54660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54660[];
extern void _ZN7ee546603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee546603barEv,_ZTv0_n12_N7ee546603barEv)();
extern void ABISELECT(_ZThn16_N7ee546603barEv,_ZThn8_N7ee546603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee54660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54660[0]),
  (VTBL_ENTRY)&_ZN7ee546603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee546603barEv,_ZTv0_n12_N7ee546603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee54660[];
static  VTT_ENTRY vtt_ee54660[] = {
  {&(_ZTV7ee54660[3]),  3,10},
  {&(_ZTV7ee54660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54660[];
extern  VTBL_ENTRY _ZTV7ee54660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54660[];
static VTBL_ENTRY alt_thunk_names370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee546603barEv,_ZTv0_n12_N7ee546603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee546603barEv,_ZThn8_N7ee546603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54660 = {  "ee54660", // class name
  bases_ee54660, 4,
  &(vtc_ee54660[0]), // expected_vtbl_contents
  &(vtt_ee54660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54660),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names370,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64660  : dd4660 {
  int e;
  virtual void  foo(); // _ZN7ee646603fooEv
  virtual void  bar(); // _ZN7ee646603barEv
  ~ee64660(); // tgen
  ee64660(); // tgen
};
//SIG(1 ee64660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64660 ::foo(){vfunc_called(this, "_ZN7ee646603fooEv");}
void  ee64660 ::bar(){vfunc_called(this, "_ZN7ee646603barEv");}
ee64660 ::~ee64660(){ note_dtor("ee64660", this);} // tgen
ee64660 ::ee64660(){ note_ctor("ee64660", this);} // tgen

static void Test_ee64660()
{
  extern Class_Descriptor cd_ee64660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64660, buf);
    ee64660 *dp, &lv = *(dp=new (buf) ee64660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(8,4), "ee64660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), 0, "ee64660");
    check_base_class_offset(lv, (cc660*)(dd4660*), 0, "ee64660");
    check_base_class_offset(lv, (dd4660*), 0, "ee64660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64660.e");
    test_class_info(&lv, &cd_ee64660);
    dp->~ee64660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64660(Test_ee64660, "ee64660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64660C1Ev();
extern void _ZN7ee64660D1Ev();
Name_Map name_map_ee64660[] = {
  NSPAIR(_ZN7ee64660C1Ev),
  NSPAIR(_ZN7ee64660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee64660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee64660[];
extern void _ZN7ee646603barEv();
extern void _ZN7ee646603fooEv();
static  VTBL_ENTRY vtc_ee64660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64660[0]),
  (VTBL_ENTRY)&_ZN7ee646603barEv,
  (VTBL_ENTRY)&_ZN7ee646603fooEv,
};
extern VTBL_ENTRY _ZTI7ee64660[];
extern  VTBL_ENTRY _ZTV7ee64660[];
Class_Descriptor cd_ee64660 = {  "ee64660", // class name
  bases_ee64660, 4,
  &(vtc_ee64660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64660),4, //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  ee74660  : virtual dd4660 {
  int e;
  virtual void  foo(); // _ZN7ee746603fooEv
  virtual void  bar(); // _ZN7ee746603barEv
  ~ee74660(); // tgen
  ee74660(); // tgen
};
//SIG(1 ee74660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74660 ::foo(){vfunc_called(this, "_ZN7ee746603fooEv");}
void  ee74660 ::bar(){vfunc_called(this, "_ZN7ee746603barEv");}
ee74660 ::~ee74660(){ note_dtor("ee74660", this);} // tgen
ee74660 ::ee74660(){ note_ctor("ee74660", this);} // tgen

static void Test_ee74660()
{
  extern Class_Descriptor cd_ee74660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74660, buf);
    ee74660 *dp, &lv = *(dp=new (buf) ee74660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd4660*), ABISELECT(24,12), "ee74660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd4660*), ABISELECT(16,8), "ee74660");
    check_base_class_offset(lv, (cc660*)(dd4660*), ABISELECT(16,8), "ee74660");
    check_base_class_offset(lv, (dd4660*), ABISELECT(16,8), "ee74660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74660.e");
    test_class_info(&lv, &cd_ee74660);
    dp->~ee74660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74660(Test_ee74660, "ee74660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74660C1Ev();
extern void _ZN7ee74660D1Ev();
Name_Map name_map_ee74660[] = {
  NSPAIR(_ZN7ee74660C1Ev),
  NSPAIR(_ZN7ee74660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd4660;
extern VTBL_ENTRY _ZTI6dd4660[];
extern  VTBL_ENTRY _ZTV6dd4660[];
static Base_Class bases_ee74660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4660,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74660[];
extern void _ZN7ee746603fooEv();
extern void _ZN7ee746603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee746603barEv,_ZTv0_n12_N7ee746603barEv)();
extern void ABISELECT(_ZThn16_N7ee746603barEv,_ZThn8_N7ee746603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee746603fooEv,_ZTv0_n16_N7ee746603fooEv)();
extern void ABISELECT(_ZThn16_N7ee746603fooEv,_ZThn8_N7ee746603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74660[0]),
  (VTBL_ENTRY)&_ZN7ee746603fooEv,
  (VTBL_ENTRY)&_ZN7ee746603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee746603barEv,_ZTv0_n12_N7ee746603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee746603fooEv,_ZTv0_n16_N7ee746603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74660[];
static  VTT_ENTRY vtt_ee74660[] = {
  {&(_ZTV7ee74660[3]),  3,11},
  {&(_ZTV7ee74660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74660[];
extern  VTBL_ENTRY _ZTV7ee74660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74660[];
static VTBL_ENTRY alt_thunk_names371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee746603fooEv,_ZTv0_n16_N7ee746603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee746603fooEv,_ZThn8_N7ee746603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee746603barEv,_ZTv0_n12_N7ee746603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee746603barEv,_ZThn8_N7ee746603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74660 = {  "ee74660", // class name
  bases_ee74660, 4,
  &(vtc_ee74660[0]), // expected_vtbl_contents
  &(vtt_ee74660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74660),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names371,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5660  : virtual cc660 {
  int d;
  virtual void  bar(); // _ZN6dd56603barEv
  ~dd5660(); // tgen
  dd5660(); // tgen
};
//SIG(-1 dd5660) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd5660 ::bar(){vfunc_called(this, "_ZN6dd56603barEv");}
dd5660 ::~dd5660(){ note_dtor("dd5660", this);} // tgen
dd5660 ::dd5660(){ note_ctor("dd5660", this);} // tgen

static void Test_dd5660()
{
  extern Class_Descriptor cd_dd5660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5660, buf);
    dd5660 *dp, &lv = *(dp=new (buf) dd5660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,12), "dd5660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,8), "dd5660");
    check_base_class_offset(lv, (cc660*), ABISELECT(16,8), "dd5660");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5660.d");
    test_class_info(&lv, &cd_dd5660);
    dp->~dd5660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5660(Test_dd5660, "dd5660", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5660C1Ev();
extern void _ZN6dd5660D1Ev();
Name_Map name_map_dd5660[] = {
  NSPAIR(_ZN6dd5660C1Ev),
  NSPAIR(_ZN6dd5660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd5660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5660[];
extern void _ZN6dd56603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_dd5660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV6dd5660[];
static  VTT_ENTRY vtt_dd5660[] = {
  {&(_ZTV6dd5660[3]),  3,10},
  {&(_ZTV6dd5660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static VTBL_ENTRY alt_thunk_names372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5660 = {  "dd5660", // class name
  bases_dd5660, 3,
  &(vtc_dd5660[0]), // expected_vtbl_contents
  &(vtt_dd5660[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5660),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names372,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05660  : dd5660 {
  int e;
  ~ee05660(); // tgen
  ee05660(); // tgen
};
//SIG(1 ee05660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee05660 ::~ee05660(){ note_dtor("ee05660", this);} // tgen
ee05660 ::ee05660(){ note_ctor("ee05660", this);} // tgen

static void Test_ee05660()
{
  extern Class_Descriptor cd_ee05660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05660, buf);
    ee05660 *dp, &lv = *(dp=new (buf) ee05660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee05660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee05660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(16,12), "ee05660");
    check_base_class_offset(lv, (dd5660*), 0, "ee05660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05660.e");
    test_class_info(&lv, &cd_ee05660);
    dp->~ee05660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05660(Test_ee05660, "ee05660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05660C1Ev();
extern void _ZN7ee05660D1Ev();
Name_Map name_map_ee05660[] = {
  NSPAIR(_ZN7ee05660C1Ev),
  NSPAIR(_ZN7ee05660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee05660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05660[];
extern void _ZN6dd56603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee05660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee05660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee05660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee05660[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee05660[] = {
  {&(_ZTV7ee05660[3]),  3,10},
  {&(_tg__ZTV6dd5660__7ee05660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee05660[4]),  4,6},
  {&(_ZTV7ee05660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05660[];
extern  VTBL_ENTRY _ZTV7ee05660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05660[];
static VTBL_ENTRY alt_thunk_names373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05660 = {  "ee05660", // class name
  bases_ee05660, 4,
  &(vtc_ee05660[0]), // expected_vtbl_contents
  &(vtt_ee05660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05660),4, //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  ee15660  : virtual dd5660 {
  int e;
  ~ee15660(); // tgen
  ee15660(); // tgen
};
//SIG(1 ee15660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee15660 ::~ee15660(){ note_dtor("ee15660", this);} // tgen
ee15660 ::ee15660(){ note_ctor("ee15660", this);} // tgen

static void Test_ee15660()
{
  extern Class_Descriptor cd_ee15660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15660, buf);
    ee15660 *dp, &lv = *(dp=new (buf) ee15660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee15660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee15660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(32,16), "ee15660");
    check_base_class_offset(lv, (dd5660*), ABISELECT(16,8), "ee15660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15660.e");
    test_class_info(&lv, &cd_ee15660);
    dp->~ee15660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15660(Test_ee15660, "ee15660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15660C1Ev();
extern void _ZN7ee15660D1Ev();
Name_Map name_map_ee15660[] = {
  NSPAIR(_ZN7ee15660C1Ev),
  NSPAIR(_ZN7ee15660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee15660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15660[];
extern void _ZN6dd56603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee15660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15660[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee15660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee15660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee15660[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee15660[] = {
  {&(_ZTV7ee15660[4]),  4,15},
  {&(_ZTV7ee15660[8]),  8,15},
  {&(_ZTV7ee15660[13]),  13,15},
  {&(_tg__ZTV6dd5660__7ee15660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee15660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15660[];
extern  VTBL_ENTRY _ZTV7ee15660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15660[];
static VTBL_ENTRY alt_thunk_names374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15660 = {  "ee15660", // class name
  bases_ee15660, 4,
  &(vtc_ee15660[0]), // expected_vtbl_contents
  &(vtt_ee15660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15660),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15660),5, //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  ee25660  : dd5660 {
  int e;
  virtual void  foo(); // _ZN7ee256603fooEv
  ~ee25660(); // tgen
  ee25660(); // tgen
};
//SIG(1 ee25660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee25660 ::foo(){vfunc_called(this, "_ZN7ee256603fooEv");}
ee25660 ::~ee25660(){ note_dtor("ee25660", this);} // tgen
ee25660 ::ee25660(){ note_ctor("ee25660", this);} // tgen

static void Test_ee25660()
{
  extern Class_Descriptor cd_ee25660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25660, buf);
    ee25660 *dp, &lv = *(dp=new (buf) ee25660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee25660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee25660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(16,12), "ee25660");
    check_base_class_offset(lv, (dd5660*), 0, "ee25660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25660.e");
    test_class_info(&lv, &cd_ee25660);
    dp->~ee25660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25660(Test_ee25660, "ee25660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25660C1Ev();
extern void _ZN7ee25660D1Ev();
Name_Map name_map_ee25660[] = {
  NSPAIR(_ZN7ee25660C1Ev),
  NSPAIR(_ZN7ee25660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee25660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25660[];
extern void _ZN6dd56603barEv();
extern void _ZN7ee256603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee256603fooEv,_ZTv0_n16_N7ee256603fooEv)();
extern void ABISELECT(_ZThn16_N7ee256603fooEv,_ZThn12_N7ee256603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
  (VTBL_ENTRY)&_ZN7ee256603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee256603fooEv,_ZTv0_n16_N7ee256603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee25660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee25660[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee25660[] = {
  {&(_ZTV7ee25660[3]),  3,11},
  {&(_tg__ZTV6dd5660__7ee25660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee25660[4]),  4,6},
  {&(_ZTV7ee25660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25660[];
extern  VTBL_ENTRY _ZTV7ee25660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25660[];
static VTBL_ENTRY alt_thunk_names375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee256603fooEv,_ZTv0_n16_N7ee256603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee256603fooEv,_ZThn12_N7ee256603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25660 = {  "ee25660", // class name
  bases_ee25660, 4,
  &(vtc_ee25660[0]), // expected_vtbl_contents
  &(vtt_ee25660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25660),4, //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  ee35660  : virtual dd5660 {
  int e;
  virtual void  foo(); // _ZN7ee356603fooEv
  ~ee35660(); // tgen
  ee35660(); // tgen
};
//SIG(1 ee35660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee35660 ::foo(){vfunc_called(this, "_ZN7ee356603fooEv");}
ee35660 ::~ee35660(){ note_dtor("ee35660", this);} // tgen
ee35660 ::ee35660(){ note_ctor("ee35660", this);} // tgen

static void Test_ee35660()
{
  extern Class_Descriptor cd_ee35660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35660, buf);
    ee35660 *dp, &lv = *(dp=new (buf) ee35660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee35660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee35660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(32,16), "ee35660");
    check_base_class_offset(lv, (dd5660*), ABISELECT(16,8), "ee35660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35660.e");
    test_class_info(&lv, &cd_ee35660);
    dp->~ee35660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35660(Test_ee35660, "ee35660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35660C1Ev();
extern void _ZN7ee35660D1Ev();
Name_Map name_map_ee35660[] = {
  NSPAIR(_ZN7ee35660C1Ev),
  NSPAIR(_ZN7ee35660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee35660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35660[];
extern void _ZN7ee356603fooEv();
extern void _ZN6dd56603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee356603fooEv,_ZTv0_n16_N7ee356603fooEv)();
extern void ABISELECT(_ZThn32_N7ee356603fooEv,_ZThn16_N7ee356603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35660[0]),
  (VTBL_ENTRY)&_ZN7ee356603fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee356603fooEv,_ZTv0_n16_N7ee356603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee35660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee35660[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee35660[] = {
  {&(_ZTV7ee35660[4]),  4,16},
  {&(_ZTV7ee35660[9]),  9,16},
  {&(_ZTV7ee35660[14]),  14,16},
  {&(_tg__ZTV6dd5660__7ee35660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee35660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35660[];
extern  VTBL_ENTRY _ZTV7ee35660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35660[];
static VTBL_ENTRY alt_thunk_names376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee356603fooEv,_ZTv0_n16_N7ee356603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee356603fooEv,_ZThn16_N7ee356603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35660 = {  "ee35660", // class name
  bases_ee35660, 4,
  &(vtc_ee35660[0]), // expected_vtbl_contents
  &(vtt_ee35660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35660),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35660),5, //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  ee45660  : dd5660 {
  int e;
  virtual void  bar(); // _ZN7ee456603barEv
  ~ee45660(); // tgen
  ee45660(); // tgen
};
//SIG(1 ee45660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee45660 ::bar(){vfunc_called(this, "_ZN7ee456603barEv");}
ee45660 ::~ee45660(){ note_dtor("ee45660", this);} // tgen
ee45660 ::ee45660(){ note_ctor("ee45660", this);} // tgen

static void Test_ee45660()
{
  extern Class_Descriptor cd_ee45660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45660, buf);
    ee45660 *dp, &lv = *(dp=new (buf) ee45660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee45660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee45660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(16,12), "ee45660");
    check_base_class_offset(lv, (dd5660*), 0, "ee45660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45660.e");
    test_class_info(&lv, &cd_ee45660);
    dp->~ee45660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45660(Test_ee45660, "ee45660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45660C1Ev();
extern void _ZN7ee45660D1Ev();
Name_Map name_map_ee45660[] = {
  NSPAIR(_ZN7ee45660C1Ev),
  NSPAIR(_ZN7ee45660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee45660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45660[];
extern void _ZN7ee456603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee456603barEv,_ZTv0_n12_N7ee456603barEv)();
extern void ABISELECT(_ZThn16_N7ee456603barEv,_ZThn12_N7ee456603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee45660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45660[0]),
  (VTBL_ENTRY)&_ZN7ee456603barEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee456603barEv,_ZTv0_n12_N7ee456603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee45660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee45660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee45660[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee45660[] = {
  {&(_ZTV7ee45660[3]),  3,10},
  {&(_tg__ZTV6dd5660__7ee45660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee45660[4]),  4,6},
  {&(_ZTV7ee45660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45660[];
extern  VTBL_ENTRY _ZTV7ee45660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45660[];
static VTBL_ENTRY alt_thunk_names377[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee456603barEv,_ZTv0_n12_N7ee456603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee456603barEv,_ZThn12_N7ee456603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45660 = {  "ee45660", // class name
  bases_ee45660, 4,
  &(vtc_ee45660[0]), // expected_vtbl_contents
  &(vtt_ee45660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45660),4, //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  ee55660  : virtual dd5660 {
  int e;
  virtual void  bar(); // _ZN7ee556603barEv
  ~ee55660(); // tgen
  ee55660(); // tgen
};
//SIG(1 ee55660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee55660 ::bar(){vfunc_called(this, "_ZN7ee556603barEv");}
ee55660 ::~ee55660(){ note_dtor("ee55660", this);} // tgen
ee55660 ::ee55660(){ note_ctor("ee55660", this);} // tgen

static void Test_ee55660()
{
  extern Class_Descriptor cd_ee55660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55660, buf);
    ee55660 *dp, &lv = *(dp=new (buf) ee55660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee55660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee55660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(32,16), "ee55660");
    check_base_class_offset(lv, (dd5660*), ABISELECT(16,8), "ee55660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55660.e");
    test_class_info(&lv, &cd_ee55660);
    dp->~ee55660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55660(Test_ee55660, "ee55660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55660C1Ev();
extern void _ZN7ee55660D1Ev();
Name_Map name_map_ee55660[] = {
  NSPAIR(_ZN7ee55660C1Ev),
  NSPAIR(_ZN7ee55660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee55660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55660[];
extern void _ZN7ee556603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee556603barEv,_ZTv0_n16_N7ee556603barEv)();
extern void ABISELECT(_ZThn16_N7ee556603barEv,_ZThn8_N7ee556603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee556603barEv,_ZTv0_n12_N7ee556603barEv)();
extern void ABISELECT(_ZThn32_N7ee556603barEv,_ZThn16_N7ee556603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY vtc_ee55660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55660[0]),
  (VTBL_ENTRY)&_ZN7ee556603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee556603barEv,_ZTv0_n16_N7ee556603barEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee556603barEv,_ZTv0_n12_N7ee556603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
extern VTBL_ENTRY _ZTV7ee55660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee55660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee55660[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee55660[] = {
  {&(_ZTV7ee55660[4]),  4,16},
  {&(_ZTV7ee55660[9]),  9,16},
  {&(_ZTV7ee55660[14]),  14,16},
  {&(_tg__ZTV6dd5660__7ee55660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee55660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55660[];
extern  VTBL_ENTRY _ZTV7ee55660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55660[];
static VTBL_ENTRY alt_thunk_names378[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee556603barEv,_ZTv0_n12_N7ee556603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee556603barEv,_ZThn16_N7ee556603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee556603barEv,_ZTv0_n16_N7ee556603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee556603barEv,_ZThn8_N7ee556603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55660 = {  "ee55660", // class name
  bases_ee55660, 4,
  &(vtc_ee55660[0]), // expected_vtbl_contents
  &(vtt_ee55660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55660),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names378,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65660  : dd5660 {
  int e;
  virtual void  foo(); // _ZN7ee656603fooEv
  virtual void  bar(); // _ZN7ee656603barEv
  ~ee65660(); // tgen
  ee65660(); // tgen
};
//SIG(1 ee65660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65660 ::foo(){vfunc_called(this, "_ZN7ee656603fooEv");}
void  ee65660 ::bar(){vfunc_called(this, "_ZN7ee656603barEv");}
ee65660 ::~ee65660(){ note_dtor("ee65660", this);} // tgen
ee65660 ::ee65660(){ note_ctor("ee65660", this);} // tgen

static void Test_ee65660()
{
  extern Class_Descriptor cd_ee65660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65660, buf);
    ee65660 *dp, &lv = *(dp=new (buf) ee65660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee65660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee65660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(16,12), "ee65660");
    check_base_class_offset(lv, (dd5660*), 0, "ee65660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65660.e");
    test_class_info(&lv, &cd_ee65660);
    dp->~ee65660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65660(Test_ee65660, "ee65660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65660C1Ev();
extern void _ZN7ee65660D1Ev();
Name_Map name_map_ee65660[] = {
  NSPAIR(_ZN7ee65660C1Ev),
  NSPAIR(_ZN7ee65660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee65660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65660[];
extern void _ZN7ee656603barEv();
extern void _ZN7ee656603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee656603barEv,_ZTv0_n12_N7ee656603barEv)();
extern void ABISELECT(_ZThn16_N7ee656603barEv,_ZThn12_N7ee656603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee656603fooEv,_ZTv0_n16_N7ee656603fooEv)();
extern void ABISELECT(_ZThn16_N7ee656603fooEv,_ZThn12_N7ee656603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65660[0]),
  (VTBL_ENTRY)&_ZN7ee656603barEv,
  (VTBL_ENTRY)&_ZN7ee656603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee656603barEv,_ZTv0_n12_N7ee656603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee656603fooEv,_ZTv0_n16_N7ee656603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee65660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee65660[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee65660[] = {
  {&(_ZTV7ee65660[3]),  3,11},
  {&(_tg__ZTV6dd5660__7ee65660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee65660[4]),  4,6},
  {&(_ZTV7ee65660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65660[];
extern  VTBL_ENTRY _ZTV7ee65660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65660[];
static VTBL_ENTRY alt_thunk_names379[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn12_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee656603fooEv,_ZTv0_n16_N7ee656603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee656603fooEv,_ZThn12_N7ee656603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee656603barEv,_ZTv0_n12_N7ee656603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee656603barEv,_ZThn12_N7ee656603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65660 = {  "ee65660", // class name
  bases_ee65660, 4,
  &(vtc_ee65660[0]), // expected_vtbl_contents
  &(vtt_ee65660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names379,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75660  : virtual dd5660 {
  int e;
  virtual void  foo(); // _ZN7ee756603fooEv
  virtual void  bar(); // _ZN7ee756603barEv
  ~ee75660(); // tgen
  ee75660(); // tgen
};
//SIG(1 ee75660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75660 ::foo(){vfunc_called(this, "_ZN7ee756603fooEv");}
void  ee75660 ::bar(){vfunc_called(this, "_ZN7ee756603barEv");}
ee75660 ::~ee75660(){ note_dtor("ee75660", this);} // tgen
ee75660 ::ee75660(){ note_ctor("ee75660", this);} // tgen

static void Test_ee75660()
{
  extern Class_Descriptor cd_ee75660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75660, buf);
    ee75660 *dp, &lv = *(dp=new (buf) ee75660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee75660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee75660");
    check_base_class_offset(lv, (cc660*)(dd5660*), ABISELECT(32,16), "ee75660");
    check_base_class_offset(lv, (dd5660*), ABISELECT(16,8), "ee75660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75660.e");
    test_class_info(&lv, &cd_ee75660);
    dp->~ee75660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75660(Test_ee75660, "ee75660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75660C1Ev();
extern void _ZN7ee75660D1Ev();
Name_Map name_map_ee75660[] = {
  NSPAIR(_ZN7ee75660C1Ev),
  NSPAIR(_ZN7ee75660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd5660;
extern VTBL_ENTRY _ZTI6dd5660[];
extern  VTBL_ENTRY _ZTV6dd5660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5660[];
static Base_Class bases_ee75660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75660[];
extern void _ZN7ee756603fooEv();
extern void _ZN7ee756603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee756603barEv,_ZTv0_n16_N7ee756603barEv)();
extern void ABISELECT(_ZThn16_N7ee756603barEv,_ZThn8_N7ee756603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee756603barEv,_ZTv0_n12_N7ee756603barEv)();
extern void ABISELECT(_ZThn32_N7ee756603barEv,_ZThn16_N7ee756603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee756603fooEv,_ZTv0_n16_N7ee756603fooEv)();
extern void ABISELECT(_ZThn32_N7ee756603fooEv,_ZThn16_N7ee756603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75660[0]),
  (VTBL_ENTRY)&_ZN7ee756603fooEv,
  (VTBL_ENTRY)&_ZN7ee756603barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee756603barEv,_ZTv0_n16_N7ee756603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee756603barEv,_ZTv0_n12_N7ee756603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee756603fooEv,_ZTv0_n16_N7ee756603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75660[];
extern void _ZN6dd56603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5660__7ee75660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&_ZN6dd56603barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv)();
extern void ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv)() __attribute__((weak));
extern void _ZN5cc6603fooEv();
static  VTBL_ENTRY _tg__ZTV5cc660__6dd5660__7ee75660[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv),
  (VTBL_ENTRY)&_ZN5cc6603fooEv,
};
static  VTT_ENTRY vtt_ee75660[] = {
  {&(_ZTV7ee75660[4]),  4,17},
  {&(_ZTV7ee75660[10]),  10,17},
  {&(_ZTV7ee75660[15]),  15,17},
  {&(_tg__ZTV6dd5660__7ee75660[3]),  3,4},
  {&(_tg__ZTV5cc660__6dd5660__7ee75660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75660[];
extern  VTBL_ENTRY _ZTV7ee75660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75660[];
static VTBL_ENTRY alt_thunk_names380[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd56603barEv,_ZTv0_n12_N6dd56603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56603barEv,_ZThn8_N6dd56603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee756603fooEv,_ZTv0_n16_N7ee756603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee756603fooEv,_ZThn16_N7ee756603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee756603barEv,_ZTv0_n12_N7ee756603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee756603barEv,_ZThn16_N7ee756603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee756603barEv,_ZTv0_n16_N7ee756603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee756603barEv,_ZThn8_N7ee756603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75660 = {  "ee75660", // class name
  bases_ee75660, 4,
  &(vtc_ee75660[0]), // expected_vtbl_contents
  &(vtt_ee75660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75660),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names380,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6660  : cc660 {
  int d;
  virtual void  bar(); // _ZN6dd66603barEv
  virtual void  foo(); // _ZN6dd66603fooEv
  ~dd6660(); // tgen
  dd6660(); // tgen
};
//SIG(-1 dd6660) C1{ BC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd6660 ::bar(){vfunc_called(this, "_ZN6dd66603barEv");}
void  dd6660 ::foo(){vfunc_called(this, "_ZN6dd66603fooEv");}
dd6660 ::~dd6660(){ note_dtor("dd6660", this);} // tgen
dd6660 ::dd6660(){ note_ctor("dd6660", this);} // tgen

static void Test_dd6660()
{
  extern Class_Descriptor cd_dd6660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6660, buf);
    dd6660 *dp, &lv = *(dp=new (buf) dd6660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(8,4), "dd6660");
    check_base_class_offset(lv, (bb60*)(cc660*), 0, "dd6660");
    check_base_class_offset(lv, (cc660*), 0, "dd6660");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6660.d");
    test_class_info(&lv, &cd_dd6660);
    dp->~dd6660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6660(Test_dd6660, "dd6660", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6660C1Ev();
extern void _ZN6dd6660D1Ev();
Name_Map name_map_dd6660[] = {
  NSPAIR(_ZN6dd6660C1Ev),
  NSPAIR(_ZN6dd6660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd6660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI6dd6660[];
extern void _ZN6dd66603barEv();
extern void _ZN6dd66603fooEv();
static  VTBL_ENTRY vtc_dd6660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6660[0]),
  (VTBL_ENTRY)&_ZN6dd66603barEv,
  (VTBL_ENTRY)&_ZN6dd66603fooEv,
};
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
Class_Descriptor cd_dd6660 = {  "dd6660", // class name
  bases_dd6660, 3,
  &(vtc_dd6660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6660),4, //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  ee06660  : dd6660 {
  int e;
  ~ee06660(); // tgen
  ee06660(); // tgen
};
//SIG(1 ee06660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee06660 ::~ee06660(){ note_dtor("ee06660", this);} // tgen
ee06660 ::ee06660(){ note_ctor("ee06660", this);} // tgen

static void Test_ee06660()
{
  extern Class_Descriptor cd_ee06660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06660, buf);
    ee06660 *dp, &lv = *(dp=new (buf) ee06660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(8,4), "ee06660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), 0, "ee06660");
    check_base_class_offset(lv, (cc660*)(dd6660*), 0, "ee06660");
    check_base_class_offset(lv, (dd6660*), 0, "ee06660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06660.e");
    test_class_info(&lv, &cd_ee06660);
    dp->~ee06660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06660(Test_ee06660, "ee06660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06660C1Ev();
extern void _ZN7ee06660D1Ev();
Name_Map name_map_ee06660[] = {
  NSPAIR(_ZN7ee06660C1Ev),
  NSPAIR(_ZN7ee06660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee06660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06660[];
extern void _ZN6dd66603barEv();
extern void _ZN6dd66603fooEv();
static  VTBL_ENTRY vtc_ee06660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06660[0]),
  (VTBL_ENTRY)&_ZN6dd66603barEv,
  (VTBL_ENTRY)&_ZN6dd66603fooEv,
};
extern VTBL_ENTRY _ZTI7ee06660[];
extern  VTBL_ENTRY _ZTV7ee06660[];
Class_Descriptor cd_ee06660 = {  "ee06660", // class name
  bases_ee06660, 4,
  &(vtc_ee06660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06660),4, //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  ee16660  : virtual dd6660 {
  int e;
  ~ee16660(); // tgen
  ee16660(); // tgen
};
//SIG(1 ee16660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee16660 ::~ee16660(){ note_dtor("ee16660", this);} // tgen
ee16660 ::ee16660(){ note_ctor("ee16660", this);} // tgen

static void Test_ee16660()
{
  extern Class_Descriptor cd_ee16660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16660, buf);
    ee16660 *dp, &lv = *(dp=new (buf) ee16660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(24,12), "ee16660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), ABISELECT(16,8), "ee16660");
    check_base_class_offset(lv, (cc660*)(dd6660*), ABISELECT(16,8), "ee16660");
    check_base_class_offset(lv, (dd6660*), ABISELECT(16,8), "ee16660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16660.e");
    test_class_info(&lv, &cd_ee16660);
    dp->~ee16660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16660(Test_ee16660, "ee16660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16660C1Ev();
extern void _ZN7ee16660D1Ev();
Name_Map name_map_ee16660[] = {
  NSPAIR(_ZN7ee16660C1Ev),
  NSPAIR(_ZN7ee16660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee16660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16660[];
extern void _ZN6dd66603barEv();
extern void _ZN6dd66603fooEv();
static  VTBL_ENTRY vtc_ee16660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16660[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16660[0]),
  (VTBL_ENTRY)&_ZN6dd66603barEv,
  (VTBL_ENTRY)&_ZN6dd66603fooEv,
};
extern VTBL_ENTRY _ZTV7ee16660[];
static  VTT_ENTRY vtt_ee16660[] = {
  {&(_ZTV7ee16660[3]),  3,9},
  {&(_ZTV7ee16660[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16660[];
extern  VTBL_ENTRY _ZTV7ee16660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16660[];
Class_Descriptor cd_ee16660 = {  "ee16660", // class name
  bases_ee16660, 4,
  &(vtc_ee16660[0]), // expected_vtbl_contents
  &(vtt_ee16660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16660),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16660),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  ee26660  : dd6660 {
  int e;
  virtual void  foo(); // _ZN7ee266603fooEv
  ~ee26660(); // tgen
  ee26660(); // tgen
};
//SIG(1 ee26660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26660 ::foo(){vfunc_called(this, "_ZN7ee266603fooEv");}
ee26660 ::~ee26660(){ note_dtor("ee26660", this);} // tgen
ee26660 ::ee26660(){ note_ctor("ee26660", this);} // tgen

static void Test_ee26660()
{
  extern Class_Descriptor cd_ee26660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26660, buf);
    ee26660 *dp, &lv = *(dp=new (buf) ee26660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(8,4), "ee26660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), 0, "ee26660");
    check_base_class_offset(lv, (cc660*)(dd6660*), 0, "ee26660");
    check_base_class_offset(lv, (dd6660*), 0, "ee26660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26660.e");
    test_class_info(&lv, &cd_ee26660);
    dp->~ee26660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26660(Test_ee26660, "ee26660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26660C1Ev();
extern void _ZN7ee26660D1Ev();
Name_Map name_map_ee26660[] = {
  NSPAIR(_ZN7ee26660C1Ev),
  NSPAIR(_ZN7ee26660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee26660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee26660[];
extern void _ZN6dd66603barEv();
extern void _ZN7ee266603fooEv();
static  VTBL_ENTRY vtc_ee26660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26660[0]),
  (VTBL_ENTRY)&_ZN6dd66603barEv,
  (VTBL_ENTRY)&_ZN7ee266603fooEv,
};
extern VTBL_ENTRY _ZTI7ee26660[];
extern  VTBL_ENTRY _ZTV7ee26660[];
Class_Descriptor cd_ee26660 = {  "ee26660", // class name
  bases_ee26660, 4,
  &(vtc_ee26660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26660),4, //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  ee36660  : virtual dd6660 {
  int e;
  virtual void  foo(); // _ZN7ee366603fooEv
  ~ee36660(); // tgen
  ee36660(); // tgen
};
//SIG(1 ee36660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36660 ::foo(){vfunc_called(this, "_ZN7ee366603fooEv");}
ee36660 ::~ee36660(){ note_dtor("ee36660", this);} // tgen
ee36660 ::ee36660(){ note_ctor("ee36660", this);} // tgen

static void Test_ee36660()
{
  extern Class_Descriptor cd_ee36660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36660, buf);
    ee36660 *dp, &lv = *(dp=new (buf) ee36660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(24,12), "ee36660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), ABISELECT(16,8), "ee36660");
    check_base_class_offset(lv, (cc660*)(dd6660*), ABISELECT(16,8), "ee36660");
    check_base_class_offset(lv, (dd6660*), ABISELECT(16,8), "ee36660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36660.e");
    test_class_info(&lv, &cd_ee36660);
    dp->~ee36660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36660(Test_ee36660, "ee36660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36660C1Ev();
extern void _ZN7ee36660D1Ev();
Name_Map name_map_ee36660[] = {
  NSPAIR(_ZN7ee36660C1Ev),
  NSPAIR(_ZN7ee36660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee36660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36660[];
extern void _ZN7ee366603fooEv();
extern void _ZN6dd66603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee366603fooEv,_ZTv0_n16_N7ee366603fooEv)();
extern void ABISELECT(_ZThn16_N7ee366603fooEv,_ZThn8_N7ee366603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36660[0]),
  (VTBL_ENTRY)&_ZN7ee366603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36660[0]),
  (VTBL_ENTRY)&_ZN6dd66603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee366603fooEv,_ZTv0_n16_N7ee366603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36660[];
static  VTT_ENTRY vtt_ee36660[] = {
  {&(_ZTV7ee36660[3]),  3,10},
  {&(_ZTV7ee36660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36660[];
extern  VTBL_ENTRY _ZTV7ee36660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36660[];
static VTBL_ENTRY alt_thunk_names381[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee366603fooEv,_ZTv0_n16_N7ee366603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee366603fooEv,_ZThn8_N7ee366603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36660 = {  "ee36660", // class name
  bases_ee36660, 4,
  &(vtc_ee36660[0]), // expected_vtbl_contents
  &(vtt_ee36660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36660),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names381,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46660  : dd6660 {
  int e;
  virtual void  bar(); // _ZN7ee466603barEv
  ~ee46660(); // tgen
  ee46660(); // tgen
};
//SIG(1 ee46660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46660 ::bar(){vfunc_called(this, "_ZN7ee466603barEv");}
ee46660 ::~ee46660(){ note_dtor("ee46660", this);} // tgen
ee46660 ::ee46660(){ note_ctor("ee46660", this);} // tgen

static void Test_ee46660()
{
  extern Class_Descriptor cd_ee46660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46660, buf);
    ee46660 *dp, &lv = *(dp=new (buf) ee46660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(8,4), "ee46660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), 0, "ee46660");
    check_base_class_offset(lv, (cc660*)(dd6660*), 0, "ee46660");
    check_base_class_offset(lv, (dd6660*), 0, "ee46660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46660.e");
    test_class_info(&lv, &cd_ee46660);
    dp->~ee46660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46660(Test_ee46660, "ee46660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46660C1Ev();
extern void _ZN7ee46660D1Ev();
Name_Map name_map_ee46660[] = {
  NSPAIR(_ZN7ee46660C1Ev),
  NSPAIR(_ZN7ee46660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee46660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee46660[];
extern void _ZN7ee466603barEv();
extern void _ZN6dd66603fooEv();
static  VTBL_ENTRY vtc_ee46660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46660[0]),
  (VTBL_ENTRY)&_ZN7ee466603barEv,
  (VTBL_ENTRY)&_ZN6dd66603fooEv,
};
extern VTBL_ENTRY _ZTI7ee46660[];
extern  VTBL_ENTRY _ZTV7ee46660[];
Class_Descriptor cd_ee46660 = {  "ee46660", // class name
  bases_ee46660, 4,
  &(vtc_ee46660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46660),4, //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  ee56660  : virtual dd6660 {
  int e;
  virtual void  bar(); // _ZN7ee566603barEv
  ~ee56660(); // tgen
  ee56660(); // tgen
};
//SIG(1 ee56660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56660 ::bar(){vfunc_called(this, "_ZN7ee566603barEv");}
ee56660 ::~ee56660(){ note_dtor("ee56660", this);} // tgen
ee56660 ::ee56660(){ note_ctor("ee56660", this);} // tgen

static void Test_ee56660()
{
  extern Class_Descriptor cd_ee56660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56660, buf);
    ee56660 *dp, &lv = *(dp=new (buf) ee56660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(24,12), "ee56660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), ABISELECT(16,8), "ee56660");
    check_base_class_offset(lv, (cc660*)(dd6660*), ABISELECT(16,8), "ee56660");
    check_base_class_offset(lv, (dd6660*), ABISELECT(16,8), "ee56660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56660.e");
    test_class_info(&lv, &cd_ee56660);
    dp->~ee56660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56660(Test_ee56660, "ee56660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56660C1Ev();
extern void _ZN7ee56660D1Ev();
Name_Map name_map_ee56660[] = {
  NSPAIR(_ZN7ee56660C1Ev),
  NSPAIR(_ZN7ee56660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee56660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56660[];
extern void _ZN7ee566603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee566603barEv,_ZTv0_n12_N7ee566603barEv)();
extern void ABISELECT(_ZThn16_N7ee566603barEv,_ZThn8_N7ee566603barEv)() __attribute__((weak));
extern void _ZN6dd66603fooEv();
static  VTBL_ENTRY vtc_ee56660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56660[0]),
  (VTBL_ENTRY)&_ZN7ee566603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee566603barEv,_ZTv0_n12_N7ee566603barEv),
  (VTBL_ENTRY)&_ZN6dd66603fooEv,
};
extern VTBL_ENTRY _ZTV7ee56660[];
static  VTT_ENTRY vtt_ee56660[] = {
  {&(_ZTV7ee56660[3]),  3,10},
  {&(_ZTV7ee56660[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56660[];
extern  VTBL_ENTRY _ZTV7ee56660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56660[];
static VTBL_ENTRY alt_thunk_names382[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee566603barEv,_ZTv0_n12_N7ee566603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee566603barEv,_ZThn8_N7ee566603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56660 = {  "ee56660", // class name
  bases_ee56660, 4,
  &(vtc_ee56660[0]), // expected_vtbl_contents
  &(vtt_ee56660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56660),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56660),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names382,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66660  : dd6660 {
  int e;
  virtual void  foo(); // _ZN7ee666603fooEv
  virtual void  bar(); // _ZN7ee666603barEv
  ~ee66660(); // tgen
  ee66660(); // tgen
};
//SIG(1 ee66660) C1{ BC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66660 ::foo(){vfunc_called(this, "_ZN7ee666603fooEv");}
void  ee66660 ::bar(){vfunc_called(this, "_ZN7ee666603barEv");}
ee66660 ::~ee66660(){ note_dtor("ee66660", this);} // tgen
ee66660 ::ee66660(){ note_ctor("ee66660", this);} // tgen

static void Test_ee66660()
{
  extern Class_Descriptor cd_ee66660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66660, buf);
    ee66660 *dp, &lv = *(dp=new (buf) ee66660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(8,4), "ee66660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), 0, "ee66660");
    check_base_class_offset(lv, (cc660*)(dd6660*), 0, "ee66660");
    check_base_class_offset(lv, (dd6660*), 0, "ee66660");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66660.e");
    test_class_info(&lv, &cd_ee66660);
    dp->~ee66660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66660(Test_ee66660, "ee66660", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66660C1Ev();
extern void _ZN7ee66660D1Ev();
Name_Map name_map_ee66660[] = {
  NSPAIR(_ZN7ee66660C1Ev),
  NSPAIR(_ZN7ee66660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee66660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI7ee66660[];
extern void _ZN7ee666603barEv();
extern void _ZN7ee666603fooEv();
static  VTBL_ENTRY vtc_ee66660[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66660[0]),
  (VTBL_ENTRY)&_ZN7ee666603barEv,
  (VTBL_ENTRY)&_ZN7ee666603fooEv,
};
extern VTBL_ENTRY _ZTI7ee66660[];
extern  VTBL_ENTRY _ZTV7ee66660[];
Class_Descriptor cd_ee66660 = {  "ee66660", // class name
  bases_ee66660, 4,
  &(vtc_ee66660[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66660),4, //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  ee76660  : virtual dd6660 {
  int e;
  virtual void  foo(); // _ZN7ee766603fooEv
  virtual void  bar(); // _ZN7ee766603barEv
  ~ee76660(); // tgen
  ee76660(); // tgen
};
//SIG(1 ee76660) C1{ VBC2{ BC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76660 ::foo(){vfunc_called(this, "_ZN7ee766603fooEv");}
void  ee76660 ::bar(){vfunc_called(this, "_ZN7ee766603barEv");}
ee76660 ::~ee76660(){ note_dtor("ee76660", this);} // tgen
ee76660 ::ee76660(){ note_ctor("ee76660", this);} // tgen

static void Test_ee76660()
{
  extern Class_Descriptor cd_ee76660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76660, buf);
    ee76660 *dp, &lv = *(dp=new (buf) ee76660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*)(dd6660*), ABISELECT(24,12), "ee76660");
    check_base_class_offset(lv, (bb60*)(cc660*)(dd6660*), ABISELECT(16,8), "ee76660");
    check_base_class_offset(lv, (cc660*)(dd6660*), ABISELECT(16,8), "ee76660");
    check_base_class_offset(lv, (dd6660*), ABISELECT(16,8), "ee76660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76660.e");
    test_class_info(&lv, &cd_ee76660);
    dp->~ee76660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76660(Test_ee76660, "ee76660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76660C1Ev();
extern void _ZN7ee76660D1Ev();
Name_Map name_map_ee76660[] = {
  NSPAIR(_ZN7ee76660C1Ev),
  NSPAIR(_ZN7ee76660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd6660;
extern VTBL_ENTRY _ZTI6dd6660[];
extern  VTBL_ENTRY _ZTV6dd6660[];
static Base_Class bases_ee76660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6660,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76660[];
extern void _ZN7ee766603fooEv();
extern void _ZN7ee766603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee766603barEv,_ZTv0_n12_N7ee766603barEv)();
extern void ABISELECT(_ZThn16_N7ee766603barEv,_ZThn8_N7ee766603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee766603fooEv,_ZTv0_n16_N7ee766603fooEv)();
extern void ABISELECT(_ZThn16_N7ee766603fooEv,_ZThn8_N7ee766603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76660[0]),
  (VTBL_ENTRY)&_ZN7ee766603fooEv,
  (VTBL_ENTRY)&_ZN7ee766603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee766603barEv,_ZTv0_n12_N7ee766603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee766603fooEv,_ZTv0_n16_N7ee766603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76660[];
static  VTT_ENTRY vtt_ee76660[] = {
  {&(_ZTV7ee76660[3]),  3,11},
  {&(_ZTV7ee76660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76660[];
extern  VTBL_ENTRY _ZTV7ee76660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76660[];
static VTBL_ENTRY alt_thunk_names383[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee766603fooEv,_ZTv0_n16_N7ee766603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee766603fooEv,_ZThn8_N7ee766603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee766603barEv,_ZTv0_n12_N7ee766603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee766603barEv,_ZThn8_N7ee766603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76660 = {  "ee76660", // class name
  bases_ee76660, 4,
  &(vtc_ee76660[0]), // expected_vtbl_contents
  &(vtt_ee76660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76660),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names383,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7660  : virtual cc660 {
  int d;
  virtual void  bar(); // _ZN6dd76603barEv
  virtual void  foo(); // _ZN6dd76603fooEv
  ~dd7660(); // tgen
  dd7660(); // tgen
};
//SIG(-1 dd7660) C1{ VBC2{ BC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd7660 ::bar(){vfunc_called(this, "_ZN6dd76603barEv");}
void  dd7660 ::foo(){vfunc_called(this, "_ZN6dd76603fooEv");}
dd7660 ::~dd7660(){ note_dtor("dd7660", this);} // tgen
dd7660 ::dd7660(){ note_ctor("dd7660", this);} // tgen

static void Test_dd7660()
{
  extern Class_Descriptor cd_dd7660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7660, buf);
    dd7660 *dp, &lv = *(dp=new (buf) dd7660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,12), "dd7660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,8), "dd7660");
    check_base_class_offset(lv, (cc660*), ABISELECT(16,8), "dd7660");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7660.d");
    test_class_info(&lv, &cd_dd7660);
    dp->~dd7660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7660(Test_dd7660, "dd7660", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7660C1Ev();
extern void _ZN6dd7660D1Ev();
Name_Map name_map_dd7660[] = {
  NSPAIR(_ZN6dd7660C1Ev),
  NSPAIR(_ZN6dd7660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
static Base_Class bases_dd7660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7660[];
static  VTT_ENTRY vtt_dd7660[] = {
  {&(_ZTV6dd7660[3]),  3,11},
  {&(_ZTV6dd7660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static VTBL_ENTRY alt_thunk_names384[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7660 = {  "dd7660", // class name
  bases_dd7660, 3,
  &(vtc_dd7660[0]), // expected_vtbl_contents
  &(vtt_dd7660[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7660),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names384,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07660  : dd7660 {
  int e;
  ~ee07660(); // tgen
  ee07660(); // tgen
};
//SIG(1 ee07660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee07660 ::~ee07660(){ note_dtor("ee07660", this);} // tgen
ee07660 ::ee07660(){ note_ctor("ee07660", this);} // tgen

static void Test_ee07660()
{
  extern Class_Descriptor cd_ee07660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07660, buf);
    ee07660 *dp, &lv = *(dp=new (buf) ee07660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee07660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee07660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(16,12), "ee07660");
    check_base_class_offset(lv, (dd7660*), 0, "ee07660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07660.e");
    test_class_info(&lv, &cd_ee07660);
    dp->~ee07660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07660(Test_ee07660, "ee07660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07660C1Ev();
extern void _ZN7ee07660D1Ev();
Name_Map name_map_ee07660[] = {
  NSPAIR(_ZN7ee07660C1Ev),
  NSPAIR(_ZN7ee07660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee07660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee07660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee07660[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee07660[] = {
  {&(_ZTV7ee07660[3]),  3,11},
  {&(_tg__ZTV6dd7660__7ee07660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee07660[4]),  4,6},
  {&(_ZTV7ee07660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07660[];
extern  VTBL_ENTRY _ZTV7ee07660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07660[];
static VTBL_ENTRY alt_thunk_names385[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07660 = {  "ee07660", // class name
  bases_ee07660, 4,
  &(vtc_ee07660[0]), // expected_vtbl_contents
  &(vtt_ee07660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names385,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17660  : virtual dd7660 {
  int e;
  ~ee17660(); // tgen
  ee17660(); // tgen
};
//SIG(1 ee17660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee17660 ::~ee17660(){ note_dtor("ee17660", this);} // tgen
ee17660 ::ee17660(){ note_ctor("ee17660", this);} // tgen

static void Test_ee17660()
{
  extern Class_Descriptor cd_ee17660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17660, buf);
    ee17660 *dp, &lv = *(dp=new (buf) ee17660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee17660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee17660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(32,16), "ee17660");
    check_base_class_offset(lv, (dd7660*), ABISELECT(16,8), "ee17660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17660.e");
    test_class_info(&lv, &cd_ee17660);
    dp->~ee17660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17660(Test_ee17660, "ee17660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17660C1Ev();
extern void _ZN7ee17660D1Ev();
Name_Map name_map_ee17660[] = {
  NSPAIR(_ZN7ee17660C1Ev),
  NSPAIR(_ZN7ee17660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee17660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17660[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee17660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee17660[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee17660[] = {
  {&(_ZTV7ee17660[4]),  4,17},
  {&(_ZTV7ee17660[9]),  9,17},
  {&(_ZTV7ee17660[15]),  15,17},
  {&(_tg__ZTV6dd7660__7ee17660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee17660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17660[];
extern  VTBL_ENTRY _ZTV7ee17660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17660[];
static VTBL_ENTRY alt_thunk_names386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17660 = {  "ee17660", // class name
  bases_ee17660, 4,
  &(vtc_ee17660[0]), // expected_vtbl_contents
  &(vtt_ee17660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17660),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names386,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27660  : dd7660 {
  int e;
  virtual void  foo(); // _ZN7ee276603fooEv
  ~ee27660(); // tgen
  ee27660(); // tgen
};
//SIG(1 ee27660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27660 ::foo(){vfunc_called(this, "_ZN7ee276603fooEv");}
ee27660 ::~ee27660(){ note_dtor("ee27660", this);} // tgen
ee27660 ::ee27660(){ note_ctor("ee27660", this);} // tgen

static void Test_ee27660()
{
  extern Class_Descriptor cd_ee27660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27660, buf);
    ee27660 *dp, &lv = *(dp=new (buf) ee27660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee27660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee27660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(16,12), "ee27660");
    check_base_class_offset(lv, (dd7660*), 0, "ee27660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27660.e");
    test_class_info(&lv, &cd_ee27660);
    dp->~ee27660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27660(Test_ee27660, "ee27660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27660C1Ev();
extern void _ZN7ee27660D1Ev();
Name_Map name_map_ee27660[] = {
  NSPAIR(_ZN7ee27660C1Ev),
  NSPAIR(_ZN7ee27660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee27660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27660[];
extern void _ZN6dd76603barEv();
extern void _ZN7ee276603fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee276603fooEv,_ZTv0_n16_N7ee276603fooEv)();
extern void ABISELECT(_ZThn16_N7ee276603fooEv,_ZThn12_N7ee276603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN7ee276603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee276603fooEv,_ZTv0_n16_N7ee276603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee27660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee27660[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee27660[] = {
  {&(_ZTV7ee27660[3]),  3,11},
  {&(_tg__ZTV6dd7660__7ee27660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee27660[4]),  4,6},
  {&(_ZTV7ee27660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27660[];
extern  VTBL_ENTRY _ZTV7ee27660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27660[];
static VTBL_ENTRY alt_thunk_names387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee276603fooEv,_ZTv0_n16_N7ee276603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee276603fooEv,_ZThn12_N7ee276603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27660 = {  "ee27660", // class name
  bases_ee27660, 4,
  &(vtc_ee27660[0]), // expected_vtbl_contents
  &(vtt_ee27660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names387,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37660  : virtual dd7660 {
  int e;
  virtual void  foo(); // _ZN7ee376603fooEv
  ~ee37660(); // tgen
  ee37660(); // tgen
};
//SIG(1 ee37660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37660 ::foo(){vfunc_called(this, "_ZN7ee376603fooEv");}
ee37660 ::~ee37660(){ note_dtor("ee37660", this);} // tgen
ee37660 ::ee37660(){ note_ctor("ee37660", this);} // tgen

static void Test_ee37660()
{
  extern Class_Descriptor cd_ee37660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37660, buf);
    ee37660 *dp, &lv = *(dp=new (buf) ee37660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee37660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee37660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(32,16), "ee37660");
    check_base_class_offset(lv, (dd7660*), ABISELECT(16,8), "ee37660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37660.e");
    test_class_info(&lv, &cd_ee37660);
    dp->~ee37660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37660(Test_ee37660, "ee37660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37660C1Ev();
extern void _ZN7ee37660D1Ev();
Name_Map name_map_ee37660[] = {
  NSPAIR(_ZN7ee37660C1Ev),
  NSPAIR(_ZN7ee37660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee37660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37660[];
extern void _ZN7ee376603fooEv();
extern void _ZN6dd76603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee376603fooEv,_ZTv0_n20_N7ee376603fooEv)();
extern void ABISELECT(_ZThn16_N7ee376603fooEv,_ZThn8_N7ee376603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee376603fooEv,_ZTv0_n16_N7ee376603fooEv)();
extern void ABISELECT(_ZThn32_N7ee376603fooEv,_ZThn16_N7ee376603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37660[0]),
  (VTBL_ENTRY)&_ZN7ee376603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee376603fooEv,_ZTv0_n20_N7ee376603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee376603fooEv,_ZTv0_n16_N7ee376603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee37660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee37660[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee37660[] = {
  {&(_ZTV7ee37660[4]),  4,18},
  {&(_ZTV7ee37660[10]),  10,18},
  {&(_ZTV7ee37660[16]),  16,18},
  {&(_tg__ZTV6dd7660__7ee37660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee37660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37660[];
extern  VTBL_ENTRY _ZTV7ee37660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37660[];
static VTBL_ENTRY alt_thunk_names388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee376603fooEv,_ZTv0_n16_N7ee376603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee376603fooEv,_ZThn16_N7ee376603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee376603fooEv,_ZTv0_n20_N7ee376603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee376603fooEv,_ZThn8_N7ee376603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37660 = {  "ee37660", // class name
  bases_ee37660, 4,
  &(vtc_ee37660[0]), // expected_vtbl_contents
  &(vtt_ee37660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37660),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names388,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47660  : dd7660 {
  int e;
  virtual void  bar(); // _ZN7ee476603barEv
  ~ee47660(); // tgen
  ee47660(); // tgen
};
//SIG(1 ee47660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47660 ::bar(){vfunc_called(this, "_ZN7ee476603barEv");}
ee47660 ::~ee47660(){ note_dtor("ee47660", this);} // tgen
ee47660 ::ee47660(){ note_ctor("ee47660", this);} // tgen

static void Test_ee47660()
{
  extern Class_Descriptor cd_ee47660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47660, buf);
    ee47660 *dp, &lv = *(dp=new (buf) ee47660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee47660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee47660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(16,12), "ee47660");
    check_base_class_offset(lv, (dd7660*), 0, "ee47660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47660.e");
    test_class_info(&lv, &cd_ee47660);
    dp->~ee47660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47660(Test_ee47660, "ee47660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47660C1Ev();
extern void _ZN7ee47660D1Ev();
Name_Map name_map_ee47660[] = {
  NSPAIR(_ZN7ee47660C1Ev),
  NSPAIR(_ZN7ee47660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee47660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47660[];
extern void _ZN7ee476603barEv();
extern void _ZN6dd76603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee476603barEv,_ZTv0_n12_N7ee476603barEv)();
extern void ABISELECT(_ZThn16_N7ee476603barEv,_ZThn12_N7ee476603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47660[0]),
  (VTBL_ENTRY)&_ZN7ee476603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee476603barEv,_ZTv0_n12_N7ee476603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee47660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee47660[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee47660[] = {
  {&(_ZTV7ee47660[3]),  3,11},
  {&(_tg__ZTV6dd7660__7ee47660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee47660[4]),  4,6},
  {&(_ZTV7ee47660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47660[];
extern  VTBL_ENTRY _ZTV7ee47660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47660[];
static VTBL_ENTRY alt_thunk_names389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee476603barEv,_ZTv0_n12_N7ee476603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee476603barEv,_ZThn12_N7ee476603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47660 = {  "ee47660", // class name
  bases_ee47660, 4,
  &(vtc_ee47660[0]), // expected_vtbl_contents
  &(vtt_ee47660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47660),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names389,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57660  : virtual dd7660 {
  int e;
  virtual void  bar(); // _ZN7ee576603barEv
  ~ee57660(); // tgen
  ee57660(); // tgen
};
//SIG(1 ee57660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57660 ::bar(){vfunc_called(this, "_ZN7ee576603barEv");}
ee57660 ::~ee57660(){ note_dtor("ee57660", this);} // tgen
ee57660 ::ee57660(){ note_ctor("ee57660", this);} // tgen

static void Test_ee57660()
{
  extern Class_Descriptor cd_ee57660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57660, buf);
    ee57660 *dp, &lv = *(dp=new (buf) ee57660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee57660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee57660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(32,16), "ee57660");
    check_base_class_offset(lv, (dd7660*), ABISELECT(16,8), "ee57660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57660.e");
    test_class_info(&lv, &cd_ee57660);
    dp->~ee57660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57660(Test_ee57660, "ee57660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57660C1Ev();
extern void _ZN7ee57660D1Ev();
Name_Map name_map_ee57660[] = {
  NSPAIR(_ZN7ee57660C1Ev),
  NSPAIR(_ZN7ee57660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee57660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57660[];
extern void _ZN7ee576603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee576603barEv,_ZTv0_n16_N7ee576603barEv)();
extern void ABISELECT(_ZThn16_N7ee576603barEv,_ZThn8_N7ee576603barEv)() __attribute__((weak));
extern void _ZN6dd76603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee576603barEv,_ZTv0_n12_N7ee576603barEv)();
extern void ABISELECT(_ZThn32_N7ee576603barEv,_ZThn16_N7ee576603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57660[0]),
  (VTBL_ENTRY)&_ZN7ee576603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee576603barEv,_ZTv0_n16_N7ee576603barEv),
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee576603barEv,_ZTv0_n12_N7ee576603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee57660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee57660[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee57660[] = {
  {&(_ZTV7ee57660[4]),  4,18},
  {&(_ZTV7ee57660[10]),  10,18},
  {&(_ZTV7ee57660[16]),  16,18},
  {&(_tg__ZTV6dd7660__7ee57660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee57660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57660[];
extern  VTBL_ENTRY _ZTV7ee57660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57660[];
static VTBL_ENTRY alt_thunk_names390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee576603barEv,_ZTv0_n12_N7ee576603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee576603barEv,_ZThn16_N7ee576603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee576603barEv,_ZTv0_n16_N7ee576603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee576603barEv,_ZThn8_N7ee576603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57660 = {  "ee57660", // class name
  bases_ee57660, 4,
  &(vtc_ee57660[0]), // expected_vtbl_contents
  &(vtt_ee57660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57660),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57660),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names390,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67660  : dd7660 {
  int e;
  virtual void  foo(); // _ZN7ee676603fooEv
  virtual void  bar(); // _ZN7ee676603barEv
  ~ee67660(); // tgen
  ee67660(); // tgen
};
//SIG(1 ee67660) C1{ BC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67660 ::foo(){vfunc_called(this, "_ZN7ee676603fooEv");}
void  ee67660 ::bar(){vfunc_called(this, "_ZN7ee676603barEv");}
ee67660 ::~ee67660(){ note_dtor("ee67660", this);} // tgen
ee67660 ::ee67660(){ note_ctor("ee67660", this);} // tgen

static void Test_ee67660()
{
  extern Class_Descriptor cd_ee67660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67660, buf);
    ee67660 *dp, &lv = *(dp=new (buf) ee67660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(24,16), "ee67660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(16,12), "ee67660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(16,12), "ee67660");
    check_base_class_offset(lv, (dd7660*), 0, "ee67660");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67660.e");
    test_class_info(&lv, &cd_ee67660);
    dp->~ee67660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67660(Test_ee67660, "ee67660", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67660C1Ev();
extern void _ZN7ee67660D1Ev();
Name_Map name_map_ee67660[] = {
  NSPAIR(_ZN7ee67660C1Ev),
  NSPAIR(_ZN7ee67660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee67660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc660,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67660[];
extern void _ZN7ee676603barEv();
extern void _ZN7ee676603fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee676603barEv,_ZTv0_n12_N7ee676603barEv)();
extern void ABISELECT(_ZThn16_N7ee676603barEv,_ZThn12_N7ee676603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee676603fooEv,_ZTv0_n16_N7ee676603fooEv)();
extern void ABISELECT(_ZThn16_N7ee676603fooEv,_ZThn12_N7ee676603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67660[0]),
  (VTBL_ENTRY)&_ZN7ee676603barEv,
  (VTBL_ENTRY)&_ZN7ee676603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee676603barEv,_ZTv0_n12_N7ee676603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee676603fooEv,_ZTv0_n16_N7ee676603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee67660[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee67660[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee67660[] = {
  {&(_ZTV7ee67660[3]),  3,11},
  {&(_tg__ZTV6dd7660__7ee67660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee67660[4]),  4,6},
  {&(_ZTV7ee67660[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67660[];
extern  VTBL_ENTRY _ZTV7ee67660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67660[];
static VTBL_ENTRY alt_thunk_names391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn12_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn12_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee676603fooEv,_ZTv0_n16_N7ee676603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee676603fooEv,_ZThn12_N7ee676603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee676603barEv,_ZTv0_n12_N7ee676603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee676603barEv,_ZThn12_N7ee676603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67660 = {  "ee67660", // class name
  bases_ee67660, 4,
  &(vtc_ee67660[0]), // expected_vtbl_contents
  &(vtt_ee67660[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67660),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67660),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67660),4, //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  ee77660  : virtual dd7660 {
  int e;
  virtual void  foo(); // _ZN7ee776603fooEv
  virtual void  bar(); // _ZN7ee776603barEv
  ~ee77660(); // tgen
  ee77660(); // tgen
};
//SIG(1 ee77660) C1{ VBC2{ VBC3{ BC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77660 ::foo(){vfunc_called(this, "_ZN7ee776603fooEv");}
void  ee77660 ::bar(){vfunc_called(this, "_ZN7ee776603barEv");}
ee77660 ::~ee77660(){ note_dtor("ee77660", this);} // tgen
ee77660 ::ee77660(){ note_ctor("ee77660", this);} // tgen

static void Test_ee77660()
{
  extern Class_Descriptor cd_ee77660;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77660, buf);
    ee77660 *dp, &lv = *(dp=new (buf) ee77660());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77660)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77660)");
    check_base_class_offset(lv, (aa0*)(bb60*)(cc660*), ABISELECT(40,20), "ee77660");
    check_base_class_offset(lv, (bb60*)(cc660*), ABISELECT(32,16), "ee77660");
    check_base_class_offset(lv, (cc660*)(dd7660*), ABISELECT(32,16), "ee77660");
    check_base_class_offset(lv, (dd7660*), ABISELECT(16,8), "ee77660");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77660.e");
    test_class_info(&lv, &cd_ee77660);
    dp->~ee77660();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77660(Test_ee77660, "ee77660", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77660C1Ev();
extern void _ZN7ee77660D1Ev();
Name_Map name_map_ee77660[] = {
  NSPAIR(_ZN7ee77660C1Ev),
  NSPAIR(_ZN7ee77660D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc660;
extern VTBL_ENTRY _ZTI5cc660[];
extern  VTBL_ENTRY _ZTV5cc660[];
extern Class_Descriptor cd_dd7660;
extern VTBL_ENTRY _ZTI6dd7660[];
extern  VTBL_ENTRY _ZTV6dd7660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7660[];
static Base_Class bases_ee77660[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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_cc660,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7660,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77660[];
extern void _ZN7ee776603fooEv();
extern void _ZN7ee776603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee776603barEv,_ZTv0_n16_N7ee776603barEv)();
extern void ABISELECT(_ZThn16_N7ee776603barEv,_ZThn8_N7ee776603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee776603fooEv,_ZTv0_n20_N7ee776603fooEv)();
extern void ABISELECT(_ZThn16_N7ee776603fooEv,_ZThn8_N7ee776603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee776603barEv,_ZTv0_n12_N7ee776603barEv)();
extern void ABISELECT(_ZThn32_N7ee776603barEv,_ZThn16_N7ee776603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee776603fooEv,_ZTv0_n16_N7ee776603fooEv)();
extern void ABISELECT(_ZThn32_N7ee776603fooEv,_ZThn16_N7ee776603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77660[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77660[0]),
  (VTBL_ENTRY)&_ZN7ee776603fooEv,
  (VTBL_ENTRY)&_ZN7ee776603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee776603barEv,_ZTv0_n16_N7ee776603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee776603fooEv,_ZTv0_n20_N7ee776603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee776603barEv,_ZTv0_n12_N7ee776603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee776603fooEv,_ZTv0_n16_N7ee776603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77660[];
extern void _ZN6dd76603barEv();
extern void _ZN6dd76603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7660__7ee77660[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&_ZN6dd76603barEv,
  (VTBL_ENTRY)&_ZN6dd76603fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv)();
extern void ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv)();
extern void ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc660__6dd7660__7ee77660[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7660[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv),
};
static  VTT_ENTRY vtt_ee77660[] = {
  {&(_ZTV7ee77660[4]),  4,19},
  {&(_ZTV7ee77660[11]),  11,19},
  {&(_ZTV7ee77660[17]),  17,19},
  {&(_tg__ZTV6dd7660__7ee77660[3]),  3,5},
  {&(_tg__ZTV5cc660__6dd7660__7ee77660[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77660[];
extern  VTBL_ENTRY _ZTV7ee77660[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77660[];
static VTBL_ENTRY alt_thunk_names392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76603fooEv,_ZTv0_n16_N6dd76603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603fooEv,_ZThn8_N6dd76603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76603barEv,_ZTv0_n12_N6dd76603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76603barEv,_ZThn8_N6dd76603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee776603fooEv,_ZTv0_n16_N7ee776603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee776603fooEv,_ZThn16_N7ee776603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee776603barEv,_ZTv0_n12_N7ee776603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee776603barEv,_ZThn16_N7ee776603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee776603fooEv,_ZTv0_n20_N7ee776603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee776603fooEv,_ZThn8_N7ee776603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee776603barEv,_ZTv0_n16_N7ee776603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee776603barEv,_ZThn8_N7ee776603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77660 = {  "ee77660", // class name
  bases_ee77660, 4,
  &(vtc_ee77660[0]), // expected_vtbl_contents
  &(vtt_ee77660[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77660),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77660),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77660),5, //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  cc760  : virtual bb60 {
  int c;
  virtual void  foo(); // _ZN5cc7603fooEv
  virtual void  bar(); // _ZN5cc7603barEv
  ~cc760(); // tgen
  cc760(); // tgen
};
//SIG(-1 cc760) C1{ VBC2{ BC3{ Fi} v2 v1 Fi} v1 v2 Fi}


void  cc760 ::foo(){vfunc_called(this, "_ZN5cc7603fooEv");}
void  cc760 ::bar(){vfunc_called(this, "_ZN5cc7603barEv");}
cc760 ::~cc760(){ note_dtor("cc760", this);} // tgen
cc760 ::cc760(){ note_ctor("cc760", this);} // tgen

static void Test_cc760()
{
  extern Class_Descriptor cd_cc760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc760, buf);
    cc760 *dp, &lv = *(dp=new (buf) cc760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,12), "cc760");
    check_base_class_offset(lv, (bb60*), ABISELECT(16,8), "cc760");
    check_field_offset(lv, c, ABISELECT(8,4), "cc760.c");
    test_class_info(&lv, &cd_cc760);
    dp->~cc760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc760(Test_cc760, "cc760", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc760C1Ev();
extern void _ZN5cc760D1Ev();
Name_Map name_map_cc760[] = {
  NSPAIR(_ZN5cc760C1Ev),
  NSPAIR(_ZN5cc760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
static Base_Class bases_cc760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5cc760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_cc760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV5cc760[];
static  VTT_ENTRY vtt_cc760[] = {
  {&(_ZTV5cc760[3]),  3,11},
  {&(_ZTV5cc760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static VTBL_ENTRY alt_thunk_names393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc760 = {  "cc760", // class name
  bases_cc760, 2,
  &(vtc_cc760[0]), // expected_vtbl_contents
  &(vtt_cc760[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc760),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names393,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0760  : cc760 {
  int d;
  ~dd0760(); // tgen
  dd0760(); // tgen
};
//SIG(-1 dd0760) C1{ BC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd0760 ::~dd0760(){ note_dtor("dd0760", this);} // tgen
dd0760 ::dd0760(){ note_ctor("dd0760", this);} // tgen

static void Test_dd0760()
{
  extern Class_Descriptor cd_dd0760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0760, buf);
    dd0760 *dp, &lv = *(dp=new (buf) dd0760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd0760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(16,12), "dd0760");
    check_base_class_offset(lv, (cc760*), 0, "dd0760");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0760.d");
    test_class_info(&lv, &cd_dd0760);
    dp->~dd0760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0760(Test_dd0760, "dd0760", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0760C1Ev();
extern void _ZN6dd0760D1Ev();
Name_Map name_map_dd0760[] = {
  NSPAIR(_ZN6dd0760C1Ev),
  NSPAIR(_ZN6dd0760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd0760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd0760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV6dd0760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd0760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd0760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd0760[] = {
  {&(_ZTV6dd0760[3]),  3,11},
  {&(_tg__ZTV5cc760__6dd0760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd0760[4]),  4,6},
  {&(_ZTV6dd0760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static VTBL_ENTRY alt_thunk_names394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0760 = {  "dd0760", // class name
  bases_dd0760, 3,
  &(vtc_dd0760[0]), // expected_vtbl_contents
  &(vtt_dd0760[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0760),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names394,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00760  : dd0760 {
  int e;
  ~ee00760(); // tgen
  ee00760(); // tgen
};
//SIG(1 ee00760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee00760 ::~ee00760(){ note_dtor("ee00760", this);} // tgen
ee00760 ::ee00760(){ note_ctor("ee00760", this);} // tgen

static void Test_ee00760()
{
  extern Class_Descriptor cd_ee00760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00760, buf);
    ee00760 *dp, &lv = *(dp=new (buf) ee00760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee00760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(24,16), "ee00760");
    check_base_class_offset(lv, (cc760*)(dd0760*), 0, "ee00760");
    check_base_class_offset(lv, (dd0760*), 0, "ee00760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00760.e");
    test_class_info(&lv, &cd_ee00760);
    dp->~ee00760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00760(Test_ee00760, "ee00760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00760C1Ev();
extern void _ZN7ee00760D1Ev();
Name_Map name_map_ee00760[] = {
  NSPAIR(_ZN7ee00760C1Ev),
  NSPAIR(_ZN7ee00760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee00760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee00760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee00760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee00760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee00760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee00760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee00760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee00760[] = {
  {&(_ZTV7ee00760[3]),  3,11},
  {&(_tg__ZTV6dd0760__7ee00760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee00760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee00760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee00760[4]),  4,6},
  {&(_ZTV7ee00760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee00760[];
extern  VTBL_ENTRY _ZTV7ee00760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00760[];
static VTBL_ENTRY alt_thunk_names395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00760 = {  "ee00760", // class name
  bases_ee00760, 4,
  &(vtc_ee00760[0]), // expected_vtbl_contents
  &(vtt_ee00760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00760),6, //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  ee10760  : virtual dd0760 {
  int e;
  ~ee10760(); // tgen
  ee10760(); // tgen
};
//SIG(1 ee10760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee10760 ::~ee10760(){ note_dtor("ee10760", this);} // tgen
ee10760 ::ee10760(){ note_ctor("ee10760", this);} // tgen

static void Test_ee10760()
{
  extern Class_Descriptor cd_ee10760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10760, buf);
    ee10760 *dp, &lv = *(dp=new (buf) ee10760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee10760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(32,20), "ee10760");
    check_base_class_offset(lv, (cc760*)(dd0760*), ABISELECT(16,8), "ee10760");
    check_base_class_offset(lv, (dd0760*), ABISELECT(16,8), "ee10760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10760.e");
    test_class_info(&lv, &cd_ee10760);
    dp->~ee10760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10760(Test_ee10760, "ee10760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10760C1Ev();
extern void _ZN7ee10760D1Ev();
Name_Map name_map_ee10760[] = {
  NSPAIR(_ZN7ee10760C1Ev),
  NSPAIR(_ZN7ee10760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee10760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee10760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10760[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee10760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee10760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee10760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee10760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee10760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee10760[] = {
  {&(_ZTV7ee10760[4]),  4,17},
  {&(_ZTV7ee10760[9]),  9,17},
  {&(_ZTV7ee10760[15]),  15,17},
  {&(_tg__ZTV6dd0760__7ee10760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee10760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee10760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee10760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10760[];
extern  VTBL_ENTRY _ZTV7ee10760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10760[];
static VTBL_ENTRY alt_thunk_names396[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10760 = {  "ee10760", // class name
  bases_ee10760, 4,
  &(vtc_ee10760[0]), // expected_vtbl_contents
  &(vtt_ee10760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10760),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names396,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20760  : dd0760 {
  int e;
  virtual void  foo(); // _ZN7ee207603fooEv
  ~ee20760(); // tgen
  ee20760(); // tgen
};
//SIG(1 ee20760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee20760 ::foo(){vfunc_called(this, "_ZN7ee207603fooEv");}
ee20760 ::~ee20760(){ note_dtor("ee20760", this);} // tgen
ee20760 ::ee20760(){ note_ctor("ee20760", this);} // tgen

static void Test_ee20760()
{
  extern Class_Descriptor cd_ee20760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20760, buf);
    ee20760 *dp, &lv = *(dp=new (buf) ee20760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee20760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(24,16), "ee20760");
    check_base_class_offset(lv, (cc760*)(dd0760*), 0, "ee20760");
    check_base_class_offset(lv, (dd0760*), 0, "ee20760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20760.e");
    test_class_info(&lv, &cd_ee20760);
    dp->~ee20760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20760(Test_ee20760, "ee20760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20760C1Ev();
extern void _ZN7ee20760D1Ev();
Name_Map name_map_ee20760[] = {
  NSPAIR(_ZN7ee20760C1Ev),
  NSPAIR(_ZN7ee20760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee20760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20760[];
extern void _ZN7ee207603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee207603fooEv,_ZTv0_n16_N7ee207603fooEv)();
extern void ABISELECT(_ZThn24_N7ee207603fooEv,_ZThn16_N7ee207603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20760[0]),
  (VTBL_ENTRY)&_ZN7ee207603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee207603fooEv,_ZTv0_n16_N7ee207603fooEv),
};
extern VTBL_ENTRY _ZTV7ee20760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee20760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee20760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee20760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee20760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee20760[] = {
  {&(_ZTV7ee20760[3]),  3,11},
  {&(_tg__ZTV6dd0760__7ee20760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee20760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee20760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee20760[4]),  4,6},
  {&(_ZTV7ee20760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee20760[];
extern  VTBL_ENTRY _ZTV7ee20760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20760[];
static VTBL_ENTRY alt_thunk_names397[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee207603fooEv,_ZTv0_n16_N7ee207603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee207603fooEv,_ZThn16_N7ee207603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20760 = {  "ee20760", // class name
  bases_ee20760, 4,
  &(vtc_ee20760[0]), // expected_vtbl_contents
  &(vtt_ee20760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names397,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30760  : virtual dd0760 {
  int e;
  virtual void  foo(); // _ZN7ee307603fooEv
  ~ee30760(); // tgen
  ee30760(); // tgen
};
//SIG(1 ee30760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee30760 ::foo(){vfunc_called(this, "_ZN7ee307603fooEv");}
ee30760 ::~ee30760(){ note_dtor("ee30760", this);} // tgen
ee30760 ::ee30760(){ note_ctor("ee30760", this);} // tgen

static void Test_ee30760()
{
  extern Class_Descriptor cd_ee30760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30760, buf);
    ee30760 *dp, &lv = *(dp=new (buf) ee30760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee30760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(32,20), "ee30760");
    check_base_class_offset(lv, (cc760*)(dd0760*), ABISELECT(16,8), "ee30760");
    check_base_class_offset(lv, (dd0760*), ABISELECT(16,8), "ee30760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30760.e");
    test_class_info(&lv, &cd_ee30760);
    dp->~ee30760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30760(Test_ee30760, "ee30760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30760C1Ev();
extern void _ZN7ee30760D1Ev();
Name_Map name_map_ee30760[] = {
  NSPAIR(_ZN7ee30760C1Ev),
  NSPAIR(_ZN7ee30760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee30760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30760[];
extern void _ZN7ee307603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee307603fooEv,_ZTv0_n16_N7ee307603fooEv)();
extern void ABISELECT(_ZThn16_N7ee307603fooEv,_ZThn8_N7ee307603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee307603fooEv,_ZTv0_n16_N7ee307603fooEv)();
extern void ABISELECT(_ZThn32_N7ee307603fooEv,_ZThn20_N7ee307603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30760[0]),
  (VTBL_ENTRY)&_ZN7ee307603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee307603fooEv,_ZTv0_n16_N7ee307603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee307603fooEv,_ZTv0_n16_N7ee307603fooEv),
};
extern VTBL_ENTRY _ZTV7ee30760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee30760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee30760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee30760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee30760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee30760[] = {
  {&(_ZTV7ee30760[4]),  4,18},
  {&(_ZTV7ee30760[10]),  10,18},
  {&(_ZTV7ee30760[16]),  16,18},
  {&(_tg__ZTV6dd0760__7ee30760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee30760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee30760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee30760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30760[];
extern  VTBL_ENTRY _ZTV7ee30760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30760[];
static VTBL_ENTRY alt_thunk_names398[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee307603fooEv,_ZTv0_n16_N7ee307603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee307603fooEv,_ZThn20_N7ee307603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee307603fooEv,_ZThn8_N7ee307603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30760 = {  "ee30760", // class name
  bases_ee30760, 4,
  &(vtc_ee30760[0]), // expected_vtbl_contents
  &(vtt_ee30760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names398,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40760  : dd0760 {
  int e;
  virtual void  bar(); // _ZN7ee407603barEv
  ~ee40760(); // tgen
  ee40760(); // tgen
};
//SIG(1 ee40760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee40760 ::bar(){vfunc_called(this, "_ZN7ee407603barEv");}
ee40760 ::~ee40760(){ note_dtor("ee40760", this);} // tgen
ee40760 ::ee40760(){ note_ctor("ee40760", this);} // tgen

static void Test_ee40760()
{
  extern Class_Descriptor cd_ee40760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40760, buf);
    ee40760 *dp, &lv = *(dp=new (buf) ee40760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee40760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(24,16), "ee40760");
    check_base_class_offset(lv, (cc760*)(dd0760*), 0, "ee40760");
    check_base_class_offset(lv, (dd0760*), 0, "ee40760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40760.e");
    test_class_info(&lv, &cd_ee40760);
    dp->~ee40760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40760(Test_ee40760, "ee40760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40760C1Ev();
extern void _ZN7ee40760D1Ev();
Name_Map name_map_ee40760[] = {
  NSPAIR(_ZN7ee40760C1Ev),
  NSPAIR(_ZN7ee40760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee40760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40760[];
extern void _ZN5cc7603fooEv();
extern void _ZN7ee407603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee407603barEv,_ZTv0_n12_N7ee407603barEv)();
extern void ABISELECT(_ZThn24_N7ee407603barEv,_ZThn16_N7ee407603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN7ee407603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee407603barEv,_ZTv0_n12_N7ee407603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee40760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee40760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee40760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee40760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee40760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee40760[] = {
  {&(_ZTV7ee40760[3]),  3,11},
  {&(_tg__ZTV6dd0760__7ee40760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee40760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee40760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee40760[4]),  4,6},
  {&(_ZTV7ee40760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee40760[];
extern  VTBL_ENTRY _ZTV7ee40760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40760[];
static VTBL_ENTRY alt_thunk_names399[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee407603barEv,_ZTv0_n12_N7ee407603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee407603barEv,_ZThn16_N7ee407603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40760 = {  "ee40760", // class name
  bases_ee40760, 4,
  &(vtc_ee40760[0]), // expected_vtbl_contents
  &(vtt_ee40760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names399,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50760  : virtual dd0760 {
  int e;
  virtual void  bar(); // _ZN7ee507603barEv
  ~ee50760(); // tgen
  ee50760(); // tgen
};
//SIG(1 ee50760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee50760 ::bar(){vfunc_called(this, "_ZN7ee507603barEv");}
ee50760 ::~ee50760(){ note_dtor("ee50760", this);} // tgen
ee50760 ::ee50760(){ note_ctor("ee50760", this);} // tgen

static void Test_ee50760()
{
  extern Class_Descriptor cd_ee50760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50760, buf);
    ee50760 *dp, &lv = *(dp=new (buf) ee50760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee50760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(32,20), "ee50760");
    check_base_class_offset(lv, (cc760*)(dd0760*), ABISELECT(16,8), "ee50760");
    check_base_class_offset(lv, (dd0760*), ABISELECT(16,8), "ee50760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50760.e");
    test_class_info(&lv, &cd_ee50760);
    dp->~ee50760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50760(Test_ee50760, "ee50760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50760C1Ev();
extern void _ZN7ee50760D1Ev();
Name_Map name_map_ee50760[] = {
  NSPAIR(_ZN7ee50760C1Ev),
  NSPAIR(_ZN7ee50760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee50760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50760[];
extern void _ZN7ee507603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee507603barEv,_ZTv0_n20_N7ee507603barEv)();
extern void ABISELECT(_ZThn16_N7ee507603barEv,_ZThn8_N7ee507603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee507603barEv,_ZTv0_n12_N7ee507603barEv)();
extern void ABISELECT(_ZThn32_N7ee507603barEv,_ZThn20_N7ee507603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50760[0]),
  (VTBL_ENTRY)&_ZN7ee507603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee507603barEv,_ZTv0_n20_N7ee507603barEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee507603barEv,_ZTv0_n12_N7ee507603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee50760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee50760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee50760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee50760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee50760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee50760[] = {
  {&(_ZTV7ee50760[4]),  4,18},
  {&(_ZTV7ee50760[10]),  10,18},
  {&(_ZTV7ee50760[16]),  16,18},
  {&(_tg__ZTV6dd0760__7ee50760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee50760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee50760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee50760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50760[];
extern  VTBL_ENTRY _ZTV7ee50760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50760[];
static VTBL_ENTRY alt_thunk_names400[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee507603barEv,_ZTv0_n12_N7ee507603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee507603barEv,_ZThn20_N7ee507603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee507603barEv,_ZTv0_n20_N7ee507603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee507603barEv,_ZThn8_N7ee507603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50760 = {  "ee50760", // class name
  bases_ee50760, 4,
  &(vtc_ee50760[0]), // expected_vtbl_contents
  &(vtt_ee50760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names400,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60760  : dd0760 {
  int e;
  virtual void  foo(); // _ZN7ee607603fooEv
  virtual void  bar(); // _ZN7ee607603barEv
  ~ee60760(); // tgen
  ee60760(); // tgen
};
//SIG(1 ee60760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee60760 ::foo(){vfunc_called(this, "_ZN7ee607603fooEv");}
void  ee60760 ::bar(){vfunc_called(this, "_ZN7ee607603barEv");}
ee60760 ::~ee60760(){ note_dtor("ee60760", this);} // tgen
ee60760 ::ee60760(){ note_ctor("ee60760", this);} // tgen

static void Test_ee60760()
{
  extern Class_Descriptor cd_ee60760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60760, buf);
    ee60760 *dp, &lv = *(dp=new (buf) ee60760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee60760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(24,16), "ee60760");
    check_base_class_offset(lv, (cc760*)(dd0760*), 0, "ee60760");
    check_base_class_offset(lv, (dd0760*), 0, "ee60760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60760.e");
    test_class_info(&lv, &cd_ee60760);
    dp->~ee60760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60760(Test_ee60760, "ee60760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60760C1Ev();
extern void _ZN7ee60760D1Ev();
Name_Map name_map_ee60760[] = {
  NSPAIR(_ZN7ee60760C1Ev),
  NSPAIR(_ZN7ee60760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee60760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60760[];
extern void _ZN7ee607603fooEv();
extern void _ZN7ee607603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee607603barEv,_ZTv0_n12_N7ee607603barEv)();
extern void ABISELECT(_ZThn24_N7ee607603barEv,_ZThn16_N7ee607603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee607603fooEv,_ZTv0_n16_N7ee607603fooEv)();
extern void ABISELECT(_ZThn24_N7ee607603fooEv,_ZThn16_N7ee607603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60760[0]),
  (VTBL_ENTRY)&_ZN7ee607603fooEv,
  (VTBL_ENTRY)&_ZN7ee607603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee607603barEv,_ZTv0_n12_N7ee607603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee607603fooEv,_ZTv0_n16_N7ee607603fooEv),
};
extern VTBL_ENTRY _ZTV7ee60760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee60760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee60760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee60760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee60760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee60760[] = {
  {&(_ZTV7ee60760[3]),  3,11},
  {&(_tg__ZTV6dd0760__7ee60760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee60760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee60760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee60760[4]),  4,6},
  {&(_ZTV7ee60760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60760[];
extern  VTBL_ENTRY _ZTV7ee60760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60760[];
static VTBL_ENTRY alt_thunk_names401[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee607603fooEv,_ZTv0_n16_N7ee607603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee607603fooEv,_ZThn16_N7ee607603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee607603barEv,_ZTv0_n12_N7ee607603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee607603barEv,_ZThn16_N7ee607603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60760 = {  "ee60760", // class name
  bases_ee60760, 4,
  &(vtc_ee60760[0]), // expected_vtbl_contents
  &(vtt_ee60760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names401,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70760  : virtual dd0760 {
  int e;
  virtual void  foo(); // _ZN7ee707603fooEv
  virtual void  bar(); // _ZN7ee707603barEv
  ~ee70760(); // tgen
  ee70760(); // tgen
};
//SIG(1 ee70760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee70760 ::foo(){vfunc_called(this, "_ZN7ee707603fooEv");}
void  ee70760 ::bar(){vfunc_called(this, "_ZN7ee707603barEv");}
ee70760 ::~ee70760(){ note_dtor("ee70760", this);} // tgen
ee70760 ::ee70760(){ note_ctor("ee70760", this);} // tgen

static void Test_ee70760()
{
  extern Class_Descriptor cd_ee70760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70760, buf);
    ee70760 *dp, &lv = *(dp=new (buf) ee70760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee70760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd0760*), ABISELECT(32,20), "ee70760");
    check_base_class_offset(lv, (cc760*)(dd0760*), ABISELECT(16,8), "ee70760");
    check_base_class_offset(lv, (dd0760*), ABISELECT(16,8), "ee70760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70760.e");
    test_class_info(&lv, &cd_ee70760);
    dp->~ee70760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70760(Test_ee70760, "ee70760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70760C1Ev();
extern void _ZN7ee70760D1Ev();
Name_Map name_map_ee70760[] = {
  NSPAIR(_ZN7ee70760C1Ev),
  NSPAIR(_ZN7ee70760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd0760;
extern VTBL_ENTRY _ZTI6dd0760[];
extern  VTBL_ENTRY _ZTV6dd0760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0760[];
static Base_Class bases_ee70760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70760[];
extern void _ZN7ee707603fooEv();
extern void _ZN7ee707603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee707603fooEv,_ZTv0_n16_N7ee707603fooEv)();
extern void ABISELECT(_ZThn16_N7ee707603fooEv,_ZThn8_N7ee707603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee707603barEv,_ZTv0_n20_N7ee707603barEv)();
extern void ABISELECT(_ZThn16_N7ee707603barEv,_ZThn8_N7ee707603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee707603barEv,_ZTv0_n12_N7ee707603barEv)();
extern void ABISELECT(_ZThn32_N7ee707603barEv,_ZThn20_N7ee707603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee707603fooEv,_ZTv0_n16_N7ee707603fooEv)();
extern void ABISELECT(_ZThn32_N7ee707603fooEv,_ZThn20_N7ee707603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70760[0]),
  (VTBL_ENTRY)&_ZN7ee707603fooEv,
  (VTBL_ENTRY)&_ZN7ee707603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee707603fooEv,_ZTv0_n16_N7ee707603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee707603barEv,_ZTv0_n20_N7ee707603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee707603barEv,_ZTv0_n12_N7ee707603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee707603fooEv,_ZTv0_n16_N7ee707603fooEv),
};
extern VTBL_ENTRY _ZTV7ee70760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd0760__7ee70760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd0760__7ee70760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd0760__7ee70760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd0760__7ee70760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee70760[] = {
  {&(_ZTV7ee70760[4]),  4,19},
  {&(_ZTV7ee70760[11]),  11,19},
  {&(_ZTV7ee70760[17]),  17,19},
  {&(_tg__ZTV6dd0760__7ee70760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd0760__7ee70760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd0760__7ee70760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd0760__7ee70760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70760[];
extern  VTBL_ENTRY _ZTV7ee70760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70760[];
static VTBL_ENTRY alt_thunk_names402[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee707603barEv,_ZTv0_n12_N7ee707603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee707603barEv,_ZThn20_N7ee707603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee707603barEv,_ZTv0_n20_N7ee707603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee707603barEv,_ZThn8_N7ee707603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee707603fooEv,_ZTv0_n16_N7ee707603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee707603fooEv,_ZThn20_N7ee707603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee707603fooEv,_ZThn8_N7ee707603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70760 = {  "ee70760", // class name
  bases_ee70760, 4,
  &(vtc_ee70760[0]), // expected_vtbl_contents
  &(vtt_ee70760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names402,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1760  : virtual cc760 {
  int d;
  ~dd1760(); // tgen
  dd1760(); // tgen
};
//SIG(-1 dd1760) C1{ VBC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd1760 ::~dd1760(){ note_dtor("dd1760", this);} // tgen
dd1760 ::dd1760(){ note_ctor("dd1760", this);} // tgen

static void Test_dd1760()
{
  extern Class_Descriptor cd_dd1760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1760, buf);
    dd1760 *dp, &lv = *(dp=new (buf) dd1760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd1760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,16), "dd1760");
    check_base_class_offset(lv, (cc760*), ABISELECT(16,8), "dd1760");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1760.d");
    test_class_info(&lv, &cd_dd1760);
    dp->~dd1760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1760(Test_dd1760, "dd1760", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1760C1Ev();
extern void _ZN6dd1760D1Ev();
Name_Map name_map_dd1760[] = {
  NSPAIR(_ZN6dd1760C1Ev),
  NSPAIR(_ZN6dd1760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd1760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd1760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV6dd1760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd1760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd1760[] = {
  {&(_ZTV6dd1760[4]),  4,17},
  {&(_ZTV6dd1760[9]),  9,17},
  {&(_ZTV6dd1760[15]),  15,17},
  {&(_tg__ZTV5cc760__6dd1760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd1760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static VTBL_ENTRY alt_thunk_names403[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1760 = {  "dd1760", // class name
  bases_dd1760, 3,
  &(vtc_dd1760[0]), // expected_vtbl_contents
  &(vtt_dd1760[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1760),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1760),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names403,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01760  : dd1760 {
  int e;
  ~ee01760(); // tgen
  ee01760(); // tgen
};
//SIG(1 ee01760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee01760 ::~ee01760(){ note_dtor("ee01760", this);} // tgen
ee01760 ::ee01760(){ note_ctor("ee01760", this);} // tgen

static void Test_ee01760()
{
  extern Class_Descriptor cd_ee01760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01760, buf);
    ee01760 *dp, &lv = *(dp=new (buf) ee01760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee01760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee01760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(16,12), "ee01760");
    check_base_class_offset(lv, (dd1760*), 0, "ee01760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01760.e");
    test_class_info(&lv, &cd_ee01760);
    dp->~ee01760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01760(Test_ee01760, "ee01760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01760C1Ev();
extern void _ZN7ee01760D1Ev();
Name_Map name_map_ee01760[] = {
  NSPAIR(_ZN7ee01760C1Ev),
  NSPAIR(_ZN7ee01760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee01760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //bcp->offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee01760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01760[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee01760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee01760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee01760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee01760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee01760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee01760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee01760[] = {
  {&(_ZTV7ee01760[4]),  4,17},
  {&(_tg__ZTV6dd1760__7ee01760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee01760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee01760[4]),  4,6},
  {&(_ZTV7ee01760[9]),  9,17},
  {&(_ZTV7ee01760[15]),  15,17},
  {&(_tg__ZTV5cc760__7ee01760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee01760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01760[];
extern  VTBL_ENTRY _ZTV7ee01760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01760[];
static VTBL_ENTRY alt_thunk_names404[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01760 = {  "ee01760", // class name
  bases_ee01760, 4,
  &(vtc_ee01760[0]), // expected_vtbl_contents
  &(vtt_ee01760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01760),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names404,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11760  : virtual dd1760 {
  int e;
  ~ee11760(); // tgen
  ee11760(); // tgen
};
//SIG(1 ee11760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee11760 ::~ee11760(){ note_dtor("ee11760", this);} // tgen
ee11760 ::ee11760(){ note_ctor("ee11760", this);} // tgen

static void Test_ee11760()
{
  extern Class_Descriptor cd_ee11760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11760, buf);
    ee11760 *dp, &lv = *(dp=new (buf) ee11760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee11760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee11760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(32,16), "ee11760");
    check_base_class_offset(lv, (dd1760*), ABISELECT(16,8), "ee11760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11760.e");
    test_class_info(&lv, &cd_ee11760);
    dp->~ee11760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11760(Test_ee11760, "ee11760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11760C1Ev();
extern void _ZN7ee11760D1Ev();
Name_Map name_map_ee11760[] = {
  NSPAIR(_ZN7ee11760C1Ev),
  NSPAIR(_ZN7ee11760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee11760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    9, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee11760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11760[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11760[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee11760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee11760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee11760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee11760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee11760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee11760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee11760[] = {
  {&(_ZTV7ee11760[5]),  5,22},
  {&(_ZTV7ee11760[9]),  9,22},
  {&(_ZTV7ee11760[14]),  14,22},
  {&(_ZTV7ee11760[20]),  20,22},
  {&(_tg__ZTV6dd1760__7ee11760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee11760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee11760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee11760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee11760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11760[];
extern  VTBL_ENTRY _ZTV7ee11760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11760[];
static VTBL_ENTRY alt_thunk_names405[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11760 = {  "ee11760", // class name
  bases_ee11760, 4,
  &(vtc_ee11760[0]), // expected_vtbl_contents
  &(vtt_ee11760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11760),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names405,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21760  : dd1760 {
  int e;
  virtual void  foo(); // _ZN7ee217603fooEv
  ~ee21760(); // tgen
  ee21760(); // tgen
};
//SIG(1 ee21760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee21760 ::foo(){vfunc_called(this, "_ZN7ee217603fooEv");}
ee21760 ::~ee21760(){ note_dtor("ee21760", this);} // tgen
ee21760 ::ee21760(){ note_ctor("ee21760", this);} // tgen

static void Test_ee21760()
{
  extern Class_Descriptor cd_ee21760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21760, buf);
    ee21760 *dp, &lv = *(dp=new (buf) ee21760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee21760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee21760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(16,12), "ee21760");
    check_base_class_offset(lv, (dd1760*), 0, "ee21760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21760.e");
    test_class_info(&lv, &cd_ee21760);
    dp->~ee21760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21760(Test_ee21760, "ee21760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21760C1Ev();
extern void _ZN7ee21760D1Ev();
Name_Map name_map_ee21760[] = {
  NSPAIR(_ZN7ee21760C1Ev),
  NSPAIR(_ZN7ee21760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee21760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21760[];
extern void _ZN7ee217603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee217603fooEv,_ZTv0_n16_N7ee217603fooEv)();
extern void ABISELECT(_ZThn16_N7ee217603fooEv,_ZThn12_N7ee217603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee217603fooEv,_ZTv0_n16_N7ee217603fooEv)();
extern void ABISELECT(_ZThn32_N7ee217603fooEv,_ZThn20_N7ee217603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21760[0]),
  (VTBL_ENTRY)&_ZN7ee217603fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee217603fooEv,_ZTv0_n16_N7ee217603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee217603fooEv,_ZTv0_n16_N7ee217603fooEv),
};
extern VTBL_ENTRY _ZTV7ee21760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee21760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee21760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee21760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee21760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee21760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee21760[] = {
  {&(_ZTV7ee21760[4]),  4,18},
  {&(_tg__ZTV6dd1760__7ee21760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee21760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee21760[4]),  4,6},
  {&(_ZTV7ee21760[10]),  10,18},
  {&(_ZTV7ee21760[16]),  16,18},
  {&(_tg__ZTV5cc760__7ee21760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee21760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21760[];
extern  VTBL_ENTRY _ZTV7ee21760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21760[];
static VTBL_ENTRY alt_thunk_names406[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee217603fooEv,_ZTv0_n16_N7ee217603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee217603fooEv,_ZThn20_N7ee217603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee217603fooEv,_ZThn12_N7ee217603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21760 = {  "ee21760", // class name
  bases_ee21760, 4,
  &(vtc_ee21760[0]), // expected_vtbl_contents
  &(vtt_ee21760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names406,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31760  : virtual dd1760 {
  int e;
  virtual void  foo(); // _ZN7ee317603fooEv
  ~ee31760(); // tgen
  ee31760(); // tgen
};
//SIG(1 ee31760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee31760 ::foo(){vfunc_called(this, "_ZN7ee317603fooEv");}
ee31760 ::~ee31760(){ note_dtor("ee31760", this);} // tgen
ee31760 ::ee31760(){ note_ctor("ee31760", this);} // tgen

static void Test_ee31760()
{
  extern Class_Descriptor cd_ee31760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31760, buf);
    ee31760 *dp, &lv = *(dp=new (buf) ee31760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee31760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee31760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(32,16), "ee31760");
    check_base_class_offset(lv, (dd1760*), ABISELECT(16,8), "ee31760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31760.e");
    test_class_info(&lv, &cd_ee31760);
    dp->~ee31760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31760(Test_ee31760, "ee31760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31760C1Ev();
extern void _ZN7ee31760D1Ev();
Name_Map name_map_ee31760[] = {
  NSPAIR(_ZN7ee31760C1Ev),
  NSPAIR(_ZN7ee31760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee31760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    10, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31760[];
extern void _ZN7ee317603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee317603fooEv,_ZTv0_n16_N7ee317603fooEv)();
extern void ABISELECT(_ZThn32_N7ee317603fooEv,_ZThn16_N7ee317603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee317603fooEv,_ZTv0_n16_N7ee317603fooEv)();
extern void ABISELECT(_ZThn48_N7ee317603fooEv,_ZThn24_N7ee317603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31760[0]),
  (VTBL_ENTRY)&_ZN7ee317603fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31760[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee317603fooEv,_ZTv0_n16_N7ee317603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee317603fooEv,_ZTv0_n16_N7ee317603fooEv),
};
extern VTBL_ENTRY _ZTV7ee31760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee31760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee31760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee31760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee31760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee31760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee31760[] = {
  {&(_ZTV7ee31760[5]),  5,23},
  {&(_ZTV7ee31760[10]),  10,23},
  {&(_ZTV7ee31760[15]),  15,23},
  {&(_ZTV7ee31760[21]),  21,23},
  {&(_tg__ZTV6dd1760__7ee31760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee31760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee31760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee31760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee31760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31760[];
extern  VTBL_ENTRY _ZTV7ee31760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31760[];
static VTBL_ENTRY alt_thunk_names407[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee317603fooEv,_ZTv0_n16_N7ee317603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee317603fooEv,_ZThn24_N7ee317603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee317603fooEv,_ZThn16_N7ee317603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31760 = {  "ee31760", // class name
  bases_ee31760, 4,
  &(vtc_ee31760[0]), // expected_vtbl_contents
  &(vtt_ee31760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31760),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names407,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41760  : dd1760 {
  int e;
  virtual void  bar(); // _ZN7ee417603barEv
  ~ee41760(); // tgen
  ee41760(); // tgen
};
//SIG(1 ee41760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee41760 ::bar(){vfunc_called(this, "_ZN7ee417603barEv");}
ee41760 ::~ee41760(){ note_dtor("ee41760", this);} // tgen
ee41760 ::ee41760(){ note_ctor("ee41760", this);} // tgen

static void Test_ee41760()
{
  extern Class_Descriptor cd_ee41760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41760, buf);
    ee41760 *dp, &lv = *(dp=new (buf) ee41760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee41760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee41760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(16,12), "ee41760");
    check_base_class_offset(lv, (dd1760*), 0, "ee41760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41760.e");
    test_class_info(&lv, &cd_ee41760);
    dp->~ee41760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41760(Test_ee41760, "ee41760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41760C1Ev();
extern void _ZN7ee41760D1Ev();
Name_Map name_map_ee41760[] = {
  NSPAIR(_ZN7ee41760C1Ev),
  NSPAIR(_ZN7ee41760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee41760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41760[];
extern void _ZN7ee417603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee417603barEv,_ZTv0_n20_N7ee417603barEv)();
extern void ABISELECT(_ZThn16_N7ee417603barEv,_ZThn12_N7ee417603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee417603barEv,_ZTv0_n12_N7ee417603barEv)();
extern void ABISELECT(_ZThn32_N7ee417603barEv,_ZThn20_N7ee417603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41760[0]),
  (VTBL_ENTRY)&_ZN7ee417603barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee417603barEv,_ZTv0_n20_N7ee417603barEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee417603barEv,_ZTv0_n12_N7ee417603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee41760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee41760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee41760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee41760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee41760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee41760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee41760[] = {
  {&(_ZTV7ee41760[4]),  4,18},
  {&(_tg__ZTV6dd1760__7ee41760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee41760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee41760[4]),  4,6},
  {&(_ZTV7ee41760[10]),  10,18},
  {&(_ZTV7ee41760[16]),  16,18},
  {&(_tg__ZTV5cc760__7ee41760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee41760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41760[];
extern  VTBL_ENTRY _ZTV7ee41760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41760[];
static VTBL_ENTRY alt_thunk_names408[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee417603barEv,_ZTv0_n12_N7ee417603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee417603barEv,_ZThn20_N7ee417603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee417603barEv,_ZTv0_n20_N7ee417603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee417603barEv,_ZThn12_N7ee417603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41760 = {  "ee41760", // class name
  bases_ee41760, 4,
  &(vtc_ee41760[0]), // expected_vtbl_contents
  &(vtt_ee41760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names408,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51760  : virtual dd1760 {
  int e;
  virtual void  bar(); // _ZN7ee517603barEv
  ~ee51760(); // tgen
  ee51760(); // tgen
};
//SIG(1 ee51760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee51760 ::bar(){vfunc_called(this, "_ZN7ee517603barEv");}
ee51760 ::~ee51760(){ note_dtor("ee51760", this);} // tgen
ee51760 ::ee51760(){ note_ctor("ee51760", this);} // tgen

static void Test_ee51760()
{
  extern Class_Descriptor cd_ee51760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51760, buf);
    ee51760 *dp, &lv = *(dp=new (buf) ee51760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee51760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee51760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(32,16), "ee51760");
    check_base_class_offset(lv, (dd1760*), ABISELECT(16,8), "ee51760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51760.e");
    test_class_info(&lv, &cd_ee51760);
    dp->~ee51760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51760(Test_ee51760, "ee51760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51760C1Ev();
extern void _ZN7ee51760D1Ev();
Name_Map name_map_ee51760[] = {
  NSPAIR(_ZN7ee51760C1Ev),
  NSPAIR(_ZN7ee51760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee51760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    10, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51760[];
extern void _ZN7ee517603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee517603barEv,_ZTv0_n20_N7ee517603barEv)();
extern void ABISELECT(_ZThn32_N7ee517603barEv,_ZThn16_N7ee517603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee517603barEv,_ZTv0_n12_N7ee517603barEv)();
extern void ABISELECT(_ZThn48_N7ee517603barEv,_ZThn24_N7ee517603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51760[0]),
  (VTBL_ENTRY)&_ZN7ee517603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51760[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee517603barEv,_ZTv0_n20_N7ee517603barEv),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee517603barEv,_ZTv0_n12_N7ee517603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee51760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee51760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee51760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee51760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee51760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee51760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee51760[] = {
  {&(_ZTV7ee51760[5]),  5,23},
  {&(_ZTV7ee51760[10]),  10,23},
  {&(_ZTV7ee51760[15]),  15,23},
  {&(_ZTV7ee51760[21]),  21,23},
  {&(_tg__ZTV6dd1760__7ee51760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee51760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee51760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee51760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee51760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51760[];
extern  VTBL_ENTRY _ZTV7ee51760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51760[];
static VTBL_ENTRY alt_thunk_names409[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee517603barEv,_ZTv0_n12_N7ee517603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee517603barEv,_ZThn24_N7ee517603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee517603barEv,_ZTv0_n20_N7ee517603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee517603barEv,_ZThn16_N7ee517603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51760 = {  "ee51760", // class name
  bases_ee51760, 4,
  &(vtc_ee51760[0]), // expected_vtbl_contents
  &(vtt_ee51760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51760),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51760),9, //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  ee61760  : dd1760 {
  int e;
  virtual void  foo(); // _ZN7ee617603fooEv
  virtual void  bar(); // _ZN7ee617603barEv
  ~ee61760(); // tgen
  ee61760(); // tgen
};
//SIG(1 ee61760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee61760 ::foo(){vfunc_called(this, "_ZN7ee617603fooEv");}
void  ee61760 ::bar(){vfunc_called(this, "_ZN7ee617603barEv");}
ee61760 ::~ee61760(){ note_dtor("ee61760", this);} // tgen
ee61760 ::ee61760(){ note_ctor("ee61760", this);} // tgen

static void Test_ee61760()
{
  extern Class_Descriptor cd_ee61760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61760, buf);
    ee61760 *dp, &lv = *(dp=new (buf) ee61760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee61760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee61760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(16,12), "ee61760");
    check_base_class_offset(lv, (dd1760*), 0, "ee61760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61760.e");
    test_class_info(&lv, &cd_ee61760);
    dp->~ee61760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61760(Test_ee61760, "ee61760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61760C1Ev();
extern void _ZN7ee61760D1Ev();
Name_Map name_map_ee61760[] = {
  NSPAIR(_ZN7ee61760C1Ev),
  NSPAIR(_ZN7ee61760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee61760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61760[];
extern void _ZN7ee617603fooEv();
extern void _ZN7ee617603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee617603fooEv,_ZTv0_n16_N7ee617603fooEv)();
extern void ABISELECT(_ZThn16_N7ee617603fooEv,_ZThn12_N7ee617603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee617603barEv,_ZTv0_n20_N7ee617603barEv)();
extern void ABISELECT(_ZThn16_N7ee617603barEv,_ZThn12_N7ee617603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee617603barEv,_ZTv0_n12_N7ee617603barEv)();
extern void ABISELECT(_ZThn32_N7ee617603barEv,_ZThn20_N7ee617603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee617603fooEv,_ZTv0_n16_N7ee617603fooEv)();
extern void ABISELECT(_ZThn32_N7ee617603fooEv,_ZThn20_N7ee617603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61760[0]),
  (VTBL_ENTRY)&_ZN7ee617603fooEv,
  (VTBL_ENTRY)&_ZN7ee617603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee617603fooEv,_ZTv0_n16_N7ee617603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee617603barEv,_ZTv0_n20_N7ee617603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee617603barEv,_ZTv0_n12_N7ee617603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee617603fooEv,_ZTv0_n16_N7ee617603fooEv),
};
extern VTBL_ENTRY _ZTV7ee61760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee61760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee61760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee61760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee61760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee61760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee61760[] = {
  {&(_ZTV7ee61760[4]),  4,19},
  {&(_tg__ZTV6dd1760__7ee61760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee61760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee61760[4]),  4,6},
  {&(_ZTV7ee61760[11]),  11,19},
  {&(_ZTV7ee61760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee61760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee61760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61760[];
extern  VTBL_ENTRY _ZTV7ee61760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61760[];
static VTBL_ENTRY alt_thunk_names410[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee617603barEv,_ZTv0_n12_N7ee617603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee617603barEv,_ZThn20_N7ee617603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee617603barEv,_ZTv0_n20_N7ee617603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee617603barEv,_ZThn12_N7ee617603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee617603fooEv,_ZTv0_n16_N7ee617603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee617603fooEv,_ZThn20_N7ee617603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee617603fooEv,_ZThn12_N7ee617603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61760 = {  "ee61760", // class name
  bases_ee61760, 4,
  &(vtc_ee61760[0]), // expected_vtbl_contents
  &(vtt_ee61760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61760),8, //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  ee71760  : virtual dd1760 {
  int e;
  virtual void  foo(); // _ZN7ee717603fooEv
  virtual void  bar(); // _ZN7ee717603barEv
  ~ee71760(); // tgen
  ee71760(); // tgen
};
//SIG(1 ee71760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee71760 ::foo(){vfunc_called(this, "_ZN7ee717603fooEv");}
void  ee71760 ::bar(){vfunc_called(this, "_ZN7ee717603barEv");}
ee71760 ::~ee71760(){ note_dtor("ee71760", this);} // tgen
ee71760 ::ee71760(){ note_ctor("ee71760", this);} // tgen

static void Test_ee71760()
{
  extern Class_Descriptor cd_ee71760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71760, buf);
    ee71760 *dp, &lv = *(dp=new (buf) ee71760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee71760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee71760");
    check_base_class_offset(lv, (cc760*)(dd1760*), ABISELECT(32,16), "ee71760");
    check_base_class_offset(lv, (dd1760*), ABISELECT(16,8), "ee71760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71760.e");
    test_class_info(&lv, &cd_ee71760);
    dp->~ee71760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71760(Test_ee71760, "ee71760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71760C1Ev();
extern void _ZN7ee71760D1Ev();
Name_Map name_map_ee71760[] = {
  NSPAIR(_ZN7ee71760C1Ev),
  NSPAIR(_ZN7ee71760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd1760;
extern VTBL_ENTRY _ZTI6dd1760[];
extern  VTBL_ENTRY _ZTV6dd1760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1760[];
static Base_Class bases_ee71760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee71760[];
extern void _ZN7ee717603fooEv();
extern void _ZN7ee717603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee717603fooEv,_ZTv0_n16_N7ee717603fooEv)();
extern void ABISELECT(_ZThn32_N7ee717603fooEv,_ZThn16_N7ee717603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee717603barEv,_ZTv0_n20_N7ee717603barEv)();
extern void ABISELECT(_ZThn32_N7ee717603barEv,_ZThn16_N7ee717603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee717603barEv,_ZTv0_n12_N7ee717603barEv)();
extern void ABISELECT(_ZThn48_N7ee717603barEv,_ZThn24_N7ee717603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee717603fooEv,_ZTv0_n16_N7ee717603fooEv)();
extern void ABISELECT(_ZThn48_N7ee717603fooEv,_ZThn24_N7ee717603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71760[0]),
  (VTBL_ENTRY)&_ZN7ee717603fooEv,
  (VTBL_ENTRY)&_ZN7ee717603barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71760[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee717603fooEv,_ZTv0_n16_N7ee717603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee717603barEv,_ZTv0_n20_N7ee717603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee717603barEv,_ZTv0_n12_N7ee717603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee717603fooEv,_ZTv0_n16_N7ee717603fooEv),
};
extern VTBL_ENTRY _ZTV7ee71760[];
static  VTBL_ENTRY _tg__ZTV6dd1760__7ee71760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd1760__7ee71760[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd1760__7ee71760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee71760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee71760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee71760[] = {
  {&(_ZTV7ee71760[5]),  5,24},
  {&(_ZTV7ee71760[11]),  11,24},
  {&(_ZTV7ee71760[16]),  16,24},
  {&(_ZTV7ee71760[22]),  22,24},
  {&(_tg__ZTV6dd1760__7ee71760[4]),  4,4},
  {&(_tg__ZTV5cc760__6dd1760__7ee71760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd1760__7ee71760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee71760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee71760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71760[];
extern  VTBL_ENTRY _ZTV7ee71760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71760[];
static VTBL_ENTRY alt_thunk_names411[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee717603barEv,_ZTv0_n12_N7ee717603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee717603barEv,_ZThn24_N7ee717603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee717603barEv,_ZTv0_n20_N7ee717603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee717603barEv,_ZThn16_N7ee717603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee717603fooEv,_ZTv0_n16_N7ee717603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee717603fooEv,_ZThn24_N7ee717603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee717603fooEv,_ZThn16_N7ee717603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71760 = {  "ee71760", // class name
  bases_ee71760, 4,
  &(vtc_ee71760[0]), // expected_vtbl_contents
  &(vtt_ee71760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71760),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71760),9, //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  dd2760  : cc760 {
  int d;
  virtual void  foo(); // _ZN6dd27603fooEv
  ~dd2760(); // tgen
  dd2760(); // tgen
};
//SIG(-1 dd2760) C1{ BC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd2760 ::foo(){vfunc_called(this, "_ZN6dd27603fooEv");}
dd2760 ::~dd2760(){ note_dtor("dd2760", this);} // tgen
dd2760 ::dd2760(){ note_ctor("dd2760", this);} // tgen

static void Test_dd2760()
{
  extern Class_Descriptor cd_dd2760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2760, buf);
    dd2760 *dp, &lv = *(dp=new (buf) dd2760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd2760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(16,12), "dd2760");
    check_base_class_offset(lv, (cc760*), 0, "dd2760");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2760.d");
    test_class_info(&lv, &cd_dd2760);
    dp->~dd2760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2760(Test_dd2760, "dd2760", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2760C1Ev();
extern void _ZN6dd2760D1Ev();
Name_Map name_map_dd2760[] = {
  NSPAIR(_ZN6dd2760C1Ev),
  NSPAIR(_ZN6dd2760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd2760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
extern VTBL_ENTRY _ZTV6dd2760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd2760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd2760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd2760[] = {
  {&(_ZTV6dd2760[3]),  3,11},
  {&(_tg__ZTV5cc760__6dd2760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd2760[4]),  4,6},
  {&(_ZTV6dd2760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static VTBL_ENTRY alt_thunk_names412[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2760 = {  "dd2760", // class name
  bases_dd2760, 3,
  &(vtc_dd2760[0]), // expected_vtbl_contents
  &(vtt_dd2760[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2760),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names412,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02760  : dd2760 {
  int e;
  ~ee02760(); // tgen
  ee02760(); // tgen
};
//SIG(1 ee02760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee02760 ::~ee02760(){ note_dtor("ee02760", this);} // tgen
ee02760 ::ee02760(){ note_ctor("ee02760", this);} // tgen

static void Test_ee02760()
{
  extern Class_Descriptor cd_ee02760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02760, buf);
    ee02760 *dp, &lv = *(dp=new (buf) ee02760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee02760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(24,16), "ee02760");
    check_base_class_offset(lv, (cc760*)(dd2760*), 0, "ee02760");
    check_base_class_offset(lv, (dd2760*), 0, "ee02760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02760.e");
    test_class_info(&lv, &cd_ee02760);
    dp->~ee02760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02760(Test_ee02760, "ee02760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02760C1Ev();
extern void _ZN7ee02760D1Ev();
Name_Map name_map_ee02760[] = {
  NSPAIR(_ZN7ee02760C1Ev),
  NSPAIR(_ZN7ee02760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee02760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
extern VTBL_ENTRY _ZTV7ee02760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee02760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee02760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee02760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee02760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee02760[] = {
  {&(_ZTV7ee02760[3]),  3,11},
  {&(_tg__ZTV6dd2760__7ee02760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee02760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee02760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee02760[4]),  4,6},
  {&(_ZTV7ee02760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee02760[];
extern  VTBL_ENTRY _ZTV7ee02760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02760[];
static VTBL_ENTRY alt_thunk_names413[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02760 = {  "ee02760", // class name
  bases_ee02760, 4,
  &(vtc_ee02760[0]), // expected_vtbl_contents
  &(vtt_ee02760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names413,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12760  : virtual dd2760 {
  int e;
  ~ee12760(); // tgen
  ee12760(); // tgen
};
//SIG(1 ee12760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee12760 ::~ee12760(){ note_dtor("ee12760", this);} // tgen
ee12760 ::ee12760(){ note_ctor("ee12760", this);} // tgen

static void Test_ee12760()
{
  extern Class_Descriptor cd_ee12760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12760, buf);
    ee12760 *dp, &lv = *(dp=new (buf) ee12760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee12760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(32,20), "ee12760");
    check_base_class_offset(lv, (cc760*)(dd2760*), ABISELECT(16,8), "ee12760");
    check_base_class_offset(lv, (dd2760*), ABISELECT(16,8), "ee12760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12760.e");
    test_class_info(&lv, &cd_ee12760);
    dp->~ee12760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12760(Test_ee12760, "ee12760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12760C1Ev();
extern void _ZN7ee12760D1Ev();
Name_Map name_map_ee12760[] = {
  NSPAIR(_ZN7ee12760C1Ev),
  NSPAIR(_ZN7ee12760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee12760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12760[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
extern VTBL_ENTRY _ZTV7ee12760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee12760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee12760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee12760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee12760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee12760[] = {
  {&(_ZTV7ee12760[4]),  4,17},
  {&(_ZTV7ee12760[9]),  9,17},
  {&(_ZTV7ee12760[15]),  15,17},
  {&(_tg__ZTV6dd2760__7ee12760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee12760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee12760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee12760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12760[];
extern  VTBL_ENTRY _ZTV7ee12760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12760[];
static VTBL_ENTRY alt_thunk_names414[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12760 = {  "ee12760", // class name
  bases_ee12760, 4,
  &(vtc_ee12760[0]), // expected_vtbl_contents
  &(vtt_ee12760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12760),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names414,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22760  : dd2760 {
  int e;
  virtual void  foo(); // _ZN7ee227603fooEv
  ~ee22760(); // tgen
  ee22760(); // tgen
};
//SIG(1 ee22760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee22760 ::foo(){vfunc_called(this, "_ZN7ee227603fooEv");}
ee22760 ::~ee22760(){ note_dtor("ee22760", this);} // tgen
ee22760 ::ee22760(){ note_ctor("ee22760", this);} // tgen

static void Test_ee22760()
{
  extern Class_Descriptor cd_ee22760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22760, buf);
    ee22760 *dp, &lv = *(dp=new (buf) ee22760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee22760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(24,16), "ee22760");
    check_base_class_offset(lv, (cc760*)(dd2760*), 0, "ee22760");
    check_base_class_offset(lv, (dd2760*), 0, "ee22760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22760.e");
    test_class_info(&lv, &cd_ee22760);
    dp->~ee22760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22760(Test_ee22760, "ee22760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22760C1Ev();
extern void _ZN7ee22760D1Ev();
Name_Map name_map_ee22760[] = {
  NSPAIR(_ZN7ee22760C1Ev),
  NSPAIR(_ZN7ee22760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee22760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22760[];
extern void _ZN7ee227603fooEv();
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee227603fooEv,_ZTv0_n16_N7ee227603fooEv)();
extern void ABISELECT(_ZThn24_N7ee227603fooEv,_ZThn16_N7ee227603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22760[0]),
  (VTBL_ENTRY)&_ZN7ee227603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee227603fooEv,_ZTv0_n16_N7ee227603fooEv),
};
extern VTBL_ENTRY _ZTV7ee22760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee22760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee22760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee22760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee22760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee22760[] = {
  {&(_ZTV7ee22760[3]),  3,11},
  {&(_tg__ZTV6dd2760__7ee22760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee22760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee22760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee22760[4]),  4,6},
  {&(_ZTV7ee22760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee22760[];
extern  VTBL_ENTRY _ZTV7ee22760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22760[];
static VTBL_ENTRY alt_thunk_names415[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee227603fooEv,_ZTv0_n16_N7ee227603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee227603fooEv,_ZThn16_N7ee227603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22760 = {  "ee22760", // class name
  bases_ee22760, 4,
  &(vtc_ee22760[0]), // expected_vtbl_contents
  &(vtt_ee22760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names415,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32760  : virtual dd2760 {
  int e;
  virtual void  foo(); // _ZN7ee327603fooEv
  ~ee32760(); // tgen
  ee32760(); // tgen
};
//SIG(1 ee32760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee32760 ::foo(){vfunc_called(this, "_ZN7ee327603fooEv");}
ee32760 ::~ee32760(){ note_dtor("ee32760", this);} // tgen
ee32760 ::ee32760(){ note_ctor("ee32760", this);} // tgen

static void Test_ee32760()
{
  extern Class_Descriptor cd_ee32760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32760, buf);
    ee32760 *dp, &lv = *(dp=new (buf) ee32760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee32760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(32,20), "ee32760");
    check_base_class_offset(lv, (cc760*)(dd2760*), ABISELECT(16,8), "ee32760");
    check_base_class_offset(lv, (dd2760*), ABISELECT(16,8), "ee32760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32760.e");
    test_class_info(&lv, &cd_ee32760);
    dp->~ee32760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32760(Test_ee32760, "ee32760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32760C1Ev();
extern void _ZN7ee32760D1Ev();
Name_Map name_map_ee32760[] = {
  NSPAIR(_ZN7ee32760C1Ev),
  NSPAIR(_ZN7ee32760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee32760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32760[];
extern void _ZN7ee327603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee327603fooEv,_ZTv0_n16_N7ee327603fooEv)();
extern void ABISELECT(_ZThn16_N7ee327603fooEv,_ZThn8_N7ee327603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee327603fooEv,_ZTv0_n16_N7ee327603fooEv)();
extern void ABISELECT(_ZThn32_N7ee327603fooEv,_ZThn20_N7ee327603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32760[0]),
  (VTBL_ENTRY)&_ZN7ee327603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee327603fooEv,_ZTv0_n16_N7ee327603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee327603fooEv,_ZTv0_n16_N7ee327603fooEv),
};
extern VTBL_ENTRY _ZTV7ee32760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee32760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee32760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee32760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee32760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee32760[] = {
  {&(_ZTV7ee32760[4]),  4,18},
  {&(_ZTV7ee32760[10]),  10,18},
  {&(_ZTV7ee32760[16]),  16,18},
  {&(_tg__ZTV6dd2760__7ee32760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee32760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee32760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee32760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32760[];
extern  VTBL_ENTRY _ZTV7ee32760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32760[];
static VTBL_ENTRY alt_thunk_names416[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee327603fooEv,_ZTv0_n16_N7ee327603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee327603fooEv,_ZThn20_N7ee327603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee327603fooEv,_ZThn8_N7ee327603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32760 = {  "ee32760", // class name
  bases_ee32760, 4,
  &(vtc_ee32760[0]), // expected_vtbl_contents
  &(vtt_ee32760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names416,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42760  : dd2760 {
  int e;
  virtual void  bar(); // _ZN7ee427603barEv
  ~ee42760(); // tgen
  ee42760(); // tgen
};
//SIG(1 ee42760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee42760 ::bar(){vfunc_called(this, "_ZN7ee427603barEv");}
ee42760 ::~ee42760(){ note_dtor("ee42760", this);} // tgen
ee42760 ::ee42760(){ note_ctor("ee42760", this);} // tgen

static void Test_ee42760()
{
  extern Class_Descriptor cd_ee42760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42760, buf);
    ee42760 *dp, &lv = *(dp=new (buf) ee42760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee42760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(24,16), "ee42760");
    check_base_class_offset(lv, (cc760*)(dd2760*), 0, "ee42760");
    check_base_class_offset(lv, (dd2760*), 0, "ee42760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42760.e");
    test_class_info(&lv, &cd_ee42760);
    dp->~ee42760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42760(Test_ee42760, "ee42760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42760C1Ev();
extern void _ZN7ee42760D1Ev();
Name_Map name_map_ee42760[] = {
  NSPAIR(_ZN7ee42760C1Ev),
  NSPAIR(_ZN7ee42760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee42760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42760[];
extern void _ZN6dd27603fooEv();
extern void _ZN7ee427603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee427603barEv,_ZTv0_n12_N7ee427603barEv)();
extern void ABISELECT(_ZThn24_N7ee427603barEv,_ZThn16_N7ee427603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN7ee427603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee427603barEv,_ZTv0_n12_N7ee427603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
extern VTBL_ENTRY _ZTV7ee42760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee42760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee42760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee42760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee42760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee42760[] = {
  {&(_ZTV7ee42760[3]),  3,11},
  {&(_tg__ZTV6dd2760__7ee42760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee42760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee42760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee42760[4]),  4,6},
  {&(_ZTV7ee42760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42760[];
extern  VTBL_ENTRY _ZTV7ee42760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42760[];
static VTBL_ENTRY alt_thunk_names417[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee427603barEv,_ZTv0_n12_N7ee427603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee427603barEv,_ZThn16_N7ee427603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42760 = {  "ee42760", // class name
  bases_ee42760, 4,
  &(vtc_ee42760[0]), // expected_vtbl_contents
  &(vtt_ee42760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names417,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52760  : virtual dd2760 {
  int e;
  virtual void  bar(); // _ZN7ee527603barEv
  ~ee52760(); // tgen
  ee52760(); // tgen
};
//SIG(1 ee52760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee52760 ::bar(){vfunc_called(this, "_ZN7ee527603barEv");}
ee52760 ::~ee52760(){ note_dtor("ee52760", this);} // tgen
ee52760 ::ee52760(){ note_ctor("ee52760", this);} // tgen

static void Test_ee52760()
{
  extern Class_Descriptor cd_ee52760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52760, buf);
    ee52760 *dp, &lv = *(dp=new (buf) ee52760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee52760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(32,20), "ee52760");
    check_base_class_offset(lv, (cc760*)(dd2760*), ABISELECT(16,8), "ee52760");
    check_base_class_offset(lv, (dd2760*), ABISELECT(16,8), "ee52760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52760.e");
    test_class_info(&lv, &cd_ee52760);
    dp->~ee52760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52760(Test_ee52760, "ee52760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52760C1Ev();
extern void _ZN7ee52760D1Ev();
Name_Map name_map_ee52760[] = {
  NSPAIR(_ZN7ee52760C1Ev),
  NSPAIR(_ZN7ee52760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee52760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52760[];
extern void _ZN7ee527603barEv();
extern void _ZN6dd27603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee527603barEv,_ZTv0_n20_N7ee527603barEv)();
extern void ABISELECT(_ZThn16_N7ee527603barEv,_ZThn8_N7ee527603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee527603barEv,_ZTv0_n12_N7ee527603barEv)();
extern void ABISELECT(_ZThn32_N7ee527603barEv,_ZThn20_N7ee527603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52760[0]),
  (VTBL_ENTRY)&_ZN7ee527603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee527603barEv,_ZTv0_n20_N7ee527603barEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee527603barEv,_ZTv0_n12_N7ee527603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
extern VTBL_ENTRY _ZTV7ee52760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee52760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee52760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee52760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee52760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee52760[] = {
  {&(_ZTV7ee52760[4]),  4,18},
  {&(_ZTV7ee52760[10]),  10,18},
  {&(_ZTV7ee52760[16]),  16,18},
  {&(_tg__ZTV6dd2760__7ee52760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee52760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee52760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee52760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52760[];
extern  VTBL_ENTRY _ZTV7ee52760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52760[];
static VTBL_ENTRY alt_thunk_names418[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee527603barEv,_ZTv0_n12_N7ee527603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee527603barEv,_ZThn20_N7ee527603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee527603barEv,_ZTv0_n20_N7ee527603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee527603barEv,_ZThn8_N7ee527603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52760 = {  "ee52760", // class name
  bases_ee52760, 4,
  &(vtc_ee52760[0]), // expected_vtbl_contents
  &(vtt_ee52760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52760),7, //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  ee62760  : dd2760 {
  int e;
  virtual void  foo(); // _ZN7ee627603fooEv
  virtual void  bar(); // _ZN7ee627603barEv
  ~ee62760(); // tgen
  ee62760(); // tgen
};
//SIG(1 ee62760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62760 ::foo(){vfunc_called(this, "_ZN7ee627603fooEv");}
void  ee62760 ::bar(){vfunc_called(this, "_ZN7ee627603barEv");}
ee62760 ::~ee62760(){ note_dtor("ee62760", this);} // tgen
ee62760 ::ee62760(){ note_ctor("ee62760", this);} // tgen

static void Test_ee62760()
{
  extern Class_Descriptor cd_ee62760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62760, buf);
    ee62760 *dp, &lv = *(dp=new (buf) ee62760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee62760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(24,16), "ee62760");
    check_base_class_offset(lv, (cc760*)(dd2760*), 0, "ee62760");
    check_base_class_offset(lv, (dd2760*), 0, "ee62760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62760.e");
    test_class_info(&lv, &cd_ee62760);
    dp->~ee62760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62760(Test_ee62760, "ee62760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62760C1Ev();
extern void _ZN7ee62760D1Ev();
Name_Map name_map_ee62760[] = {
  NSPAIR(_ZN7ee62760C1Ev),
  NSPAIR(_ZN7ee62760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee62760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62760[];
extern void _ZN7ee627603fooEv();
extern void _ZN7ee627603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee627603barEv,_ZTv0_n12_N7ee627603barEv)();
extern void ABISELECT(_ZThn24_N7ee627603barEv,_ZThn16_N7ee627603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee627603fooEv,_ZTv0_n16_N7ee627603fooEv)();
extern void ABISELECT(_ZThn24_N7ee627603fooEv,_ZThn16_N7ee627603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62760[0]),
  (VTBL_ENTRY)&_ZN7ee627603fooEv,
  (VTBL_ENTRY)&_ZN7ee627603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee627603barEv,_ZTv0_n12_N7ee627603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee627603fooEv,_ZTv0_n16_N7ee627603fooEv),
};
extern VTBL_ENTRY _ZTV7ee62760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee62760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee62760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee62760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee62760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee62760[] = {
  {&(_ZTV7ee62760[3]),  3,11},
  {&(_tg__ZTV6dd2760__7ee62760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee62760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee62760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee62760[4]),  4,6},
  {&(_ZTV7ee62760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62760[];
extern  VTBL_ENTRY _ZTV7ee62760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62760[];
static VTBL_ENTRY alt_thunk_names419[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27603fooEv,_ZThn16_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee627603fooEv,_ZTv0_n16_N7ee627603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee627603fooEv,_ZThn16_N7ee627603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee627603barEv,_ZTv0_n12_N7ee627603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee627603barEv,_ZThn16_N7ee627603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62760 = {  "ee62760", // class name
  bases_ee62760, 4,
  &(vtc_ee62760[0]), // expected_vtbl_contents
  &(vtt_ee62760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62760),6, //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  ee72760  : virtual dd2760 {
  int e;
  virtual void  foo(); // _ZN7ee727603fooEv
  virtual void  bar(); // _ZN7ee727603barEv
  ~ee72760(); // tgen
  ee72760(); // tgen
};
//SIG(1 ee72760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72760 ::foo(){vfunc_called(this, "_ZN7ee727603fooEv");}
void  ee72760 ::bar(){vfunc_called(this, "_ZN7ee727603barEv");}
ee72760 ::~ee72760(){ note_dtor("ee72760", this);} // tgen
ee72760 ::ee72760(){ note_ctor("ee72760", this);} // tgen

static void Test_ee72760()
{
  extern Class_Descriptor cd_ee72760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72760, buf);
    ee72760 *dp, &lv = *(dp=new (buf) ee72760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee72760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd2760*), ABISELECT(32,20), "ee72760");
    check_base_class_offset(lv, (cc760*)(dd2760*), ABISELECT(16,8), "ee72760");
    check_base_class_offset(lv, (dd2760*), ABISELECT(16,8), "ee72760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72760.e");
    test_class_info(&lv, &cd_ee72760);
    dp->~ee72760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72760(Test_ee72760, "ee72760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72760C1Ev();
extern void _ZN7ee72760D1Ev();
Name_Map name_map_ee72760[] = {
  NSPAIR(_ZN7ee72760C1Ev),
  NSPAIR(_ZN7ee72760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd2760;
extern VTBL_ENTRY _ZTI6dd2760[];
extern  VTBL_ENTRY _ZTV6dd2760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2760[];
static Base_Class bases_ee72760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72760[];
extern void _ZN7ee727603fooEv();
extern void _ZN7ee727603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee727603fooEv,_ZTv0_n16_N7ee727603fooEv)();
extern void ABISELECT(_ZThn16_N7ee727603fooEv,_ZThn8_N7ee727603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee727603barEv,_ZTv0_n20_N7ee727603barEv)();
extern void ABISELECT(_ZThn16_N7ee727603barEv,_ZThn8_N7ee727603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee727603barEv,_ZTv0_n12_N7ee727603barEv)();
extern void ABISELECT(_ZThn32_N7ee727603barEv,_ZThn20_N7ee727603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee727603fooEv,_ZTv0_n16_N7ee727603fooEv)();
extern void ABISELECT(_ZThn32_N7ee727603fooEv,_ZThn20_N7ee727603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72760[0]),
  (VTBL_ENTRY)&_ZN7ee727603fooEv,
  (VTBL_ENTRY)&_ZN7ee727603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee727603fooEv,_ZTv0_n16_N7ee727603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee727603barEv,_ZTv0_n20_N7ee727603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee727603barEv,_ZTv0_n12_N7ee727603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee727603fooEv,_ZTv0_n16_N7ee727603fooEv),
};
extern VTBL_ENTRY _ZTV7ee72760[];
extern void _ZN6dd27603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV6dd2760__7ee72760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&_ZN6dd27603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd2760__7ee72760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd2760__7ee72760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv)();
extern void ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd2760__7ee72760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv),
};
static  VTT_ENTRY vtt_ee72760[] = {
  {&(_ZTV7ee72760[4]),  4,19},
  {&(_ZTV7ee72760[11]),  11,19},
  {&(_ZTV7ee72760[17]),  17,19},
  {&(_tg__ZTV6dd2760__7ee72760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd2760__7ee72760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd2760__7ee72760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd2760__7ee72760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72760[];
extern  VTBL_ENTRY _ZTV7ee72760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72760[];
static VTBL_ENTRY alt_thunk_names420[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd27603fooEv,_ZTv0_n16_N6dd27603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27603fooEv,_ZThn12_N6dd27603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee727603barEv,_ZTv0_n12_N7ee727603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee727603barEv,_ZThn20_N7ee727603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee727603barEv,_ZTv0_n20_N7ee727603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee727603barEv,_ZThn8_N7ee727603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee727603fooEv,_ZTv0_n16_N7ee727603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee727603fooEv,_ZThn20_N7ee727603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee727603fooEv,_ZThn8_N7ee727603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72760 = {  "ee72760", // class name
  bases_ee72760, 4,
  &(vtc_ee72760[0]), // expected_vtbl_contents
  &(vtt_ee72760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72760),7, //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  dd3760  : virtual cc760 {
  int d;
  virtual void  foo(); // _ZN6dd37603fooEv
  ~dd3760(); // tgen
  dd3760(); // tgen
};
//SIG(-1 dd3760) C1{ VBC2{ VBC3{ BC4{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd3760 ::foo(){vfunc_called(this, "_ZN6dd37603fooEv");}
dd3760 ::~dd3760(){ note_dtor("dd3760", this);} // tgen
dd3760 ::dd3760(){ note_ctor("dd3760", this);} // tgen

static void Test_dd3760()
{
  extern Class_Descriptor cd_dd3760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3760, buf);
    dd3760 *dp, &lv = *(dp=new (buf) dd3760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd3760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,16), "dd3760");
    check_base_class_offset(lv, (cc760*), ABISELECT(16,8), "dd3760");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3760.d");
    test_class_info(&lv, &cd_dd3760);
    dp->~dd3760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3760(Test_dd3760, "dd3760", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3760C1Ev();
extern void _ZN6dd3760D1Ev();
Name_Map name_map_dd3760[] = {
  NSPAIR(_ZN6dd3760C1Ev),
  NSPAIR(_ZN6dd3760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd3760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3760[];
extern void _ZN6dd37603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern VTBL_ENTRY _ZTV6dd3760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd3760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd3760[] = {
  {&(_ZTV6dd3760[4]),  4,18},
  {&(_ZTV6dd3760[10]),  10,18},
  {&(_ZTV6dd3760[16]),  16,18},
  {&(_tg__ZTV5cc760__6dd3760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd3760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static VTBL_ENTRY alt_thunk_names421[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3760 = {  "dd3760", // class name
  bases_dd3760, 3,
  &(vtc_dd3760[0]), // expected_vtbl_contents
  &(vtt_dd3760[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3760),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names421,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03760  : dd3760 {
  int e;
  ~ee03760(); // tgen
  ee03760(); // tgen
};
//SIG(1 ee03760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee03760 ::~ee03760(){ note_dtor("ee03760", this);} // tgen
ee03760 ::ee03760(){ note_ctor("ee03760", this);} // tgen

static void Test_ee03760()
{
  extern Class_Descriptor cd_ee03760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03760, buf);
    ee03760 *dp, &lv = *(dp=new (buf) ee03760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee03760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee03760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(16,12), "ee03760");
    check_base_class_offset(lv, (dd3760*), 0, "ee03760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03760.e");
    test_class_info(&lv, &cd_ee03760);
    dp->~ee03760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03760(Test_ee03760, "ee03760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03760C1Ev();
extern void _ZN7ee03760D1Ev();
Name_Map name_map_ee03760[] = {
  NSPAIR(_ZN7ee03760C1Ev),
  NSPAIR(_ZN7ee03760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee03760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03760[];
extern void _ZN6dd37603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern VTBL_ENTRY _ZTV7ee03760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee03760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee03760[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee03760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee03760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee03760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee03760[] = {
  {&(_ZTV7ee03760[4]),  4,18},
  {&(_tg__ZTV6dd3760__7ee03760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee03760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee03760[4]),  4,6},
  {&(_ZTV7ee03760[10]),  10,18},
  {&(_ZTV7ee03760[16]),  16,18},
  {&(_tg__ZTV5cc760__7ee03760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee03760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03760[];
extern  VTBL_ENTRY _ZTV7ee03760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03760[];
static VTBL_ENTRY alt_thunk_names422[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03760 = {  "ee03760", // class name
  bases_ee03760, 4,
  &(vtc_ee03760[0]), // expected_vtbl_contents
  &(vtt_ee03760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03760),8, //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  ee13760  : virtual dd3760 {
  int e;
  ~ee13760(); // tgen
  ee13760(); // tgen
};
//SIG(1 ee13760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee13760 ::~ee13760(){ note_dtor("ee13760", this);} // tgen
ee13760 ::ee13760(){ note_ctor("ee13760", this);} // tgen

static void Test_ee13760()
{
  extern Class_Descriptor cd_ee13760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13760, buf);
    ee13760 *dp, &lv = *(dp=new (buf) ee13760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee13760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee13760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(32,16), "ee13760");
    check_base_class_offset(lv, (dd3760*), ABISELECT(16,8), "ee13760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13760.e");
    test_class_info(&lv, &cd_ee13760);
    dp->~ee13760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13760(Test_ee13760, "ee13760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13760C1Ev();
extern void _ZN7ee13760D1Ev();
Name_Map name_map_ee13760[] = {
  NSPAIR(_ZN7ee13760C1Ev),
  NSPAIR(_ZN7ee13760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee13760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13760[];
extern void _ZN6dd37603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13760[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern VTBL_ENTRY _ZTV7ee13760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee13760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee13760[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee13760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee13760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee13760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee13760[] = {
  {&(_ZTV7ee13760[5]),  5,24},
  {&(_ZTV7ee13760[10]),  10,24},
  {&(_ZTV7ee13760[16]),  16,24},
  {&(_ZTV7ee13760[22]),  22,24},
  {&(_tg__ZTV6dd3760__7ee13760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee13760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee13760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee13760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee13760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13760[];
extern  VTBL_ENTRY _ZTV7ee13760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13760[];
static VTBL_ENTRY alt_thunk_names423[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13760 = {  "ee13760", // class name
  bases_ee13760, 4,
  &(vtc_ee13760[0]), // expected_vtbl_contents
  &(vtt_ee13760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13760),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names423,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23760  : dd3760 {
  int e;
  virtual void  foo(); // _ZN7ee237603fooEv
  ~ee23760(); // tgen
  ee23760(); // tgen
};
//SIG(1 ee23760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee23760 ::foo(){vfunc_called(this, "_ZN7ee237603fooEv");}
ee23760 ::~ee23760(){ note_dtor("ee23760", this);} // tgen
ee23760 ::ee23760(){ note_ctor("ee23760", this);} // tgen

static void Test_ee23760()
{
  extern Class_Descriptor cd_ee23760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23760, buf);
    ee23760 *dp, &lv = *(dp=new (buf) ee23760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee23760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee23760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(16,12), "ee23760");
    check_base_class_offset(lv, (dd3760*), 0, "ee23760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23760.e");
    test_class_info(&lv, &cd_ee23760);
    dp->~ee23760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23760(Test_ee23760, "ee23760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23760C1Ev();
extern void _ZN7ee23760D1Ev();
Name_Map name_map_ee23760[] = {
  NSPAIR(_ZN7ee23760C1Ev),
  NSPAIR(_ZN7ee23760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee23760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23760[];
extern void _ZN7ee237603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee237603fooEv,_ZTv0_n16_N7ee237603fooEv)();
extern void ABISELECT(_ZThn16_N7ee237603fooEv,_ZThn12_N7ee237603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee237603fooEv,_ZTv0_n16_N7ee237603fooEv)();
extern void ABISELECT(_ZThn32_N7ee237603fooEv,_ZThn20_N7ee237603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23760[0]),
  (VTBL_ENTRY)&_ZN7ee237603fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee237603fooEv,_ZTv0_n16_N7ee237603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee237603fooEv,_ZTv0_n16_N7ee237603fooEv),
};
extern VTBL_ENTRY _ZTV7ee23760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee23760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee23760[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee23760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee23760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee23760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee23760[] = {
  {&(_ZTV7ee23760[4]),  4,18},
  {&(_tg__ZTV6dd3760__7ee23760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee23760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee23760[4]),  4,6},
  {&(_ZTV7ee23760[10]),  10,18},
  {&(_ZTV7ee23760[16]),  16,18},
  {&(_tg__ZTV5cc760__7ee23760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee23760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23760[];
extern  VTBL_ENTRY _ZTV7ee23760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23760[];
static VTBL_ENTRY alt_thunk_names424[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee237603fooEv,_ZTv0_n16_N7ee237603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee237603fooEv,_ZThn20_N7ee237603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee237603fooEv,_ZThn12_N7ee237603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23760 = {  "ee23760", // class name
  bases_ee23760, 4,
  &(vtc_ee23760[0]), // expected_vtbl_contents
  &(vtt_ee23760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names424,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33760  : virtual dd3760 {
  int e;
  virtual void  foo(); // _ZN7ee337603fooEv
  ~ee33760(); // tgen
  ee33760(); // tgen
};
//SIG(1 ee33760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee33760 ::foo(){vfunc_called(this, "_ZN7ee337603fooEv");}
ee33760 ::~ee33760(){ note_dtor("ee33760", this);} // tgen
ee33760 ::ee33760(){ note_ctor("ee33760", this);} // tgen

static void Test_ee33760()
{
  extern Class_Descriptor cd_ee33760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33760, buf);
    ee33760 *dp, &lv = *(dp=new (buf) ee33760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee33760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee33760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(32,16), "ee33760");
    check_base_class_offset(lv, (dd3760*), ABISELECT(16,8), "ee33760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33760.e");
    test_class_info(&lv, &cd_ee33760);
    dp->~ee33760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33760(Test_ee33760, "ee33760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33760C1Ev();
extern void _ZN7ee33760D1Ev();
Name_Map name_map_ee33760[] = {
  NSPAIR(_ZN7ee33760C1Ev),
  NSPAIR(_ZN7ee33760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee33760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33760[];
extern void _ZN7ee337603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee337603fooEv,_ZTv0_n20_N7ee337603fooEv)();
extern void ABISELECT(_ZThn16_N7ee337603fooEv,_ZThn8_N7ee337603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee337603fooEv,_ZTv0_n16_N7ee337603fooEv)();
extern void ABISELECT(_ZThn32_N7ee337603fooEv,_ZThn16_N7ee337603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee337603fooEv,_ZTv0_n16_N7ee337603fooEv)();
extern void ABISELECT(_ZThn48_N7ee337603fooEv,_ZThn24_N7ee337603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33760[0]),
  (VTBL_ENTRY)&_ZN7ee337603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee337603fooEv,_ZTv0_n20_N7ee337603fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee337603fooEv,_ZTv0_n16_N7ee337603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee337603fooEv,_ZTv0_n16_N7ee337603fooEv),
};
extern VTBL_ENTRY _ZTV7ee33760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee33760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee33760[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee33760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee33760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee33760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee33760[] = {
  {&(_ZTV7ee33760[5]),  5,25},
  {&(_ZTV7ee33760[11]),  11,25},
  {&(_ZTV7ee33760[17]),  17,25},
  {&(_ZTV7ee33760[23]),  23,25},
  {&(_tg__ZTV6dd3760__7ee33760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee33760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee33760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee33760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee33760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33760[];
extern  VTBL_ENTRY _ZTV7ee33760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33760[];
static VTBL_ENTRY alt_thunk_names425[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee337603fooEv,_ZTv0_n16_N7ee337603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee337603fooEv,_ZThn24_N7ee337603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee337603fooEv,_ZThn16_N7ee337603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee337603fooEv,_ZTv0_n20_N7ee337603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee337603fooEv,_ZThn8_N7ee337603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33760 = {  "ee33760", // class name
  bases_ee33760, 4,
  &(vtc_ee33760[0]), // expected_vtbl_contents
  &(vtt_ee33760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33760),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names425,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43760  : dd3760 {
  int e;
  virtual void  bar(); // _ZN7ee437603barEv
  ~ee43760(); // tgen
  ee43760(); // tgen
};
//SIG(1 ee43760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee43760 ::bar(){vfunc_called(this, "_ZN7ee437603barEv");}
ee43760 ::~ee43760(){ note_dtor("ee43760", this);} // tgen
ee43760 ::ee43760(){ note_ctor("ee43760", this);} // tgen

static void Test_ee43760()
{
  extern Class_Descriptor cd_ee43760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43760, buf);
    ee43760 *dp, &lv = *(dp=new (buf) ee43760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee43760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee43760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(16,12), "ee43760");
    check_base_class_offset(lv, (dd3760*), 0, "ee43760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43760.e");
    test_class_info(&lv, &cd_ee43760);
    dp->~ee43760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43760(Test_ee43760, "ee43760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43760C1Ev();
extern void _ZN7ee43760D1Ev();
Name_Map name_map_ee43760[] = {
  NSPAIR(_ZN7ee43760C1Ev),
  NSPAIR(_ZN7ee43760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee43760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43760[];
extern void _ZN6dd37603fooEv();
extern void _ZN7ee437603barEv();
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee437603barEv,_ZTv0_n20_N7ee437603barEv)();
extern void ABISELECT(_ZThn16_N7ee437603barEv,_ZThn12_N7ee437603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee437603barEv,_ZTv0_n12_N7ee437603barEv)();
extern void ABISELECT(_ZThn32_N7ee437603barEv,_ZThn20_N7ee437603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
  (VTBL_ENTRY)&_ZN7ee437603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee437603barEv,_ZTv0_n20_N7ee437603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee437603barEv,_ZTv0_n12_N7ee437603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern VTBL_ENTRY _ZTV7ee43760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee43760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee43760[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee43760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee43760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee43760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee43760[] = {
  {&(_ZTV7ee43760[4]),  4,19},
  {&(_tg__ZTV6dd3760__7ee43760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee43760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee43760[4]),  4,6},
  {&(_ZTV7ee43760[11]),  11,19},
  {&(_ZTV7ee43760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee43760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee43760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43760[];
extern  VTBL_ENTRY _ZTV7ee43760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43760[];
static VTBL_ENTRY alt_thunk_names426[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee437603barEv,_ZTv0_n12_N7ee437603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee437603barEv,_ZThn20_N7ee437603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee437603barEv,_ZTv0_n20_N7ee437603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee437603barEv,_ZThn12_N7ee437603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43760 = {  "ee43760", // class name
  bases_ee43760, 4,
  &(vtc_ee43760[0]), // expected_vtbl_contents
  &(vtt_ee43760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names426,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53760  : virtual dd3760 {
  int e;
  virtual void  bar(); // _ZN7ee537603barEv
  ~ee53760(); // tgen
  ee53760(); // tgen
};
//SIG(1 ee53760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee53760 ::bar(){vfunc_called(this, "_ZN7ee537603barEv");}
ee53760 ::~ee53760(){ note_dtor("ee53760", this);} // tgen
ee53760 ::ee53760(){ note_ctor("ee53760", this);} // tgen

static void Test_ee53760()
{
  extern Class_Descriptor cd_ee53760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53760, buf);
    ee53760 *dp, &lv = *(dp=new (buf) ee53760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee53760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee53760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(32,16), "ee53760");
    check_base_class_offset(lv, (dd3760*), ABISELECT(16,8), "ee53760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53760.e");
    test_class_info(&lv, &cd_ee53760);
    dp->~ee53760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53760(Test_ee53760, "ee53760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53760C1Ev();
extern void _ZN7ee53760D1Ev();
Name_Map name_map_ee53760[] = {
  NSPAIR(_ZN7ee53760C1Ev),
  NSPAIR(_ZN7ee53760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee53760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53760[];
extern void _ZN7ee537603barEv();
extern void _ZN6dd37603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee537603barEv,_ZTv0_n20_N7ee537603barEv)();
extern void ABISELECT(_ZThn32_N7ee537603barEv,_ZThn16_N7ee537603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee537603barEv,_ZTv0_n12_N7ee537603barEv)();
extern void ABISELECT(_ZThn48_N7ee537603barEv,_ZThn24_N7ee537603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53760[0]),
  (VTBL_ENTRY)&_ZN7ee537603barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee537603barEv,_ZTv0_n20_N7ee537603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee537603barEv,_ZTv0_n12_N7ee537603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern VTBL_ENTRY _ZTV7ee53760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee53760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee53760[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee53760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee53760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee53760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee53760[] = {
  {&(_ZTV7ee53760[5]),  5,25},
  {&(_ZTV7ee53760[11]),  11,25},
  {&(_ZTV7ee53760[17]),  17,25},
  {&(_ZTV7ee53760[23]),  23,25},
  {&(_tg__ZTV6dd3760__7ee53760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee53760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee53760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee53760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee53760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53760[];
extern  VTBL_ENTRY _ZTV7ee53760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53760[];
static VTBL_ENTRY alt_thunk_names427[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee537603barEv,_ZTv0_n12_N7ee537603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee537603barEv,_ZThn24_N7ee537603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee537603barEv,_ZTv0_n20_N7ee537603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee537603barEv,_ZThn16_N7ee537603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53760 = {  "ee53760", // class name
  bases_ee53760, 4,
  &(vtc_ee53760[0]), // expected_vtbl_contents
  &(vtt_ee53760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53760),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names427,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63760  : dd3760 {
  int e;
  virtual void  foo(); // _ZN7ee637603fooEv
  virtual void  bar(); // _ZN7ee637603barEv
  ~ee63760(); // tgen
  ee63760(); // tgen
};
//SIG(1 ee63760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63760 ::foo(){vfunc_called(this, "_ZN7ee637603fooEv");}
void  ee63760 ::bar(){vfunc_called(this, "_ZN7ee637603barEv");}
ee63760 ::~ee63760(){ note_dtor("ee63760", this);} // tgen
ee63760 ::ee63760(){ note_ctor("ee63760", this);} // tgen

static void Test_ee63760()
{
  extern Class_Descriptor cd_ee63760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63760, buf);
    ee63760 *dp, &lv = *(dp=new (buf) ee63760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee63760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee63760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(16,12), "ee63760");
    check_base_class_offset(lv, (dd3760*), 0, "ee63760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63760.e");
    test_class_info(&lv, &cd_ee63760);
    dp->~ee63760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63760(Test_ee63760, "ee63760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63760C1Ev();
extern void _ZN7ee63760D1Ev();
Name_Map name_map_ee63760[] = {
  NSPAIR(_ZN7ee63760C1Ev),
  NSPAIR(_ZN7ee63760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee63760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63760[];
extern void _ZN7ee637603fooEv();
extern void _ZN7ee637603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee637603fooEv,_ZTv0_n16_N7ee637603fooEv)();
extern void ABISELECT(_ZThn16_N7ee637603fooEv,_ZThn12_N7ee637603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee637603barEv,_ZTv0_n20_N7ee637603barEv)();
extern void ABISELECT(_ZThn16_N7ee637603barEv,_ZThn12_N7ee637603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee637603barEv,_ZTv0_n12_N7ee637603barEv)();
extern void ABISELECT(_ZThn32_N7ee637603barEv,_ZThn20_N7ee637603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee637603fooEv,_ZTv0_n16_N7ee637603fooEv)();
extern void ABISELECT(_ZThn32_N7ee637603fooEv,_ZThn20_N7ee637603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63760[0]),
  (VTBL_ENTRY)&_ZN7ee637603fooEv,
  (VTBL_ENTRY)&_ZN7ee637603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee637603fooEv,_ZTv0_n16_N7ee637603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee637603barEv,_ZTv0_n20_N7ee637603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee637603barEv,_ZTv0_n12_N7ee637603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee637603fooEv,_ZTv0_n16_N7ee637603fooEv),
};
extern VTBL_ENTRY _ZTV7ee63760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee63760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee63760[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee63760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee63760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee63760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee63760[] = {
  {&(_ZTV7ee63760[4]),  4,19},
  {&(_tg__ZTV6dd3760__7ee63760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee63760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee63760[4]),  4,6},
  {&(_ZTV7ee63760[11]),  11,19},
  {&(_ZTV7ee63760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee63760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee63760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63760[];
extern  VTBL_ENTRY _ZTV7ee63760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63760[];
static VTBL_ENTRY alt_thunk_names428[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn20_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn12_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee637603barEv,_ZTv0_n12_N7ee637603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee637603barEv,_ZThn20_N7ee637603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee637603barEv,_ZTv0_n20_N7ee637603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee637603barEv,_ZThn12_N7ee637603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee637603fooEv,_ZTv0_n16_N7ee637603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee637603fooEv,_ZThn20_N7ee637603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee637603fooEv,_ZThn12_N7ee637603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63760 = {  "ee63760", // class name
  bases_ee63760, 4,
  &(vtc_ee63760[0]), // expected_vtbl_contents
  &(vtt_ee63760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names428,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73760  : virtual dd3760 {
  int e;
  virtual void  foo(); // _ZN7ee737603fooEv
  virtual void  bar(); // _ZN7ee737603barEv
  ~ee73760(); // tgen
  ee73760(); // tgen
};
//SIG(1 ee73760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73760 ::foo(){vfunc_called(this, "_ZN7ee737603fooEv");}
void  ee73760 ::bar(){vfunc_called(this, "_ZN7ee737603barEv");}
ee73760 ::~ee73760(){ note_dtor("ee73760", this);} // tgen
ee73760 ::ee73760(){ note_ctor("ee73760", this);} // tgen

static void Test_ee73760()
{
  extern Class_Descriptor cd_ee73760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73760, buf);
    ee73760 *dp, &lv = *(dp=new (buf) ee73760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee73760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee73760");
    check_base_class_offset(lv, (cc760*)(dd3760*), ABISELECT(32,16), "ee73760");
    check_base_class_offset(lv, (dd3760*), ABISELECT(16,8), "ee73760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73760.e");
    test_class_info(&lv, &cd_ee73760);
    dp->~ee73760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73760(Test_ee73760, "ee73760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73760C1Ev();
extern void _ZN7ee73760D1Ev();
Name_Map name_map_ee73760[] = {
  NSPAIR(_ZN7ee73760C1Ev),
  NSPAIR(_ZN7ee73760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd3760;
extern VTBL_ENTRY _ZTI6dd3760[];
extern  VTBL_ENTRY _ZTV6dd3760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3760[];
static Base_Class bases_ee73760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee73760[];
extern void _ZN7ee737603fooEv();
extern void _ZN7ee737603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee737603fooEv,_ZTv0_n20_N7ee737603fooEv)();
extern void ABISELECT(_ZThn16_N7ee737603fooEv,_ZThn8_N7ee737603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee737603fooEv,_ZTv0_n16_N7ee737603fooEv)();
extern void ABISELECT(_ZThn32_N7ee737603fooEv,_ZThn16_N7ee737603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee737603barEv,_ZTv0_n20_N7ee737603barEv)();
extern void ABISELECT(_ZThn32_N7ee737603barEv,_ZThn16_N7ee737603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee737603barEv,_ZTv0_n12_N7ee737603barEv)();
extern void ABISELECT(_ZThn48_N7ee737603barEv,_ZThn24_N7ee737603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee737603fooEv,_ZTv0_n16_N7ee737603fooEv)();
extern void ABISELECT(_ZThn48_N7ee737603fooEv,_ZThn24_N7ee737603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73760[0]),
  (VTBL_ENTRY)&_ZN7ee737603fooEv,
  (VTBL_ENTRY)&_ZN7ee737603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee737603fooEv,_ZTv0_n20_N7ee737603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee737603fooEv,_ZTv0_n16_N7ee737603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee737603barEv,_ZTv0_n20_N7ee737603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee737603barEv,_ZTv0_n12_N7ee737603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee737603fooEv,_ZTv0_n16_N7ee737603fooEv),
};
extern VTBL_ENTRY _ZTV7ee73760[];
extern void _ZN6dd37603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3760__7ee73760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&_ZN6dd37603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv)() __attribute__((weak));
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd3760__7ee73760[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv)();
extern void ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd3760__7ee73760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee73760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee73760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee73760[] = {
  {&(_ZTV7ee73760[5]),  5,26},
  {&(_ZTV7ee73760[12]),  12,26},
  {&(_ZTV7ee73760[18]),  18,26},
  {&(_ZTV7ee73760[24]),  24,26},
  {&(_tg__ZTV6dd3760__7ee73760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd3760__7ee73760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd3760__7ee73760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee73760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee73760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73760[];
extern  VTBL_ENTRY _ZTV7ee73760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73760[];
static VTBL_ENTRY alt_thunk_names429[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37603fooEv,_ZTv0_n16_N6dd37603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37603fooEv,_ZThn16_N6dd37603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37603fooEv,_ZThn8_N6dd37603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee737603barEv,_ZTv0_n12_N7ee737603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee737603barEv,_ZThn24_N7ee737603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee737603barEv,_ZTv0_n20_N7ee737603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee737603barEv,_ZThn16_N7ee737603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee737603fooEv,_ZTv0_n16_N7ee737603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee737603fooEv,_ZThn24_N7ee737603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee737603fooEv,_ZThn16_N7ee737603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee737603fooEv,_ZTv0_n20_N7ee737603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee737603fooEv,_ZThn8_N7ee737603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73760 = {  "ee73760", // class name
  bases_ee73760, 4,
  &(vtc_ee73760[0]), // expected_vtbl_contents
  &(vtt_ee73760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73760),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names429,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4760  : cc760 {
  int d;
  virtual void  bar(); // _ZN6dd47603barEv
  ~dd4760(); // tgen
  dd4760(); // tgen
};
//SIG(-1 dd4760) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd4760 ::bar(){vfunc_called(this, "_ZN6dd47603barEv");}
dd4760 ::~dd4760(){ note_dtor("dd4760", this);} // tgen
dd4760 ::dd4760(){ note_ctor("dd4760", this);} // tgen

static void Test_dd4760()
{
  extern Class_Descriptor cd_dd4760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4760, buf);
    dd4760 *dp, &lv = *(dp=new (buf) dd4760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd4760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(16,12), "dd4760");
    check_base_class_offset(lv, (cc760*), 0, "dd4760");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4760.d");
    test_class_info(&lv, &cd_dd4760);
    dp->~dd4760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4760(Test_dd4760, "dd4760", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4760C1Ev();
extern void _ZN6dd4760D1Ev();
Name_Map name_map_dd4760[] = {
  NSPAIR(_ZN6dd4760C1Ev),
  NSPAIR(_ZN6dd4760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd4760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV6dd4760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd4760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd4760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd4760[] = {
  {&(_ZTV6dd4760[3]),  3,11},
  {&(_tg__ZTV5cc760__6dd4760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd4760[4]),  4,6},
  {&(_ZTV6dd4760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static VTBL_ENTRY alt_thunk_names430[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4760 = {  "dd4760", // class name
  bases_dd4760, 3,
  &(vtc_dd4760[0]), // expected_vtbl_contents
  &(vtt_dd4760[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4760),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names430,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04760  : dd4760 {
  int e;
  ~ee04760(); // tgen
  ee04760(); // tgen
};
//SIG(1 ee04760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee04760 ::~ee04760(){ note_dtor("ee04760", this);} // tgen
ee04760 ::ee04760(){ note_ctor("ee04760", this);} // tgen

static void Test_ee04760()
{
  extern Class_Descriptor cd_ee04760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04760, buf);
    ee04760 *dp, &lv = *(dp=new (buf) ee04760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee04760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(24,16), "ee04760");
    check_base_class_offset(lv, (cc760*)(dd4760*), 0, "ee04760");
    check_base_class_offset(lv, (dd4760*), 0, "ee04760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04760.e");
    test_class_info(&lv, &cd_ee04760);
    dp->~ee04760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04760(Test_ee04760, "ee04760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04760C1Ev();
extern void _ZN7ee04760D1Ev();
Name_Map name_map_ee04760[] = {
  NSPAIR(_ZN7ee04760C1Ev),
  NSPAIR(_ZN7ee04760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee04760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee04760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee04760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee04760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee04760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee04760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee04760[] = {
  {&(_ZTV7ee04760[3]),  3,11},
  {&(_tg__ZTV6dd4760__7ee04760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee04760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee04760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee04760[4]),  4,6},
  {&(_ZTV7ee04760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee04760[];
extern  VTBL_ENTRY _ZTV7ee04760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04760[];
static VTBL_ENTRY alt_thunk_names431[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04760 = {  "ee04760", // class name
  bases_ee04760, 4,
  &(vtc_ee04760[0]), // expected_vtbl_contents
  &(vtt_ee04760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names431,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14760  : virtual dd4760 {
  int e;
  ~ee14760(); // tgen
  ee14760(); // tgen
};
//SIG(1 ee14760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee14760 ::~ee14760(){ note_dtor("ee14760", this);} // tgen
ee14760 ::ee14760(){ note_ctor("ee14760", this);} // tgen

static void Test_ee14760()
{
  extern Class_Descriptor cd_ee14760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14760, buf);
    ee14760 *dp, &lv = *(dp=new (buf) ee14760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee14760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(32,20), "ee14760");
    check_base_class_offset(lv, (cc760*)(dd4760*), ABISELECT(16,8), "ee14760");
    check_base_class_offset(lv, (dd4760*), ABISELECT(16,8), "ee14760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14760.e");
    test_class_info(&lv, &cd_ee14760);
    dp->~ee14760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14760(Test_ee14760, "ee14760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14760C1Ev();
extern void _ZN7ee14760D1Ev();
Name_Map name_map_ee14760[] = {
  NSPAIR(_ZN7ee14760C1Ev),
  NSPAIR(_ZN7ee14760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee14760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14760[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee14760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee14760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee14760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee14760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee14760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee14760[] = {
  {&(_ZTV7ee14760[4]),  4,17},
  {&(_ZTV7ee14760[9]),  9,17},
  {&(_ZTV7ee14760[15]),  15,17},
  {&(_tg__ZTV6dd4760__7ee14760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee14760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee14760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee14760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14760[];
extern  VTBL_ENTRY _ZTV7ee14760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14760[];
static VTBL_ENTRY alt_thunk_names432[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14760 = {  "ee14760", // class name
  bases_ee14760, 4,
  &(vtc_ee14760[0]), // expected_vtbl_contents
  &(vtt_ee14760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14760),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names432,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24760  : dd4760 {
  int e;
  virtual void  foo(); // _ZN7ee247603fooEv
  ~ee24760(); // tgen
  ee24760(); // tgen
};
//SIG(1 ee24760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee24760 ::foo(){vfunc_called(this, "_ZN7ee247603fooEv");}
ee24760 ::~ee24760(){ note_dtor("ee24760", this);} // tgen
ee24760 ::ee24760(){ note_ctor("ee24760", this);} // tgen

static void Test_ee24760()
{
  extern Class_Descriptor cd_ee24760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24760, buf);
    ee24760 *dp, &lv = *(dp=new (buf) ee24760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee24760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(24,16), "ee24760");
    check_base_class_offset(lv, (cc760*)(dd4760*), 0, "ee24760");
    check_base_class_offset(lv, (dd4760*), 0, "ee24760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24760.e");
    test_class_info(&lv, &cd_ee24760);
    dp->~ee24760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24760(Test_ee24760, "ee24760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24760C1Ev();
extern void _ZN7ee24760D1Ev();
Name_Map name_map_ee24760[] = {
  NSPAIR(_ZN7ee24760C1Ev),
  NSPAIR(_ZN7ee24760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee24760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24760[];
extern void _ZN7ee247603fooEv();
extern void _ZN6dd47603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee247603fooEv,_ZTv0_n16_N7ee247603fooEv)();
extern void ABISELECT(_ZThn24_N7ee247603fooEv,_ZThn16_N7ee247603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24760[0]),
  (VTBL_ENTRY)&_ZN7ee247603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee247603fooEv,_ZTv0_n16_N7ee247603fooEv),
};
extern VTBL_ENTRY _ZTV7ee24760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee24760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee24760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee24760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee24760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee24760[] = {
  {&(_ZTV7ee24760[3]),  3,11},
  {&(_tg__ZTV6dd4760__7ee24760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee24760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee24760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee24760[4]),  4,6},
  {&(_ZTV7ee24760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24760[];
extern  VTBL_ENTRY _ZTV7ee24760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24760[];
static VTBL_ENTRY alt_thunk_names433[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee247603fooEv,_ZTv0_n16_N7ee247603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee247603fooEv,_ZThn16_N7ee247603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24760 = {  "ee24760", // class name
  bases_ee24760, 4,
  &(vtc_ee24760[0]), // expected_vtbl_contents
  &(vtt_ee24760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names433,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34760  : virtual dd4760 {
  int e;
  virtual void  foo(); // _ZN7ee347603fooEv
  ~ee34760(); // tgen
  ee34760(); // tgen
};
//SIG(1 ee34760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee34760 ::foo(){vfunc_called(this, "_ZN7ee347603fooEv");}
ee34760 ::~ee34760(){ note_dtor("ee34760", this);} // tgen
ee34760 ::ee34760(){ note_ctor("ee34760", this);} // tgen

static void Test_ee34760()
{
  extern Class_Descriptor cd_ee34760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34760, buf);
    ee34760 *dp, &lv = *(dp=new (buf) ee34760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee34760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(32,20), "ee34760");
    check_base_class_offset(lv, (cc760*)(dd4760*), ABISELECT(16,8), "ee34760");
    check_base_class_offset(lv, (dd4760*), ABISELECT(16,8), "ee34760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34760.e");
    test_class_info(&lv, &cd_ee34760);
    dp->~ee34760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34760(Test_ee34760, "ee34760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34760C1Ev();
extern void _ZN7ee34760D1Ev();
Name_Map name_map_ee34760[] = {
  NSPAIR(_ZN7ee34760C1Ev),
  NSPAIR(_ZN7ee34760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee34760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34760[];
extern void _ZN7ee347603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee347603fooEv,_ZTv0_n16_N7ee347603fooEv)();
extern void ABISELECT(_ZThn16_N7ee347603fooEv,_ZThn8_N7ee347603fooEv)() __attribute__((weak));
extern void _ZN6dd47603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee347603fooEv,_ZTv0_n16_N7ee347603fooEv)();
extern void ABISELECT(_ZThn32_N7ee347603fooEv,_ZThn20_N7ee347603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34760[0]),
  (VTBL_ENTRY)&_ZN7ee347603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee347603fooEv,_ZTv0_n16_N7ee347603fooEv),
  (VTBL_ENTRY)&_ZN6dd47603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee347603fooEv,_ZTv0_n16_N7ee347603fooEv),
};
extern VTBL_ENTRY _ZTV7ee34760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee34760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee34760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee34760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee34760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee34760[] = {
  {&(_ZTV7ee34760[4]),  4,18},
  {&(_ZTV7ee34760[10]),  10,18},
  {&(_ZTV7ee34760[16]),  16,18},
  {&(_tg__ZTV6dd4760__7ee34760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee34760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee34760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee34760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34760[];
extern  VTBL_ENTRY _ZTV7ee34760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34760[];
static VTBL_ENTRY alt_thunk_names434[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee347603fooEv,_ZTv0_n16_N7ee347603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee347603fooEv,_ZThn20_N7ee347603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee347603fooEv,_ZThn8_N7ee347603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34760 = {  "ee34760", // class name
  bases_ee34760, 4,
  &(vtc_ee34760[0]), // expected_vtbl_contents
  &(vtt_ee34760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names434,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44760  : dd4760 {
  int e;
  virtual void  bar(); // _ZN7ee447603barEv
  ~ee44760(); // tgen
  ee44760(); // tgen
};
//SIG(1 ee44760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee44760 ::bar(){vfunc_called(this, "_ZN7ee447603barEv");}
ee44760 ::~ee44760(){ note_dtor("ee44760", this);} // tgen
ee44760 ::ee44760(){ note_ctor("ee44760", this);} // tgen

static void Test_ee44760()
{
  extern Class_Descriptor cd_ee44760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44760, buf);
    ee44760 *dp, &lv = *(dp=new (buf) ee44760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee44760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(24,16), "ee44760");
    check_base_class_offset(lv, (cc760*)(dd4760*), 0, "ee44760");
    check_base_class_offset(lv, (dd4760*), 0, "ee44760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44760.e");
    test_class_info(&lv, &cd_ee44760);
    dp->~ee44760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44760(Test_ee44760, "ee44760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44760C1Ev();
extern void _ZN7ee44760D1Ev();
Name_Map name_map_ee44760[] = {
  NSPAIR(_ZN7ee44760C1Ev),
  NSPAIR(_ZN7ee44760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee44760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44760[];
extern void _ZN5cc7603fooEv();
extern void _ZN7ee447603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee447603barEv,_ZTv0_n12_N7ee447603barEv)();
extern void ABISELECT(_ZThn24_N7ee447603barEv,_ZThn16_N7ee447603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN7ee447603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee447603barEv,_ZTv0_n12_N7ee447603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee44760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee44760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee44760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee44760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee44760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee44760[] = {
  {&(_ZTV7ee44760[3]),  3,11},
  {&(_tg__ZTV6dd4760__7ee44760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee44760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee44760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee44760[4]),  4,6},
  {&(_ZTV7ee44760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee44760[];
extern  VTBL_ENTRY _ZTV7ee44760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44760[];
static VTBL_ENTRY alt_thunk_names435[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee447603barEv,_ZTv0_n12_N7ee447603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee447603barEv,_ZThn16_N7ee447603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44760 = {  "ee44760", // class name
  bases_ee44760, 4,
  &(vtc_ee44760[0]), // expected_vtbl_contents
  &(vtt_ee44760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names435,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54760  : virtual dd4760 {
  int e;
  virtual void  bar(); // _ZN7ee547603barEv
  ~ee54760(); // tgen
  ee54760(); // tgen
};
//SIG(1 ee54760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee54760 ::bar(){vfunc_called(this, "_ZN7ee547603barEv");}
ee54760 ::~ee54760(){ note_dtor("ee54760", this);} // tgen
ee54760 ::ee54760(){ note_ctor("ee54760", this);} // tgen

static void Test_ee54760()
{
  extern Class_Descriptor cd_ee54760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54760, buf);
    ee54760 *dp, &lv = *(dp=new (buf) ee54760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee54760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(32,20), "ee54760");
    check_base_class_offset(lv, (cc760*)(dd4760*), ABISELECT(16,8), "ee54760");
    check_base_class_offset(lv, (dd4760*), ABISELECT(16,8), "ee54760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54760.e");
    test_class_info(&lv, &cd_ee54760);
    dp->~ee54760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54760(Test_ee54760, "ee54760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54760C1Ev();
extern void _ZN7ee54760D1Ev();
Name_Map name_map_ee54760[] = {
  NSPAIR(_ZN7ee54760C1Ev),
  NSPAIR(_ZN7ee54760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee54760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54760[];
extern void _ZN7ee547603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee547603barEv,_ZTv0_n20_N7ee547603barEv)();
extern void ABISELECT(_ZThn16_N7ee547603barEv,_ZThn8_N7ee547603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee547603barEv,_ZTv0_n12_N7ee547603barEv)();
extern void ABISELECT(_ZThn32_N7ee547603barEv,_ZThn20_N7ee547603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54760[0]),
  (VTBL_ENTRY)&_ZN7ee547603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee547603barEv,_ZTv0_n20_N7ee547603barEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee547603barEv,_ZTv0_n12_N7ee547603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee54760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee54760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee54760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee54760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee54760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee54760[] = {
  {&(_ZTV7ee54760[4]),  4,18},
  {&(_ZTV7ee54760[10]),  10,18},
  {&(_ZTV7ee54760[16]),  16,18},
  {&(_tg__ZTV6dd4760__7ee54760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee54760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee54760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee54760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54760[];
extern  VTBL_ENTRY _ZTV7ee54760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54760[];
static VTBL_ENTRY alt_thunk_names436[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee547603barEv,_ZTv0_n12_N7ee547603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee547603barEv,_ZThn20_N7ee547603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee547603barEv,_ZTv0_n20_N7ee547603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee547603barEv,_ZThn8_N7ee547603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54760 = {  "ee54760", // class name
  bases_ee54760, 4,
  &(vtc_ee54760[0]), // expected_vtbl_contents
  &(vtt_ee54760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54760),7, //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  ee64760  : dd4760 {
  int e;
  virtual void  foo(); // _ZN7ee647603fooEv
  virtual void  bar(); // _ZN7ee647603barEv
  ~ee64760(); // tgen
  ee64760(); // tgen
};
//SIG(1 ee64760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64760 ::foo(){vfunc_called(this, "_ZN7ee647603fooEv");}
void  ee64760 ::bar(){vfunc_called(this, "_ZN7ee647603barEv");}
ee64760 ::~ee64760(){ note_dtor("ee64760", this);} // tgen
ee64760 ::ee64760(){ note_ctor("ee64760", this);} // tgen

static void Test_ee64760()
{
  extern Class_Descriptor cd_ee64760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64760, buf);
    ee64760 *dp, &lv = *(dp=new (buf) ee64760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee64760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(24,16), "ee64760");
    check_base_class_offset(lv, (cc760*)(dd4760*), 0, "ee64760");
    check_base_class_offset(lv, (dd4760*), 0, "ee64760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64760.e");
    test_class_info(&lv, &cd_ee64760);
    dp->~ee64760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64760(Test_ee64760, "ee64760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64760C1Ev();
extern void _ZN7ee64760D1Ev();
Name_Map name_map_ee64760[] = {
  NSPAIR(_ZN7ee64760C1Ev),
  NSPAIR(_ZN7ee64760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee64760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64760[];
extern void _ZN7ee647603fooEv();
extern void _ZN7ee647603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee647603barEv,_ZTv0_n12_N7ee647603barEv)();
extern void ABISELECT(_ZThn24_N7ee647603barEv,_ZThn16_N7ee647603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee647603fooEv,_ZTv0_n16_N7ee647603fooEv)();
extern void ABISELECT(_ZThn24_N7ee647603fooEv,_ZThn16_N7ee647603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64760[0]),
  (VTBL_ENTRY)&_ZN7ee647603fooEv,
  (VTBL_ENTRY)&_ZN7ee647603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee647603barEv,_ZTv0_n12_N7ee647603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee647603fooEv,_ZTv0_n16_N7ee647603fooEv),
};
extern VTBL_ENTRY _ZTV7ee64760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee64760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee64760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee64760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee64760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee64760[] = {
  {&(_ZTV7ee64760[3]),  3,11},
  {&(_tg__ZTV6dd4760__7ee64760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee64760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee64760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee64760[4]),  4,6},
  {&(_ZTV7ee64760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64760[];
extern  VTBL_ENTRY _ZTV7ee64760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64760[];
static VTBL_ENTRY alt_thunk_names437[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47603barEv,_ZThn16_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee647603fooEv,_ZTv0_n16_N7ee647603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee647603fooEv,_ZThn16_N7ee647603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee647603barEv,_ZTv0_n12_N7ee647603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee647603barEv,_ZThn16_N7ee647603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64760 = {  "ee64760", // class name
  bases_ee64760, 4,
  &(vtc_ee64760[0]), // expected_vtbl_contents
  &(vtt_ee64760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64760),6, //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  ee74760  : virtual dd4760 {
  int e;
  virtual void  foo(); // _ZN7ee747603fooEv
  virtual void  bar(); // _ZN7ee747603barEv
  ~ee74760(); // tgen
  ee74760(); // tgen
};
//SIG(1 ee74760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74760 ::foo(){vfunc_called(this, "_ZN7ee747603fooEv");}
void  ee74760 ::bar(){vfunc_called(this, "_ZN7ee747603barEv");}
ee74760 ::~ee74760(){ note_dtor("ee74760", this);} // tgen
ee74760 ::ee74760(){ note_ctor("ee74760", this);} // tgen

static void Test_ee74760()
{
  extern Class_Descriptor cd_ee74760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74760, buf);
    ee74760 *dp, &lv = *(dp=new (buf) ee74760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee74760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd4760*), ABISELECT(32,20), "ee74760");
    check_base_class_offset(lv, (cc760*)(dd4760*), ABISELECT(16,8), "ee74760");
    check_base_class_offset(lv, (dd4760*), ABISELECT(16,8), "ee74760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74760.e");
    test_class_info(&lv, &cd_ee74760);
    dp->~ee74760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74760(Test_ee74760, "ee74760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74760C1Ev();
extern void _ZN7ee74760D1Ev();
Name_Map name_map_ee74760[] = {
  NSPAIR(_ZN7ee74760C1Ev),
  NSPAIR(_ZN7ee74760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd4760;
extern VTBL_ENTRY _ZTI6dd4760[];
extern  VTBL_ENTRY _ZTV6dd4760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4760[];
static Base_Class bases_ee74760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74760[];
extern void _ZN7ee747603fooEv();
extern void _ZN7ee747603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee747603fooEv,_ZTv0_n16_N7ee747603fooEv)();
extern void ABISELECT(_ZThn16_N7ee747603fooEv,_ZThn8_N7ee747603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee747603barEv,_ZTv0_n20_N7ee747603barEv)();
extern void ABISELECT(_ZThn16_N7ee747603barEv,_ZThn8_N7ee747603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee747603barEv,_ZTv0_n12_N7ee747603barEv)();
extern void ABISELECT(_ZThn32_N7ee747603barEv,_ZThn20_N7ee747603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee747603fooEv,_ZTv0_n16_N7ee747603fooEv)();
extern void ABISELECT(_ZThn32_N7ee747603fooEv,_ZThn20_N7ee747603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74760[0]),
  (VTBL_ENTRY)&_ZN7ee747603fooEv,
  (VTBL_ENTRY)&_ZN7ee747603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee747603fooEv,_ZTv0_n16_N7ee747603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee747603barEv,_ZTv0_n20_N7ee747603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee747603barEv,_ZTv0_n12_N7ee747603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee747603fooEv,_ZTv0_n16_N7ee747603fooEv),
};
extern VTBL_ENTRY _ZTV7ee74760[];
extern void _ZN5cc7603fooEv();
extern void _ZN6dd47603barEv();
static  VTBL_ENTRY _tg__ZTV6dd4760__7ee74760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN6dd47603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd4760__7ee74760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd4760__7ee74760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv)();
extern void ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd4760__7ee74760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee74760[] = {
  {&(_ZTV7ee74760[4]),  4,19},
  {&(_ZTV7ee74760[11]),  11,19},
  {&(_ZTV7ee74760[17]),  17,19},
  {&(_tg__ZTV6dd4760__7ee74760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd4760__7ee74760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd4760__7ee74760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd4760__7ee74760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74760[];
extern  VTBL_ENTRY _ZTV7ee74760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74760[];
static VTBL_ENTRY alt_thunk_names438[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd47603barEv,_ZTv0_n12_N6dd47603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47603barEv,_ZThn12_N6dd47603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee747603barEv,_ZTv0_n12_N7ee747603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee747603barEv,_ZThn20_N7ee747603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee747603barEv,_ZTv0_n20_N7ee747603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee747603barEv,_ZThn8_N7ee747603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee747603fooEv,_ZTv0_n16_N7ee747603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee747603fooEv,_ZThn20_N7ee747603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee747603fooEv,_ZThn8_N7ee747603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74760 = {  "ee74760", // class name
  bases_ee74760, 4,
  &(vtc_ee74760[0]), // expected_vtbl_contents
  &(vtt_ee74760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74760),7, //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  dd5760  : virtual cc760 {
  int d;
  virtual void  bar(); // _ZN6dd57603barEv
  ~dd5760(); // tgen
  dd5760(); // tgen
};
//SIG(-1 dd5760) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd5760 ::bar(){vfunc_called(this, "_ZN6dd57603barEv");}
dd5760 ::~dd5760(){ note_dtor("dd5760", this);} // tgen
dd5760 ::dd5760(){ note_ctor("dd5760", this);} // tgen

static void Test_dd5760()
{
  extern Class_Descriptor cd_dd5760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5760, buf);
    dd5760 *dp, &lv = *(dp=new (buf) dd5760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd5760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,16), "dd5760");
    check_base_class_offset(lv, (cc760*), ABISELECT(16,8), "dd5760");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5760.d");
    test_class_info(&lv, &cd_dd5760);
    dp->~dd5760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5760(Test_dd5760, "dd5760", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5760C1Ev();
extern void _ZN6dd5760D1Ev();
Name_Map name_map_dd5760[] = {
  NSPAIR(_ZN6dd5760C1Ev),
  NSPAIR(_ZN6dd5760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd5760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5760[];
extern void _ZN6dd57603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV6dd5760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd5760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd5760[] = {
  {&(_ZTV6dd5760[4]),  4,18},
  {&(_ZTV6dd5760[10]),  10,18},
  {&(_ZTV6dd5760[16]),  16,18},
  {&(_tg__ZTV5cc760__6dd5760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd5760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static VTBL_ENTRY alt_thunk_names439[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5760 = {  "dd5760", // class name
  bases_dd5760, 3,
  &(vtc_dd5760[0]), // expected_vtbl_contents
  &(vtt_dd5760[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5760),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names439,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05760  : dd5760 {
  int e;
  ~ee05760(); // tgen
  ee05760(); // tgen
};
//SIG(1 ee05760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee05760 ::~ee05760(){ note_dtor("ee05760", this);} // tgen
ee05760 ::ee05760(){ note_ctor("ee05760", this);} // tgen

static void Test_ee05760()
{
  extern Class_Descriptor cd_ee05760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05760, buf);
    ee05760 *dp, &lv = *(dp=new (buf) ee05760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee05760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee05760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(16,12), "ee05760");
    check_base_class_offset(lv, (dd5760*), 0, "ee05760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05760.e");
    test_class_info(&lv, &cd_ee05760);
    dp->~ee05760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05760(Test_ee05760, "ee05760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05760C1Ev();
extern void _ZN7ee05760D1Ev();
Name_Map name_map_ee05760[] = {
  NSPAIR(_ZN7ee05760C1Ev),
  NSPAIR(_ZN7ee05760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee05760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05760[];
extern void _ZN6dd57603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee05760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee05760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee05760[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee05760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee05760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee05760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee05760[] = {
  {&(_ZTV7ee05760[4]),  4,18},
  {&(_tg__ZTV6dd5760__7ee05760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee05760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee05760[4]),  4,6},
  {&(_ZTV7ee05760[10]),  10,18},
  {&(_ZTV7ee05760[16]),  16,18},
  {&(_tg__ZTV5cc760__7ee05760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee05760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05760[];
extern  VTBL_ENTRY _ZTV7ee05760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05760[];
static VTBL_ENTRY alt_thunk_names440[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05760 = {  "ee05760", // class name
  bases_ee05760, 4,
  &(vtc_ee05760[0]), // expected_vtbl_contents
  &(vtt_ee05760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05760),8, //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  ee15760  : virtual dd5760 {
  int e;
  ~ee15760(); // tgen
  ee15760(); // tgen
};
//SIG(1 ee15760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee15760 ::~ee15760(){ note_dtor("ee15760", this);} // tgen
ee15760 ::ee15760(){ note_ctor("ee15760", this);} // tgen

static void Test_ee15760()
{
  extern Class_Descriptor cd_ee15760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15760, buf);
    ee15760 *dp, &lv = *(dp=new (buf) ee15760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee15760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee15760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(32,16), "ee15760");
    check_base_class_offset(lv, (dd5760*), ABISELECT(16,8), "ee15760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15760.e");
    test_class_info(&lv, &cd_ee15760);
    dp->~ee15760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15760(Test_ee15760, "ee15760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15760C1Ev();
extern void _ZN7ee15760D1Ev();
Name_Map name_map_ee15760[] = {
  NSPAIR(_ZN7ee15760C1Ev),
  NSPAIR(_ZN7ee15760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee15760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15760[];
extern void _ZN6dd57603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15760[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee15760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee15760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee15760[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee15760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee15760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee15760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee15760[] = {
  {&(_ZTV7ee15760[5]),  5,24},
  {&(_ZTV7ee15760[10]),  10,24},
  {&(_ZTV7ee15760[16]),  16,24},
  {&(_ZTV7ee15760[22]),  22,24},
  {&(_tg__ZTV6dd5760__7ee15760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee15760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee15760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee15760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee15760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15760[];
extern  VTBL_ENTRY _ZTV7ee15760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15760[];
static VTBL_ENTRY alt_thunk_names441[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15760 = {  "ee15760", // class name
  bases_ee15760, 4,
  &(vtc_ee15760[0]), // expected_vtbl_contents
  &(vtt_ee15760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15760),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names441,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25760  : dd5760 {
  int e;
  virtual void  foo(); // _ZN7ee257603fooEv
  ~ee25760(); // tgen
  ee25760(); // tgen
};
//SIG(1 ee25760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee25760 ::foo(){vfunc_called(this, "_ZN7ee257603fooEv");}
ee25760 ::~ee25760(){ note_dtor("ee25760", this);} // tgen
ee25760 ::ee25760(){ note_ctor("ee25760", this);} // tgen

static void Test_ee25760()
{
  extern Class_Descriptor cd_ee25760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25760, buf);
    ee25760 *dp, &lv = *(dp=new (buf) ee25760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee25760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee25760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(16,12), "ee25760");
    check_base_class_offset(lv, (dd5760*), 0, "ee25760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25760.e");
    test_class_info(&lv, &cd_ee25760);
    dp->~ee25760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25760(Test_ee25760, "ee25760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25760C1Ev();
extern void _ZN7ee25760D1Ev();
Name_Map name_map_ee25760[] = {
  NSPAIR(_ZN7ee25760C1Ev),
  NSPAIR(_ZN7ee25760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee25760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25760[];
extern void _ZN6dd57603barEv();
extern void _ZN7ee257603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee257603fooEv,_ZTv0_n16_N7ee257603fooEv)();
extern void ABISELECT(_ZThn16_N7ee257603fooEv,_ZThn12_N7ee257603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee257603fooEv,_ZTv0_n16_N7ee257603fooEv)();
extern void ABISELECT(_ZThn32_N7ee257603fooEv,_ZThn20_N7ee257603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
  (VTBL_ENTRY)&_ZN7ee257603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee257603fooEv,_ZTv0_n16_N7ee257603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee257603fooEv,_ZTv0_n16_N7ee257603fooEv),
};
extern VTBL_ENTRY _ZTV7ee25760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee25760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee25760[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee25760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee25760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee25760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee25760[] = {
  {&(_ZTV7ee25760[4]),  4,19},
  {&(_tg__ZTV6dd5760__7ee25760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee25760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee25760[4]),  4,6},
  {&(_ZTV7ee25760[11]),  11,19},
  {&(_ZTV7ee25760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee25760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee25760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25760[];
extern  VTBL_ENTRY _ZTV7ee25760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25760[];
static VTBL_ENTRY alt_thunk_names442[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee257603fooEv,_ZTv0_n16_N7ee257603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee257603fooEv,_ZThn20_N7ee257603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee257603fooEv,_ZThn12_N7ee257603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25760 = {  "ee25760", // class name
  bases_ee25760, 4,
  &(vtc_ee25760[0]), // expected_vtbl_contents
  &(vtt_ee25760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names442,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35760  : virtual dd5760 {
  int e;
  virtual void  foo(); // _ZN7ee357603fooEv
  ~ee35760(); // tgen
  ee35760(); // tgen
};
//SIG(1 ee35760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee35760 ::foo(){vfunc_called(this, "_ZN7ee357603fooEv");}
ee35760 ::~ee35760(){ note_dtor("ee35760", this);} // tgen
ee35760 ::ee35760(){ note_ctor("ee35760", this);} // tgen

static void Test_ee35760()
{
  extern Class_Descriptor cd_ee35760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35760, buf);
    ee35760 *dp, &lv = *(dp=new (buf) ee35760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee35760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee35760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(32,16), "ee35760");
    check_base_class_offset(lv, (dd5760*), ABISELECT(16,8), "ee35760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35760.e");
    test_class_info(&lv, &cd_ee35760);
    dp->~ee35760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35760(Test_ee35760, "ee35760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35760C1Ev();
extern void _ZN7ee35760D1Ev();
Name_Map name_map_ee35760[] = {
  NSPAIR(_ZN7ee35760C1Ev),
  NSPAIR(_ZN7ee35760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee35760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35760[];
extern void _ZN7ee357603fooEv();
extern void _ZN6dd57603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee357603fooEv,_ZTv0_n16_N7ee357603fooEv)();
extern void ABISELECT(_ZThn32_N7ee357603fooEv,_ZThn16_N7ee357603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee357603fooEv,_ZTv0_n16_N7ee357603fooEv)();
extern void ABISELECT(_ZThn48_N7ee357603fooEv,_ZThn24_N7ee357603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35760[0]),
  (VTBL_ENTRY)&_ZN7ee357603fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee357603fooEv,_ZTv0_n16_N7ee357603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee357603fooEv,_ZTv0_n16_N7ee357603fooEv),
};
extern VTBL_ENTRY _ZTV7ee35760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee35760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee35760[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee35760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee35760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee35760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee35760[] = {
  {&(_ZTV7ee35760[5]),  5,25},
  {&(_ZTV7ee35760[11]),  11,25},
  {&(_ZTV7ee35760[17]),  17,25},
  {&(_ZTV7ee35760[23]),  23,25},
  {&(_tg__ZTV6dd5760__7ee35760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee35760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee35760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee35760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee35760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35760[];
extern  VTBL_ENTRY _ZTV7ee35760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35760[];
static VTBL_ENTRY alt_thunk_names443[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee357603fooEv,_ZTv0_n16_N7ee357603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee357603fooEv,_ZThn24_N7ee357603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee357603fooEv,_ZThn16_N7ee357603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35760 = {  "ee35760", // class name
  bases_ee35760, 4,
  &(vtc_ee35760[0]), // expected_vtbl_contents
  &(vtt_ee35760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35760),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names443,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45760  : dd5760 {
  int e;
  virtual void  bar(); // _ZN7ee457603barEv
  ~ee45760(); // tgen
  ee45760(); // tgen
};
//SIG(1 ee45760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee45760 ::bar(){vfunc_called(this, "_ZN7ee457603barEv");}
ee45760 ::~ee45760(){ note_dtor("ee45760", this);} // tgen
ee45760 ::ee45760(){ note_ctor("ee45760", this);} // tgen

static void Test_ee45760()
{
  extern Class_Descriptor cd_ee45760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45760, buf);
    ee45760 *dp, &lv = *(dp=new (buf) ee45760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee45760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee45760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(16,12), "ee45760");
    check_base_class_offset(lv, (dd5760*), 0, "ee45760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45760.e");
    test_class_info(&lv, &cd_ee45760);
    dp->~ee45760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45760(Test_ee45760, "ee45760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45760C1Ev();
extern void _ZN7ee45760D1Ev();
Name_Map name_map_ee45760[] = {
  NSPAIR(_ZN7ee45760C1Ev),
  NSPAIR(_ZN7ee45760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee45760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45760[];
extern void _ZN7ee457603barEv();
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee457603barEv,_ZTv0_n20_N7ee457603barEv)();
extern void ABISELECT(_ZThn16_N7ee457603barEv,_ZThn12_N7ee457603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee457603barEv,_ZTv0_n12_N7ee457603barEv)();
extern void ABISELECT(_ZThn32_N7ee457603barEv,_ZThn20_N7ee457603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45760[0]),
  (VTBL_ENTRY)&_ZN7ee457603barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee457603barEv,_ZTv0_n20_N7ee457603barEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee457603barEv,_ZTv0_n12_N7ee457603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee45760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee45760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee45760[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee45760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee45760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee45760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee45760[] = {
  {&(_ZTV7ee45760[4]),  4,18},
  {&(_tg__ZTV6dd5760__7ee45760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee45760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee45760[4]),  4,6},
  {&(_ZTV7ee45760[10]),  10,18},
  {&(_ZTV7ee45760[16]),  16,18},
  {&(_tg__ZTV5cc760__7ee45760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee45760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45760[];
extern  VTBL_ENTRY _ZTV7ee45760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45760[];
static VTBL_ENTRY alt_thunk_names444[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee457603barEv,_ZTv0_n12_N7ee457603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee457603barEv,_ZThn20_N7ee457603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee457603barEv,_ZTv0_n20_N7ee457603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee457603barEv,_ZThn12_N7ee457603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45760 = {  "ee45760", // class name
  bases_ee45760, 4,
  &(vtc_ee45760[0]), // expected_vtbl_contents
  &(vtt_ee45760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names444,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55760  : virtual dd5760 {
  int e;
  virtual void  bar(); // _ZN7ee557603barEv
  ~ee55760(); // tgen
  ee55760(); // tgen
};
//SIG(1 ee55760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee55760 ::bar(){vfunc_called(this, "_ZN7ee557603barEv");}
ee55760 ::~ee55760(){ note_dtor("ee55760", this);} // tgen
ee55760 ::ee55760(){ note_ctor("ee55760", this);} // tgen

static void Test_ee55760()
{
  extern Class_Descriptor cd_ee55760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55760, buf);
    ee55760 *dp, &lv = *(dp=new (buf) ee55760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee55760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee55760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(32,16), "ee55760");
    check_base_class_offset(lv, (dd5760*), ABISELECT(16,8), "ee55760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55760.e");
    test_class_info(&lv, &cd_ee55760);
    dp->~ee55760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55760(Test_ee55760, "ee55760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55760C1Ev();
extern void _ZN7ee55760D1Ev();
Name_Map name_map_ee55760[] = {
  NSPAIR(_ZN7ee55760C1Ev),
  NSPAIR(_ZN7ee55760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee55760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55760[];
extern void _ZN7ee557603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee557603barEv,_ZTv0_n20_N7ee557603barEv)();
extern void ABISELECT(_ZThn16_N7ee557603barEv,_ZThn8_N7ee557603barEv)() __attribute__((weak));
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee557603barEv,_ZTv0_n20_N7ee557603barEv)();
extern void ABISELECT(_ZThn32_N7ee557603barEv,_ZThn16_N7ee557603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee557603barEv,_ZTv0_n12_N7ee557603barEv)();
extern void ABISELECT(_ZThn48_N7ee557603barEv,_ZThn24_N7ee557603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55760[0]),
  (VTBL_ENTRY)&_ZN7ee557603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee557603barEv,_ZTv0_n20_N7ee557603barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee557603barEv,_ZTv0_n20_N7ee557603barEv),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee557603barEv,_ZTv0_n12_N7ee557603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern VTBL_ENTRY _ZTV7ee55760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee55760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee55760[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee55760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee55760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee55760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee55760[] = {
  {&(_ZTV7ee55760[5]),  5,25},
  {&(_ZTV7ee55760[11]),  11,25},
  {&(_ZTV7ee55760[17]),  17,25},
  {&(_ZTV7ee55760[23]),  23,25},
  {&(_tg__ZTV6dd5760__7ee55760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee55760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee55760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee55760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee55760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55760[];
extern  VTBL_ENTRY _ZTV7ee55760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55760[];
static VTBL_ENTRY alt_thunk_names445[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee557603barEv,_ZTv0_n12_N7ee557603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee557603barEv,_ZThn24_N7ee557603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee557603barEv,_ZTv0_n20_N7ee557603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee557603barEv,_ZThn16_N7ee557603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee557603barEv,_ZThn8_N7ee557603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55760 = {  "ee55760", // class name
  bases_ee55760, 4,
  &(vtc_ee55760[0]), // expected_vtbl_contents
  &(vtt_ee55760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55760),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names445,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65760  : dd5760 {
  int e;
  virtual void  foo(); // _ZN7ee657603fooEv
  virtual void  bar(); // _ZN7ee657603barEv
  ~ee65760(); // tgen
  ee65760(); // tgen
};
//SIG(1 ee65760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65760 ::foo(){vfunc_called(this, "_ZN7ee657603fooEv");}
void  ee65760 ::bar(){vfunc_called(this, "_ZN7ee657603barEv");}
ee65760 ::~ee65760(){ note_dtor("ee65760", this);} // tgen
ee65760 ::ee65760(){ note_ctor("ee65760", this);} // tgen

static void Test_ee65760()
{
  extern Class_Descriptor cd_ee65760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65760, buf);
    ee65760 *dp, &lv = *(dp=new (buf) ee65760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee65760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee65760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(16,12), "ee65760");
    check_base_class_offset(lv, (dd5760*), 0, "ee65760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65760.e");
    test_class_info(&lv, &cd_ee65760);
    dp->~ee65760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65760(Test_ee65760, "ee65760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65760C1Ev();
extern void _ZN7ee65760D1Ev();
Name_Map name_map_ee65760[] = {
  NSPAIR(_ZN7ee65760C1Ev),
  NSPAIR(_ZN7ee65760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee65760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65760[];
extern void _ZN7ee657603barEv();
extern void _ZN7ee657603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee657603fooEv,_ZTv0_n16_N7ee657603fooEv)();
extern void ABISELECT(_ZThn16_N7ee657603fooEv,_ZThn12_N7ee657603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee657603barEv,_ZTv0_n20_N7ee657603barEv)();
extern void ABISELECT(_ZThn16_N7ee657603barEv,_ZThn12_N7ee657603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee657603barEv,_ZTv0_n12_N7ee657603barEv)();
extern void ABISELECT(_ZThn32_N7ee657603barEv,_ZThn20_N7ee657603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee657603fooEv,_ZTv0_n16_N7ee657603fooEv)();
extern void ABISELECT(_ZThn32_N7ee657603fooEv,_ZThn20_N7ee657603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65760[0]),
  (VTBL_ENTRY)&_ZN7ee657603barEv,
  (VTBL_ENTRY)&_ZN7ee657603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee657603fooEv,_ZTv0_n16_N7ee657603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee657603barEv,_ZTv0_n20_N7ee657603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee657603barEv,_ZTv0_n12_N7ee657603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee657603fooEv,_ZTv0_n16_N7ee657603fooEv),
};
extern VTBL_ENTRY _ZTV7ee65760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee65760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee65760[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee65760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee65760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee65760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee65760[] = {
  {&(_ZTV7ee65760[4]),  4,19},
  {&(_tg__ZTV6dd5760__7ee65760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee65760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee65760[4]),  4,6},
  {&(_ZTV7ee65760[11]),  11,19},
  {&(_ZTV7ee65760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee65760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee65760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65760[];
extern  VTBL_ENTRY _ZTV7ee65760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65760[];
static VTBL_ENTRY alt_thunk_names446[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn20_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn12_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee657603barEv,_ZTv0_n12_N7ee657603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee657603barEv,_ZThn20_N7ee657603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee657603barEv,_ZTv0_n20_N7ee657603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee657603barEv,_ZThn12_N7ee657603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee657603fooEv,_ZTv0_n16_N7ee657603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee657603fooEv,_ZThn20_N7ee657603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee657603fooEv,_ZThn12_N7ee657603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65760 = {  "ee65760", // class name
  bases_ee65760, 4,
  &(vtc_ee65760[0]), // expected_vtbl_contents
  &(vtt_ee65760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names446,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75760  : virtual dd5760 {
  int e;
  virtual void  foo(); // _ZN7ee757603fooEv
  virtual void  bar(); // _ZN7ee757603barEv
  ~ee75760(); // tgen
  ee75760(); // tgen
};
//SIG(1 ee75760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75760 ::foo(){vfunc_called(this, "_ZN7ee757603fooEv");}
void  ee75760 ::bar(){vfunc_called(this, "_ZN7ee757603barEv");}
ee75760 ::~ee75760(){ note_dtor("ee75760", this);} // tgen
ee75760 ::ee75760(){ note_ctor("ee75760", this);} // tgen

static void Test_ee75760()
{
  extern Class_Descriptor cd_ee75760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75760, buf);
    ee75760 *dp, &lv = *(dp=new (buf) ee75760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee75760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee75760");
    check_base_class_offset(lv, (cc760*)(dd5760*), ABISELECT(32,16), "ee75760");
    check_base_class_offset(lv, (dd5760*), ABISELECT(16,8), "ee75760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75760.e");
    test_class_info(&lv, &cd_ee75760);
    dp->~ee75760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75760(Test_ee75760, "ee75760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75760C1Ev();
extern void _ZN7ee75760D1Ev();
Name_Map name_map_ee75760[] = {
  NSPAIR(_ZN7ee75760C1Ev),
  NSPAIR(_ZN7ee75760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd5760;
extern VTBL_ENTRY _ZTI6dd5760[];
extern  VTBL_ENTRY _ZTV6dd5760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5760[];
static Base_Class bases_ee75760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee75760[];
extern void _ZN7ee757603fooEv();
extern void _ZN7ee757603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee757603barEv,_ZTv0_n20_N7ee757603barEv)();
extern void ABISELECT(_ZThn16_N7ee757603barEv,_ZThn8_N7ee757603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee757603fooEv,_ZTv0_n16_N7ee757603fooEv)();
extern void ABISELECT(_ZThn32_N7ee757603fooEv,_ZThn16_N7ee757603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee757603barEv,_ZTv0_n20_N7ee757603barEv)();
extern void ABISELECT(_ZThn32_N7ee757603barEv,_ZThn16_N7ee757603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee757603barEv,_ZTv0_n12_N7ee757603barEv)();
extern void ABISELECT(_ZThn48_N7ee757603barEv,_ZThn24_N7ee757603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee757603fooEv,_ZTv0_n16_N7ee757603fooEv)();
extern void ABISELECT(_ZThn48_N7ee757603fooEv,_ZThn24_N7ee757603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75760[0]),
  (VTBL_ENTRY)&_ZN7ee757603fooEv,
  (VTBL_ENTRY)&_ZN7ee757603barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee757603barEv,_ZTv0_n20_N7ee757603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee757603fooEv,_ZTv0_n16_N7ee757603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee757603barEv,_ZTv0_n20_N7ee757603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee757603barEv,_ZTv0_n12_N7ee757603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee757603fooEv,_ZTv0_n16_N7ee757603fooEv),
};
extern VTBL_ENTRY _ZTV7ee75760[];
extern void _ZN6dd57603barEv();
static  VTBL_ENTRY _tg__ZTV6dd5760__7ee75760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN6dd57603barEv,
};
extern void _ZN5cc7603fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv)();
extern void ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd5760__7ee75760[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv)();
extern void ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd5760__7ee75760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee75760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee75760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee75760[] = {
  {&(_ZTV7ee75760[5]),  5,26},
  {&(_ZTV7ee75760[12]),  12,26},
  {&(_ZTV7ee75760[18]),  18,26},
  {&(_ZTV7ee75760[24]),  24,26},
  {&(_tg__ZTV6dd5760__7ee75760[4]),  4,5},
  {&(_tg__ZTV5cc760__6dd5760__7ee75760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd5760__7ee75760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee75760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee75760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75760[];
extern  VTBL_ENTRY _ZTV7ee75760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75760[];
static VTBL_ENTRY alt_thunk_names447[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd57603barEv,_ZTv0_n12_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57603barEv,_ZThn16_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57603barEv,_ZTv0_n20_N6dd57603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57603barEv,_ZThn8_N6dd57603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee757603barEv,_ZTv0_n12_N7ee757603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee757603barEv,_ZThn24_N7ee757603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee757603fooEv,_ZTv0_n16_N7ee757603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee757603fooEv,_ZThn24_N7ee757603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee757603fooEv,_ZThn16_N7ee757603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee757603barEv,_ZTv0_n20_N7ee757603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee757603barEv,_ZThn16_N7ee757603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee757603barEv,_ZThn8_N7ee757603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75760 = {  "ee75760", // class name
  bases_ee75760, 4,
  &(vtc_ee75760[0]), // expected_vtbl_contents
  &(vtt_ee75760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75760),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names447,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6760  : cc760 {
  int d;
  virtual void  bar(); // _ZN6dd67603barEv
  virtual void  foo(); // _ZN6dd67603fooEv
  ~dd6760(); // tgen
  dd6760(); // tgen
};
//SIG(-1 dd6760) C1{ BC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd6760 ::bar(){vfunc_called(this, "_ZN6dd67603barEv");}
void  dd6760 ::foo(){vfunc_called(this, "_ZN6dd67603fooEv");}
dd6760 ::~dd6760(){ note_dtor("dd6760", this);} // tgen
dd6760 ::dd6760(){ note_ctor("dd6760", this);} // tgen

static void Test_dd6760()
{
  extern Class_Descriptor cd_dd6760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6760, buf);
    dd6760 *dp, &lv = *(dp=new (buf) dd6760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(24,16), "dd6760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(16,12), "dd6760");
    check_base_class_offset(lv, (cc760*), 0, "dd6760");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6760.d");
    test_class_info(&lv, &cd_dd6760);
    dp->~dd6760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6760(Test_dd6760, "dd6760", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6760C1Ev();
extern void _ZN6dd6760D1Ev();
Name_Map name_map_dd6760[] = {
  NSPAIR(_ZN6dd6760C1Ev),
  NSPAIR(_ZN6dd6760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd6760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
extern VTBL_ENTRY _ZTV6dd6760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd6760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd6760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd6760[] = {
  {&(_ZTV6dd6760[3]),  3,11},
  {&(_tg__ZTV5cc760__6dd6760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd6760[4]),  4,6},
  {&(_ZTV6dd6760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static VTBL_ENTRY alt_thunk_names448[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6760 = {  "dd6760", // class name
  bases_dd6760, 3,
  &(vtc_dd6760[0]), // expected_vtbl_contents
  &(vtt_dd6760[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6760),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names448,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06760  : dd6760 {
  int e;
  ~ee06760(); // tgen
  ee06760(); // tgen
};
//SIG(1 ee06760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee06760 ::~ee06760(){ note_dtor("ee06760", this);} // tgen
ee06760 ::ee06760(){ note_ctor("ee06760", this);} // tgen

static void Test_ee06760()
{
  extern Class_Descriptor cd_ee06760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06760, buf);
    ee06760 *dp, &lv = *(dp=new (buf) ee06760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee06760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(24,16), "ee06760");
    check_base_class_offset(lv, (cc760*)(dd6760*), 0, "ee06760");
    check_base_class_offset(lv, (dd6760*), 0, "ee06760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06760.e");
    test_class_info(&lv, &cd_ee06760);
    dp->~ee06760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06760(Test_ee06760, "ee06760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06760C1Ev();
extern void _ZN7ee06760D1Ev();
Name_Map name_map_ee06760[] = {
  NSPAIR(_ZN7ee06760C1Ev),
  NSPAIR(_ZN7ee06760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee06760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
extern VTBL_ENTRY _ZTV7ee06760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee06760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee06760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee06760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee06760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee06760[] = {
  {&(_ZTV7ee06760[3]),  3,11},
  {&(_tg__ZTV6dd6760__7ee06760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee06760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee06760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee06760[4]),  4,6},
  {&(_ZTV7ee06760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06760[];
extern  VTBL_ENTRY _ZTV7ee06760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06760[];
static VTBL_ENTRY alt_thunk_names449[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06760 = {  "ee06760", // class name
  bases_ee06760, 4,
  &(vtc_ee06760[0]), // expected_vtbl_contents
  &(vtt_ee06760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names449,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16760  : virtual dd6760 {
  int e;
  ~ee16760(); // tgen
  ee16760(); // tgen
};
//SIG(1 ee16760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee16760 ::~ee16760(){ note_dtor("ee16760", this);} // tgen
ee16760 ::ee16760(){ note_ctor("ee16760", this);} // tgen

static void Test_ee16760()
{
  extern Class_Descriptor cd_ee16760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16760, buf);
    ee16760 *dp, &lv = *(dp=new (buf) ee16760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee16760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(32,20), "ee16760");
    check_base_class_offset(lv, (cc760*)(dd6760*), ABISELECT(16,8), "ee16760");
    check_base_class_offset(lv, (dd6760*), ABISELECT(16,8), "ee16760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16760.e");
    test_class_info(&lv, &cd_ee16760);
    dp->~ee16760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16760(Test_ee16760, "ee16760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16760C1Ev();
extern void _ZN7ee16760D1Ev();
Name_Map name_map_ee16760[] = {
  NSPAIR(_ZN7ee16760C1Ev),
  NSPAIR(_ZN7ee16760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee16760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16760[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
extern VTBL_ENTRY _ZTV7ee16760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee16760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee16760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee16760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee16760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee16760[] = {
  {&(_ZTV7ee16760[4]),  4,17},
  {&(_ZTV7ee16760[9]),  9,17},
  {&(_ZTV7ee16760[15]),  15,17},
  {&(_tg__ZTV6dd6760__7ee16760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee16760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee16760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee16760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16760[];
extern  VTBL_ENTRY _ZTV7ee16760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16760[];
static VTBL_ENTRY alt_thunk_names450[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16760 = {  "ee16760", // class name
  bases_ee16760, 4,
  &(vtc_ee16760[0]), // expected_vtbl_contents
  &(vtt_ee16760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16760),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names450,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26760  : dd6760 {
  int e;
  virtual void  foo(); // _ZN7ee267603fooEv
  ~ee26760(); // tgen
  ee26760(); // tgen
};
//SIG(1 ee26760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26760 ::foo(){vfunc_called(this, "_ZN7ee267603fooEv");}
ee26760 ::~ee26760(){ note_dtor("ee26760", this);} // tgen
ee26760 ::ee26760(){ note_ctor("ee26760", this);} // tgen

static void Test_ee26760()
{
  extern Class_Descriptor cd_ee26760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26760, buf);
    ee26760 *dp, &lv = *(dp=new (buf) ee26760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee26760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(24,16), "ee26760");
    check_base_class_offset(lv, (cc760*)(dd6760*), 0, "ee26760");
    check_base_class_offset(lv, (dd6760*), 0, "ee26760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26760.e");
    test_class_info(&lv, &cd_ee26760);
    dp->~ee26760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26760(Test_ee26760, "ee26760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26760C1Ev();
extern void _ZN7ee26760D1Ev();
Name_Map name_map_ee26760[] = {
  NSPAIR(_ZN7ee26760C1Ev),
  NSPAIR(_ZN7ee26760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee26760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26760[];
extern void _ZN7ee267603fooEv();
extern void _ZN6dd67603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee267603fooEv,_ZTv0_n16_N7ee267603fooEv)();
extern void ABISELECT(_ZThn24_N7ee267603fooEv,_ZThn16_N7ee267603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26760[0]),
  (VTBL_ENTRY)&_ZN7ee267603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee267603fooEv,_ZTv0_n16_N7ee267603fooEv),
};
extern VTBL_ENTRY _ZTV7ee26760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee26760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee26760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee26760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee26760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee26760[] = {
  {&(_ZTV7ee26760[3]),  3,11},
  {&(_tg__ZTV6dd6760__7ee26760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee26760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee26760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee26760[4]),  4,6},
  {&(_ZTV7ee26760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26760[];
extern  VTBL_ENTRY _ZTV7ee26760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26760[];
static VTBL_ENTRY alt_thunk_names451[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee267603fooEv,_ZTv0_n16_N7ee267603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee267603fooEv,_ZThn16_N7ee267603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26760 = {  "ee26760", // class name
  bases_ee26760, 4,
  &(vtc_ee26760[0]), // expected_vtbl_contents
  &(vtt_ee26760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names451,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36760  : virtual dd6760 {
  int e;
  virtual void  foo(); // _ZN7ee367603fooEv
  ~ee36760(); // tgen
  ee36760(); // tgen
};
//SIG(1 ee36760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36760 ::foo(){vfunc_called(this, "_ZN7ee367603fooEv");}
ee36760 ::~ee36760(){ note_dtor("ee36760", this);} // tgen
ee36760 ::ee36760(){ note_ctor("ee36760", this);} // tgen

static void Test_ee36760()
{
  extern Class_Descriptor cd_ee36760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36760, buf);
    ee36760 *dp, &lv = *(dp=new (buf) ee36760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee36760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(32,20), "ee36760");
    check_base_class_offset(lv, (cc760*)(dd6760*), ABISELECT(16,8), "ee36760");
    check_base_class_offset(lv, (dd6760*), ABISELECT(16,8), "ee36760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36760.e");
    test_class_info(&lv, &cd_ee36760);
    dp->~ee36760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36760(Test_ee36760, "ee36760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36760C1Ev();
extern void _ZN7ee36760D1Ev();
Name_Map name_map_ee36760[] = {
  NSPAIR(_ZN7ee36760C1Ev),
  NSPAIR(_ZN7ee36760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee36760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36760[];
extern void _ZN7ee367603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee367603fooEv,_ZTv0_n16_N7ee367603fooEv)();
extern void ABISELECT(_ZThn16_N7ee367603fooEv,_ZThn8_N7ee367603fooEv)() __attribute__((weak));
extern void _ZN6dd67603barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee367603fooEv,_ZTv0_n16_N7ee367603fooEv)();
extern void ABISELECT(_ZThn32_N7ee367603fooEv,_ZThn20_N7ee367603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36760[0]),
  (VTBL_ENTRY)&_ZN7ee367603fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee367603fooEv,_ZTv0_n16_N7ee367603fooEv),
  (VTBL_ENTRY)&_ZN6dd67603barEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee367603fooEv,_ZTv0_n16_N7ee367603fooEv),
};
extern VTBL_ENTRY _ZTV7ee36760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee36760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee36760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee36760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee36760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee36760[] = {
  {&(_ZTV7ee36760[4]),  4,18},
  {&(_ZTV7ee36760[10]),  10,18},
  {&(_ZTV7ee36760[16]),  16,18},
  {&(_tg__ZTV6dd6760__7ee36760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee36760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee36760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee36760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36760[];
extern  VTBL_ENTRY _ZTV7ee36760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36760[];
static VTBL_ENTRY alt_thunk_names452[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee367603fooEv,_ZTv0_n16_N7ee367603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee367603fooEv,_ZThn20_N7ee367603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee367603fooEv,_ZThn8_N7ee367603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36760 = {  "ee36760", // class name
  bases_ee36760, 4,
  &(vtc_ee36760[0]), // expected_vtbl_contents
  &(vtt_ee36760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36760),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names452,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46760  : dd6760 {
  int e;
  virtual void  bar(); // _ZN7ee467603barEv
  ~ee46760(); // tgen
  ee46760(); // tgen
};
//SIG(1 ee46760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46760 ::bar(){vfunc_called(this, "_ZN7ee467603barEv");}
ee46760 ::~ee46760(){ note_dtor("ee46760", this);} // tgen
ee46760 ::ee46760(){ note_ctor("ee46760", this);} // tgen

static void Test_ee46760()
{
  extern Class_Descriptor cd_ee46760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46760, buf);
    ee46760 *dp, &lv = *(dp=new (buf) ee46760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee46760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(24,16), "ee46760");
    check_base_class_offset(lv, (cc760*)(dd6760*), 0, "ee46760");
    check_base_class_offset(lv, (dd6760*), 0, "ee46760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46760.e");
    test_class_info(&lv, &cd_ee46760);
    dp->~ee46760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46760(Test_ee46760, "ee46760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46760C1Ev();
extern void _ZN7ee46760D1Ev();
Name_Map name_map_ee46760[] = {
  NSPAIR(_ZN7ee46760C1Ev),
  NSPAIR(_ZN7ee46760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee46760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46760[];
extern void _ZN6dd67603fooEv();
extern void _ZN7ee467603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee467603barEv,_ZTv0_n12_N7ee467603barEv)();
extern void ABISELECT(_ZThn24_N7ee467603barEv,_ZThn16_N7ee467603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN7ee467603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee467603barEv,_ZTv0_n12_N7ee467603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
extern VTBL_ENTRY _ZTV7ee46760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee46760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee46760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee46760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee46760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee46760[] = {
  {&(_ZTV7ee46760[3]),  3,11},
  {&(_tg__ZTV6dd6760__7ee46760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee46760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee46760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee46760[4]),  4,6},
  {&(_ZTV7ee46760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46760[];
extern  VTBL_ENTRY _ZTV7ee46760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46760[];
static VTBL_ENTRY alt_thunk_names453[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee467603barEv,_ZTv0_n12_N7ee467603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee467603barEv,_ZThn16_N7ee467603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46760 = {  "ee46760", // class name
  bases_ee46760, 4,
  &(vtc_ee46760[0]), // expected_vtbl_contents
  &(vtt_ee46760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46760),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names453,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56760  : virtual dd6760 {
  int e;
  virtual void  bar(); // _ZN7ee567603barEv
  ~ee56760(); // tgen
  ee56760(); // tgen
};
//SIG(1 ee56760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56760 ::bar(){vfunc_called(this, "_ZN7ee567603barEv");}
ee56760 ::~ee56760(){ note_dtor("ee56760", this);} // tgen
ee56760 ::ee56760(){ note_ctor("ee56760", this);} // tgen

static void Test_ee56760()
{
  extern Class_Descriptor cd_ee56760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56760, buf);
    ee56760 *dp, &lv = *(dp=new (buf) ee56760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee56760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(32,20), "ee56760");
    check_base_class_offset(lv, (cc760*)(dd6760*), ABISELECT(16,8), "ee56760");
    check_base_class_offset(lv, (dd6760*), ABISELECT(16,8), "ee56760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56760.e");
    test_class_info(&lv, &cd_ee56760);
    dp->~ee56760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56760(Test_ee56760, "ee56760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56760C1Ev();
extern void _ZN7ee56760D1Ev();
Name_Map name_map_ee56760[] = {
  NSPAIR(_ZN7ee56760C1Ev),
  NSPAIR(_ZN7ee56760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee56760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56760[];
extern void _ZN7ee567603barEv();
extern void _ZN6dd67603fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee567603barEv,_ZTv0_n20_N7ee567603barEv)();
extern void ABISELECT(_ZThn16_N7ee567603barEv,_ZThn8_N7ee567603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee567603barEv,_ZTv0_n12_N7ee567603barEv)();
extern void ABISELECT(_ZThn32_N7ee567603barEv,_ZThn20_N7ee567603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56760[0]),
  (VTBL_ENTRY)&_ZN7ee567603barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee567603barEv,_ZTv0_n20_N7ee567603barEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee567603barEv,_ZTv0_n12_N7ee567603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
extern VTBL_ENTRY _ZTV7ee56760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee56760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee56760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee56760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee56760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee56760[] = {
  {&(_ZTV7ee56760[4]),  4,18},
  {&(_ZTV7ee56760[10]),  10,18},
  {&(_ZTV7ee56760[16]),  16,18},
  {&(_tg__ZTV6dd6760__7ee56760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee56760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee56760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee56760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56760[];
extern  VTBL_ENTRY _ZTV7ee56760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56760[];
static VTBL_ENTRY alt_thunk_names454[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee567603barEv,_ZTv0_n12_N7ee567603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee567603barEv,_ZThn20_N7ee567603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee567603barEv,_ZTv0_n20_N7ee567603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee567603barEv,_ZThn8_N7ee567603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56760 = {  "ee56760", // class name
  bases_ee56760, 4,
  &(vtc_ee56760[0]), // expected_vtbl_contents
  &(vtt_ee56760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56760),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56760),7, //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  ee66760  : dd6760 {
  int e;
  virtual void  foo(); // _ZN7ee667603fooEv
  virtual void  bar(); // _ZN7ee667603barEv
  ~ee66760(); // tgen
  ee66760(); // tgen
};
//SIG(1 ee66760) C1{ BC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66760 ::foo(){vfunc_called(this, "_ZN7ee667603fooEv");}
void  ee66760 ::bar(){vfunc_called(this, "_ZN7ee667603barEv");}
ee66760 ::~ee66760(){ note_dtor("ee66760", this);} // tgen
ee66760 ::ee66760(){ note_ctor("ee66760", this);} // tgen

static void Test_ee66760()
{
  extern Class_Descriptor cd_ee66760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66760, buf);
    ee66760 *dp, &lv = *(dp=new (buf) ee66760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(32,20), "ee66760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(24,16), "ee66760");
    check_base_class_offset(lv, (cc760*)(dd6760*), 0, "ee66760");
    check_base_class_offset(lv, (dd6760*), 0, "ee66760");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66760.e");
    test_class_info(&lv, &cd_ee66760);
    dp->~ee66760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66760(Test_ee66760, "ee66760", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66760C1Ev();
extern void _ZN7ee66760D1Ev();
Name_Map name_map_ee66760[] = {
  NSPAIR(_ZN7ee66760C1Ev),
  NSPAIR(_ZN7ee66760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee66760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66760[];
extern void _ZN7ee667603fooEv();
extern void _ZN7ee667603barEv();
extern void ABISELECT(_ZTv0_n24_N7ee667603barEv,_ZTv0_n12_N7ee667603barEv)();
extern void ABISELECT(_ZThn24_N7ee667603barEv,_ZThn16_N7ee667603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee667603fooEv,_ZTv0_n16_N7ee667603fooEv)();
extern void ABISELECT(_ZThn24_N7ee667603fooEv,_ZThn16_N7ee667603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66760[0]),
  (VTBL_ENTRY)&_ZN7ee667603fooEv,
  (VTBL_ENTRY)&_ZN7ee667603barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee667603barEv,_ZTv0_n12_N7ee667603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee667603fooEv,_ZTv0_n16_N7ee667603fooEv),
};
extern VTBL_ENTRY _ZTV7ee66760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee66760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee66760[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee66760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee66760[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee66760[] = {
  {&(_ZTV7ee66760[3]),  3,11},
  {&(_tg__ZTV6dd6760__7ee66760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee66760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee66760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee66760[4]),  4,6},
  {&(_ZTV7ee66760[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66760[];
extern  VTBL_ENTRY _ZTV7ee66760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66760[];
static VTBL_ENTRY alt_thunk_names455[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603fooEv,_ZThn16_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67603barEv,_ZThn16_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603fooEv,_ZThn16_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7603barEv,_ZThn16_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee667603fooEv,_ZTv0_n16_N7ee667603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee667603fooEv,_ZThn16_N7ee667603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee667603barEv,_ZTv0_n12_N7ee667603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee667603barEv,_ZThn16_N7ee667603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66760 = {  "ee66760", // class name
  bases_ee66760, 4,
  &(vtc_ee66760[0]), // expected_vtbl_contents
  &(vtt_ee66760[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66760),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66760),6, //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  ee76760  : virtual dd6760 {
  int e;
  virtual void  foo(); // _ZN7ee767603fooEv
  virtual void  bar(); // _ZN7ee767603barEv
  ~ee76760(); // tgen
  ee76760(); // tgen
};
//SIG(1 ee76760) C1{ VBC2{ BC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76760 ::foo(){vfunc_called(this, "_ZN7ee767603fooEv");}
void  ee76760 ::bar(){vfunc_called(this, "_ZN7ee767603barEv");}
ee76760 ::~ee76760(){ note_dtor("ee76760", this);} // tgen
ee76760 ::ee76760(){ note_ctor("ee76760", this);} // tgen

static void Test_ee76760()
{
  extern Class_Descriptor cd_ee76760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76760, buf);
    ee76760 *dp, &lv = *(dp=new (buf) ee76760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee76760");
    check_base_class_offset(lv, (bb60*)(cc760*)(dd6760*), ABISELECT(32,20), "ee76760");
    check_base_class_offset(lv, (cc760*)(dd6760*), ABISELECT(16,8), "ee76760");
    check_base_class_offset(lv, (dd6760*), ABISELECT(16,8), "ee76760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76760.e");
    test_class_info(&lv, &cd_ee76760);
    dp->~ee76760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76760(Test_ee76760, "ee76760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76760C1Ev();
extern void _ZN7ee76760D1Ev();
Name_Map name_map_ee76760[] = {
  NSPAIR(_ZN7ee76760C1Ev),
  NSPAIR(_ZN7ee76760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd6760;
extern VTBL_ENTRY _ZTI6dd6760[];
extern  VTBL_ENTRY _ZTV6dd6760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6760[];
static Base_Class bases_ee76760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76760[];
extern void _ZN7ee767603fooEv();
extern void _ZN7ee767603barEv();
extern void ABISELECT(_ZTv0_n32_N7ee767603fooEv,_ZTv0_n16_N7ee767603fooEv)();
extern void ABISELECT(_ZThn16_N7ee767603fooEv,_ZThn8_N7ee767603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee767603barEv,_ZTv0_n20_N7ee767603barEv)();
extern void ABISELECT(_ZThn16_N7ee767603barEv,_ZThn8_N7ee767603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee767603barEv,_ZTv0_n12_N7ee767603barEv)();
extern void ABISELECT(_ZThn32_N7ee767603barEv,_ZThn20_N7ee767603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee767603fooEv,_ZTv0_n16_N7ee767603fooEv)();
extern void ABISELECT(_ZThn32_N7ee767603fooEv,_ZThn20_N7ee767603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76760[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76760[0]),
  (VTBL_ENTRY)&_ZN7ee767603fooEv,
  (VTBL_ENTRY)&_ZN7ee767603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee767603fooEv,_ZTv0_n16_N7ee767603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee767603barEv,_ZTv0_n20_N7ee767603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee767603barEv,_ZTv0_n12_N7ee767603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee767603fooEv,_ZTv0_n16_N7ee767603fooEv),
};
extern VTBL_ENTRY _ZTV7ee76760[];
extern void _ZN6dd67603fooEv();
extern void _ZN6dd67603barEv();
static  VTBL_ENTRY _tg__ZTV6dd6760__7ee76760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&_ZN6dd67603fooEv,
  (VTBL_ENTRY)&_ZN6dd67603barEv,
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc7606dd6760__7ee76760[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc7606dd6760__7ee76760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv)();
extern void ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv)();
extern void ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd6760__7ee76760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv),
};
static  VTT_ENTRY vtt_ee76760[] = {
  {&(_ZTV7ee76760[4]),  4,19},
  {&(_ZTV7ee76760[11]),  11,19},
  {&(_ZTV7ee76760[17]),  17,19},
  {&(_tg__ZTV6dd6760__7ee76760[3]),  3,5},
  {&(_tg__ZTV5cc7606dd6760__7ee76760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc7606dd6760__7ee76760[4]),  4,6},
  {&(_tg__ZTV4bb60__6dd6760__7ee76760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76760[];
extern  VTBL_ENTRY _ZTV7ee76760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76760[];
static VTBL_ENTRY alt_thunk_names456[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67603fooEv,_ZTv0_n16_N6dd67603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603fooEv,_ZThn12_N6dd67603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67603barEv,_ZTv0_n12_N6dd67603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67603barEv,_ZThn12_N6dd67603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn12_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn12_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee767603barEv,_ZTv0_n12_N7ee767603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee767603barEv,_ZThn20_N7ee767603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee767603barEv,_ZTv0_n20_N7ee767603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee767603barEv,_ZThn8_N7ee767603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee767603fooEv,_ZTv0_n16_N7ee767603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee767603fooEv,_ZThn20_N7ee767603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee767603fooEv,_ZThn8_N7ee767603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76760 = {  "ee76760", // class name
  bases_ee76760, 4,
  &(vtc_ee76760[0]), // expected_vtbl_contents
  &(vtt_ee76760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76760),7, //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  dd7760  : virtual cc760 {
  int d;
  virtual void  bar(); // _ZN6dd77603barEv
  virtual void  foo(); // _ZN6dd77603fooEv
  ~dd7760(); // tgen
  dd7760(); // tgen
};
//SIG(-1 dd7760) C1{ VBC2{ VBC3{ BC4{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd7760 ::bar(){vfunc_called(this, "_ZN6dd77603barEv");}
void  dd7760 ::foo(){vfunc_called(this, "_ZN6dd77603fooEv");}
dd7760 ::~dd7760(){ note_dtor("dd7760", this);} // tgen
dd7760 ::dd7760(){ note_ctor("dd7760", this);} // tgen

static void Test_dd7760()
{
  extern Class_Descriptor cd_dd7760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7760, buf);
    dd7760 *dp, &lv = *(dp=new (buf) dd7760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,20), "dd7760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,16), "dd7760");
    check_base_class_offset(lv, (cc760*), ABISELECT(16,8), "dd7760");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7760.d");
    test_class_info(&lv, &cd_dd7760);
    dp->~dd7760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7760(Test_dd7760, "dd7760", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7760C1Ev();
extern void _ZN6dd7760D1Ev();
Name_Map name_map_dd7760[] = {
  NSPAIR(_ZN6dd7760C1Ev),
  NSPAIR(_ZN6dd7760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
static Base_Class bases_dd7760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern VTBL_ENTRY _ZTV6dd7760[];
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__6dd7760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_dd7760[] = {
  {&(_ZTV6dd7760[4]),  4,19},
  {&(_ZTV6dd7760[11]),  11,19},
  {&(_ZTV6dd7760[17]),  17,19},
  {&(_tg__ZTV5cc760__6dd7760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__6dd7760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static VTBL_ENTRY alt_thunk_names457[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7760 = {  "dd7760", // class name
  bases_dd7760, 3,
  &(vtc_dd7760[0]), // expected_vtbl_contents
  &(vtt_dd7760[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7760),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names457,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07760  : dd7760 {
  int e;
  ~ee07760(); // tgen
  ee07760(); // tgen
};
//SIG(1 ee07760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee07760 ::~ee07760(){ note_dtor("ee07760", this);} // tgen
ee07760 ::ee07760(){ note_ctor("ee07760", this);} // tgen

static void Test_ee07760()
{
  extern Class_Descriptor cd_ee07760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07760, buf);
    ee07760 *dp, &lv = *(dp=new (buf) ee07760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee07760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee07760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(16,12), "ee07760");
    check_base_class_offset(lv, (dd7760*), 0, "ee07760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07760.e");
    test_class_info(&lv, &cd_ee07760);
    dp->~ee07760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07760(Test_ee07760, "ee07760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07760C1Ev();
extern void _ZN7ee07760D1Ev();
Name_Map name_map_ee07760[] = {
  NSPAIR(_ZN7ee07760C1Ev),
  NSPAIR(_ZN7ee07760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee07760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern VTBL_ENTRY _ZTV7ee07760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee07760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee07760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee07760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee07760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee07760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee07760[] = {
  {&(_ZTV7ee07760[4]),  4,19},
  {&(_tg__ZTV6dd7760__7ee07760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee07760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee07760[4]),  4,6},
  {&(_ZTV7ee07760[11]),  11,19},
  {&(_ZTV7ee07760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee07760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee07760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07760[];
extern  VTBL_ENTRY _ZTV7ee07760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07760[];
static VTBL_ENTRY alt_thunk_names458[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07760 = {  "ee07760", // class name
  bases_ee07760, 4,
  &(vtc_ee07760[0]), // expected_vtbl_contents
  &(vtt_ee07760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07760),8, //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  ee17760  : virtual dd7760 {
  int e;
  ~ee17760(); // tgen
  ee17760(); // tgen
};
//SIG(1 ee17760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee17760 ::~ee17760(){ note_dtor("ee17760", this);} // tgen
ee17760 ::ee17760(){ note_ctor("ee17760", this);} // tgen

static void Test_ee17760()
{
  extern Class_Descriptor cd_ee17760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17760, buf);
    ee17760 *dp, &lv = *(dp=new (buf) ee17760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee17760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee17760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(32,16), "ee17760");
    check_base_class_offset(lv, (dd7760*), ABISELECT(16,8), "ee17760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17760.e");
    test_class_info(&lv, &cd_ee17760);
    dp->~ee17760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17760(Test_ee17760, "ee17760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17760C1Ev();
extern void _ZN7ee17760D1Ev();
Name_Map name_map_ee17760[] = {
  NSPAIR(_ZN7ee17760C1Ev),
  NSPAIR(_ZN7ee17760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee17760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17760[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern VTBL_ENTRY _ZTV7ee17760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee17760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee17760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee17760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee17760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee17760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee17760[] = {
  {&(_ZTV7ee17760[5]),  5,26},
  {&(_ZTV7ee17760[11]),  11,26},
  {&(_ZTV7ee17760[18]),  18,26},
  {&(_ZTV7ee17760[24]),  24,26},
  {&(_tg__ZTV6dd7760__7ee17760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee17760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee17760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee17760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee17760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17760[];
extern  VTBL_ENTRY _ZTV7ee17760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17760[];
static VTBL_ENTRY alt_thunk_names459[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17760 = {  "ee17760", // class name
  bases_ee17760, 4,
  &(vtc_ee17760[0]), // expected_vtbl_contents
  &(vtt_ee17760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17760),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names459,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27760  : dd7760 {
  int e;
  virtual void  foo(); // _ZN7ee277603fooEv
  ~ee27760(); // tgen
  ee27760(); // tgen
};
//SIG(1 ee27760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27760 ::foo(){vfunc_called(this, "_ZN7ee277603fooEv");}
ee27760 ::~ee27760(){ note_dtor("ee27760", this);} // tgen
ee27760 ::ee27760(){ note_ctor("ee27760", this);} // tgen

static void Test_ee27760()
{
  extern Class_Descriptor cd_ee27760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27760, buf);
    ee27760 *dp, &lv = *(dp=new (buf) ee27760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee27760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee27760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(16,12), "ee27760");
    check_base_class_offset(lv, (dd7760*), 0, "ee27760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27760.e");
    test_class_info(&lv, &cd_ee27760);
    dp->~ee27760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27760(Test_ee27760, "ee27760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27760C1Ev();
extern void _ZN7ee27760D1Ev();
Name_Map name_map_ee27760[] = {
  NSPAIR(_ZN7ee27760C1Ev),
  NSPAIR(_ZN7ee27760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee27760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27760[];
extern void _ZN6dd77603barEv();
extern void _ZN7ee277603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee277603fooEv,_ZTv0_n16_N7ee277603fooEv)();
extern void ABISELECT(_ZThn16_N7ee277603fooEv,_ZThn12_N7ee277603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee277603fooEv,_ZTv0_n16_N7ee277603fooEv)();
extern void ABISELECT(_ZThn32_N7ee277603fooEv,_ZThn20_N7ee277603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN7ee277603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee277603fooEv,_ZTv0_n16_N7ee277603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee277603fooEv,_ZTv0_n16_N7ee277603fooEv),
};
extern VTBL_ENTRY _ZTV7ee27760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee27760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee27760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee27760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee27760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee27760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee27760[] = {
  {&(_ZTV7ee27760[4]),  4,19},
  {&(_tg__ZTV6dd7760__7ee27760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee27760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee27760[4]),  4,6},
  {&(_ZTV7ee27760[11]),  11,19},
  {&(_ZTV7ee27760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee27760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee27760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27760[];
extern  VTBL_ENTRY _ZTV7ee27760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27760[];
static VTBL_ENTRY alt_thunk_names460[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee277603fooEv,_ZTv0_n16_N7ee277603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee277603fooEv,_ZThn20_N7ee277603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee277603fooEv,_ZThn12_N7ee277603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27760 = {  "ee27760", // class name
  bases_ee27760, 4,
  &(vtc_ee27760[0]), // expected_vtbl_contents
  &(vtt_ee27760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names460,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37760  : virtual dd7760 {
  int e;
  virtual void  foo(); // _ZN7ee377603fooEv
  ~ee37760(); // tgen
  ee37760(); // tgen
};
//SIG(1 ee37760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37760 ::foo(){vfunc_called(this, "_ZN7ee377603fooEv");}
ee37760 ::~ee37760(){ note_dtor("ee37760", this);} // tgen
ee37760 ::ee37760(){ note_ctor("ee37760", this);} // tgen

static void Test_ee37760()
{
  extern Class_Descriptor cd_ee37760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37760, buf);
    ee37760 *dp, &lv = *(dp=new (buf) ee37760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee37760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee37760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(32,16), "ee37760");
    check_base_class_offset(lv, (dd7760*), ABISELECT(16,8), "ee37760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37760.e");
    test_class_info(&lv, &cd_ee37760);
    dp->~ee37760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37760(Test_ee37760, "ee37760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37760C1Ev();
extern void _ZN7ee37760D1Ev();
Name_Map name_map_ee37760[] = {
  NSPAIR(_ZN7ee37760C1Ev),
  NSPAIR(_ZN7ee37760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee37760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    21, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37760[];
extern void _ZN7ee377603fooEv();
extern void _ZN6dd77603barEv();
extern void ABISELECT(_ZTv0_n48_N7ee377603fooEv,_ZTv0_n24_N7ee377603fooEv)();
extern void ABISELECT(_ZThn16_N7ee377603fooEv,_ZThn8_N7ee377603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee377603fooEv,_ZTv0_n16_N7ee377603fooEv)();
extern void ABISELECT(_ZThn32_N7ee377603fooEv,_ZThn16_N7ee377603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee377603fooEv,_ZTv0_n16_N7ee377603fooEv)();
extern void ABISELECT(_ZThn48_N7ee377603fooEv,_ZThn24_N7ee377603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37760[0]),
  (VTBL_ENTRY)&_ZN7ee377603fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee377603fooEv,_ZTv0_n24_N7ee377603fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee377603fooEv,_ZTv0_n16_N7ee377603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee377603fooEv,_ZTv0_n16_N7ee377603fooEv),
};
extern VTBL_ENTRY _ZTV7ee37760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee37760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee37760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee37760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee37760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee37760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee37760[] = {
  {&(_ZTV7ee37760[5]),  5,27},
  {&(_ZTV7ee37760[12]),  12,27},
  {&(_ZTV7ee37760[19]),  19,27},
  {&(_ZTV7ee37760[25]),  25,27},
  {&(_tg__ZTV6dd7760__7ee37760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee37760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee37760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee37760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee37760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37760[];
extern  VTBL_ENTRY _ZTV7ee37760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37760[];
static VTBL_ENTRY alt_thunk_names461[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee377603fooEv,_ZTv0_n16_N7ee377603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee377603fooEv,_ZThn24_N7ee377603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee377603fooEv,_ZThn16_N7ee377603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee377603fooEv,_ZTv0_n24_N7ee377603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee377603fooEv,_ZThn8_N7ee377603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37760 = {  "ee37760", // class name
  bases_ee37760, 4,
  &(vtc_ee37760[0]), // expected_vtbl_contents
  &(vtt_ee37760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37760),27, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names461,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47760  : dd7760 {
  int e;
  virtual void  bar(); // _ZN7ee477603barEv
  ~ee47760(); // tgen
  ee47760(); // tgen
};
//SIG(1 ee47760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47760 ::bar(){vfunc_called(this, "_ZN7ee477603barEv");}
ee47760 ::~ee47760(){ note_dtor("ee47760", this);} // tgen
ee47760 ::ee47760(){ note_ctor("ee47760", this);} // tgen

static void Test_ee47760()
{
  extern Class_Descriptor cd_ee47760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47760, buf);
    ee47760 *dp, &lv = *(dp=new (buf) ee47760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee47760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee47760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(16,12), "ee47760");
    check_base_class_offset(lv, (dd7760*), 0, "ee47760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47760.e");
    test_class_info(&lv, &cd_ee47760);
    dp->~ee47760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47760(Test_ee47760, "ee47760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47760C1Ev();
extern void _ZN7ee47760D1Ev();
Name_Map name_map_ee47760[] = {
  NSPAIR(_ZN7ee47760C1Ev),
  NSPAIR(_ZN7ee47760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee47760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47760[];
extern void _ZN7ee477603barEv();
extern void _ZN6dd77603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee477603barEv,_ZTv0_n20_N7ee477603barEv)();
extern void ABISELECT(_ZThn16_N7ee477603barEv,_ZThn12_N7ee477603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee477603barEv,_ZTv0_n12_N7ee477603barEv)();
extern void ABISELECT(_ZThn32_N7ee477603barEv,_ZThn20_N7ee477603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47760[0]),
  (VTBL_ENTRY)&_ZN7ee477603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee477603barEv,_ZTv0_n20_N7ee477603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee477603barEv,_ZTv0_n12_N7ee477603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern VTBL_ENTRY _ZTV7ee47760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee47760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee47760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee47760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee47760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee47760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee47760[] = {
  {&(_ZTV7ee47760[4]),  4,19},
  {&(_tg__ZTV6dd7760__7ee47760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee47760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee47760[4]),  4,6},
  {&(_ZTV7ee47760[11]),  11,19},
  {&(_ZTV7ee47760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee47760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee47760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47760[];
extern  VTBL_ENTRY _ZTV7ee47760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47760[];
static VTBL_ENTRY alt_thunk_names462[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee477603barEv,_ZTv0_n12_N7ee477603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee477603barEv,_ZThn20_N7ee477603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee477603barEv,_ZTv0_n20_N7ee477603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee477603barEv,_ZThn12_N7ee477603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47760 = {  "ee47760", // class name
  bases_ee47760, 4,
  &(vtc_ee47760[0]), // expected_vtbl_contents
  &(vtt_ee47760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names462,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57760  : virtual dd7760 {
  int e;
  virtual void  bar(); // _ZN7ee577603barEv
  ~ee57760(); // tgen
  ee57760(); // tgen
};
//SIG(1 ee57760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57760 ::bar(){vfunc_called(this, "_ZN7ee577603barEv");}
ee57760 ::~ee57760(){ note_dtor("ee57760", this);} // tgen
ee57760 ::ee57760(){ note_ctor("ee57760", this);} // tgen

static void Test_ee57760()
{
  extern Class_Descriptor cd_ee57760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57760, buf);
    ee57760 *dp, &lv = *(dp=new (buf) ee57760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee57760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee57760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(32,16), "ee57760");
    check_base_class_offset(lv, (dd7760*), ABISELECT(16,8), "ee57760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57760.e");
    test_class_info(&lv, &cd_ee57760);
    dp->~ee57760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57760(Test_ee57760, "ee57760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57760C1Ev();
extern void _ZN7ee57760D1Ev();
Name_Map name_map_ee57760[] = {
  NSPAIR(_ZN7ee57760C1Ev),
  NSPAIR(_ZN7ee57760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee57760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    21, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57760[];
extern void _ZN7ee577603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee577603barEv,_ZTv0_n20_N7ee577603barEv)();
extern void ABISELECT(_ZThn16_N7ee577603barEv,_ZThn8_N7ee577603barEv)() __attribute__((weak));
extern void _ZN6dd77603fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee577603barEv,_ZTv0_n20_N7ee577603barEv)();
extern void ABISELECT(_ZThn32_N7ee577603barEv,_ZThn16_N7ee577603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee577603barEv,_ZTv0_n12_N7ee577603barEv)();
extern void ABISELECT(_ZThn48_N7ee577603barEv,_ZThn24_N7ee577603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57760[0]),
  (VTBL_ENTRY)&_ZN7ee577603barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee577603barEv,_ZTv0_n20_N7ee577603barEv),
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee577603barEv,_ZTv0_n20_N7ee577603barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee577603barEv,_ZTv0_n12_N7ee577603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern VTBL_ENTRY _ZTV7ee57760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee57760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee57760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee57760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee57760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee57760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee57760[] = {
  {&(_ZTV7ee57760[5]),  5,27},
  {&(_ZTV7ee57760[12]),  12,27},
  {&(_ZTV7ee57760[19]),  19,27},
  {&(_ZTV7ee57760[25]),  25,27},
  {&(_tg__ZTV6dd7760__7ee57760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee57760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee57760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee57760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee57760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57760[];
extern  VTBL_ENTRY _ZTV7ee57760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57760[];
static VTBL_ENTRY alt_thunk_names463[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee577603barEv,_ZTv0_n12_N7ee577603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee577603barEv,_ZThn24_N7ee577603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee577603barEv,_ZTv0_n20_N7ee577603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee577603barEv,_ZThn16_N7ee577603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee577603barEv,_ZThn8_N7ee577603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57760 = {  "ee57760", // class name
  bases_ee57760, 4,
  &(vtc_ee57760[0]), // expected_vtbl_contents
  &(vtt_ee57760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57760),27, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names463,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67760  : dd7760 {
  int e;
  virtual void  foo(); // _ZN7ee677603fooEv
  virtual void  bar(); // _ZN7ee677603barEv
  ~ee67760(); // tgen
  ee67760(); // tgen
};
//SIG(1 ee67760) C1{ BC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67760 ::foo(){vfunc_called(this, "_ZN7ee677603fooEv");}
void  ee67760 ::bar(){vfunc_called(this, "_ZN7ee677603barEv");}
ee67760 ::~ee67760(){ note_dtor("ee67760", this);} // tgen
ee67760 ::ee67760(){ note_ctor("ee67760", this);} // tgen

static void Test_ee67760()
{
  extern Class_Descriptor cd_ee67760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67760, buf);
    ee67760 *dp, &lv = *(dp=new (buf) ee67760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(40,24), "ee67760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(32,20), "ee67760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(16,12), "ee67760");
    check_base_class_offset(lv, (dd7760*), 0, "ee67760");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67760.e");
    test_class_info(&lv, &cd_ee67760);
    dp->~ee67760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67760(Test_ee67760, "ee67760", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67760C1Ev();
extern void _ZN7ee67760D1Ev();
Name_Map name_map_ee67760[] = {
  NSPAIR(_ZN7ee67760C1Ev),
  NSPAIR(_ZN7ee67760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee67760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67760[];
extern void _ZN7ee677603barEv();
extern void _ZN7ee677603fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee677603fooEv,_ZTv0_n16_N7ee677603fooEv)();
extern void ABISELECT(_ZThn16_N7ee677603fooEv,_ZThn12_N7ee677603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee677603barEv,_ZTv0_n20_N7ee677603barEv)();
extern void ABISELECT(_ZThn16_N7ee677603barEv,_ZThn12_N7ee677603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee677603barEv,_ZTv0_n12_N7ee677603barEv)();
extern void ABISELECT(_ZThn32_N7ee677603barEv,_ZThn20_N7ee677603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee677603fooEv,_ZTv0_n16_N7ee677603fooEv)();
extern void ABISELECT(_ZThn32_N7ee677603fooEv,_ZThn20_N7ee677603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67760[0]),
  (VTBL_ENTRY)&_ZN7ee677603barEv,
  (VTBL_ENTRY)&_ZN7ee677603fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee677603fooEv,_ZTv0_n16_N7ee677603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee677603barEv,_ZTv0_n20_N7ee677603barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee677603barEv,_ZTv0_n12_N7ee677603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee677603fooEv,_ZTv0_n16_N7ee677603fooEv),
};
extern VTBL_ENTRY _ZTV7ee67760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee67760[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee67760[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee67760[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee67760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee67760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee67760[] = {
  {&(_ZTV7ee67760[4]),  4,19},
  {&(_tg__ZTV6dd7760__7ee67760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee67760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee67760[4]),  4,6},
  {&(_ZTV7ee67760[11]),  11,19},
  {&(_ZTV7ee67760[17]),  17,19},
  {&(_tg__ZTV5cc760__7ee67760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee67760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67760[];
extern  VTBL_ENTRY _ZTV7ee67760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67760[];
static VTBL_ENTRY alt_thunk_names464[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn20_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn12_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn20_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn12_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee677603barEv,_ZTv0_n12_N7ee677603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee677603barEv,_ZThn20_N7ee677603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee677603barEv,_ZTv0_n20_N7ee677603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee677603barEv,_ZThn12_N7ee677603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee677603fooEv,_ZTv0_n16_N7ee677603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee677603fooEv,_ZThn20_N7ee677603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee677603fooEv,_ZThn12_N7ee677603fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67760 = {  "ee67760", // class name
  bases_ee67760, 4,
  &(vtc_ee67760[0]), // expected_vtbl_contents
  &(vtt_ee67760[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67760),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67760),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67760),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names464,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77760  : virtual dd7760 {
  int e;
  virtual void  foo(); // _ZN7ee777603fooEv
  virtual void  bar(); // _ZN7ee777603barEv
  ~ee77760(); // tgen
  ee77760(); // tgen
};
//SIG(1 ee77760) C1{ VBC2{ VBC3{ VBC4{ BC5{ Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77760 ::foo(){vfunc_called(this, "_ZN7ee777603fooEv");}
void  ee77760 ::bar(){vfunc_called(this, "_ZN7ee777603barEv");}
ee77760 ::~ee77760(){ note_dtor("ee77760", this);} // tgen
ee77760 ::ee77760(){ note_ctor("ee77760", this);} // tgen

static void Test_ee77760()
{
  extern Class_Descriptor cd_ee77760;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77760, buf);
    ee77760 *dp, &lv = *(dp=new (buf) ee77760());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77760)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77760)");
    check_base_class_offset(lv, (aa0*)(bb60*), ABISELECT(56,28), "ee77760");
    check_base_class_offset(lv, (bb60*)(cc760*), ABISELECT(48,24), "ee77760");
    check_base_class_offset(lv, (cc760*)(dd7760*), ABISELECT(32,16), "ee77760");
    check_base_class_offset(lv, (dd7760*), ABISELECT(16,8), "ee77760");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77760.e");
    test_class_info(&lv, &cd_ee77760);
    dp->~ee77760();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77760(Test_ee77760, "ee77760", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77760C1Ev();
extern void _ZN7ee77760D1Ev();
Name_Map name_map_ee77760[] = {
  NSPAIR(_ZN7ee77760C1Ev),
  NSPAIR(_ZN7ee77760D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa0;
extern VTBL_ENTRY _ZTI3aa0[];
extern Class_Descriptor cd_bb60;
extern VTBL_ENTRY _ZTI4bb60[];
extern  VTBL_ENTRY _ZTV4bb60[];
extern Class_Descriptor cd_cc760;
extern VTBL_ENTRY _ZTI5cc760[];
extern  VTBL_ENTRY _ZTV5cc760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc760[];
extern Class_Descriptor cd_dd7760;
extern VTBL_ENTRY _ZTI6dd7760[];
extern  VTBL_ENTRY _ZTV6dd7760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7760[];
static Base_Class bases_ee77760[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa0,    ABISELECT(56,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb60,    ABISELECT(48,24), //bcp->offset
    22, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc760,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7760,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77760[];
extern void _ZN7ee777603fooEv();
extern void _ZN7ee777603barEv();
extern void ABISELECT(_ZTv0_n40_N7ee777603barEv,_ZTv0_n20_N7ee777603barEv)();
extern void ABISELECT(_ZThn16_N7ee777603barEv,_ZThn8_N7ee777603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee777603fooEv,_ZTv0_n24_N7ee777603fooEv)();
extern void ABISELECT(_ZThn16_N7ee777603fooEv,_ZThn8_N7ee777603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee777603fooEv,_ZTv0_n16_N7ee777603fooEv)();
extern void ABISELECT(_ZThn32_N7ee777603fooEv,_ZThn16_N7ee777603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee777603barEv,_ZTv0_n20_N7ee777603barEv)();
extern void ABISELECT(_ZThn32_N7ee777603barEv,_ZThn16_N7ee777603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee777603barEv,_ZTv0_n12_N7ee777603barEv)();
extern void ABISELECT(_ZThn48_N7ee777603barEv,_ZThn24_N7ee777603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee777603fooEv,_ZTv0_n16_N7ee777603fooEv)();
extern void ABISELECT(_ZThn48_N7ee777603fooEv,_ZThn24_N7ee777603fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77760[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77760[0]),
  (VTBL_ENTRY)&_ZN7ee777603fooEv,
  (VTBL_ENTRY)&_ZN7ee777603barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee777603barEv,_ZTv0_n20_N7ee777603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee777603fooEv,_ZTv0_n24_N7ee777603fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee777603fooEv,_ZTv0_n16_N7ee777603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee777603barEv,_ZTv0_n20_N7ee777603barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee777603barEv,_ZTv0_n12_N7ee777603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee777603fooEv,_ZTv0_n16_N7ee777603fooEv),
};
extern VTBL_ENTRY _ZTV7ee77760[];
extern void _ZN6dd77603barEv();
extern void _ZN6dd77603fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7760__7ee77760[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&_ZN6dd77603barEv,
  (VTBL_ENTRY)&_ZN6dd77603fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv)();
extern void ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc760__6dd7760__7ee77760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv)();
extern void ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv)();
extern void ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__6dd7760__7ee77760[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv),
};
extern void _ZN5cc7603fooEv();
extern void _ZN5cc7603barEv();
static  VTBL_ENTRY _tg__ZTV5cc760__7ee77760[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&_ZN5cc7603fooEv,
  (VTBL_ENTRY)&_ZN5cc7603barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv)();
extern void ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv)();
extern void ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb60__5cc760__7ee77760[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc760[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv),
};
static  VTT_ENTRY vtt_ee77760[] = {
  {&(_ZTV7ee77760[5]),  5,28},
  {&(_ZTV7ee77760[13]),  13,28},
  {&(_ZTV7ee77760[20]),  20,28},
  {&(_ZTV7ee77760[26]),  26,28},
  {&(_tg__ZTV6dd7760__7ee77760[4]),  4,6},
  {&(_tg__ZTV5cc760__6dd7760__7ee77760[5]),  5,7},
  {&(_tg__ZTV4bb60__6dd7760__7ee77760[4]),  4,6},
  {&(_tg__ZTV5cc760__7ee77760[3]),  3,5},
  {&(_tg__ZTV4bb60__5cc760__7ee77760[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77760[];
extern  VTBL_ENTRY _ZTV7ee77760[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77760[];
static VTBL_ENTRY alt_thunk_names465[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7603fooEv,_ZTv0_n16_N5cc7603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603fooEv,_ZThn8_N5cc7603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7603barEv,_ZTv0_n12_N5cc7603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7603barEv,_ZThn8_N5cc7603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77603barEv,_ZTv0_n12_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603barEv,_ZThn16_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77603barEv,_ZTv0_n20_N6dd77603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603barEv,_ZThn8_N6dd77603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77603fooEv,_ZTv0_n16_N6dd77603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77603fooEv,_ZThn16_N6dd77603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77603fooEv,_ZThn8_N6dd77603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee777603barEv,_ZTv0_n12_N7ee777603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee777603barEv,_ZThn24_N7ee777603barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee777603fooEv,_ZTv0_n16_N7ee777603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee777603fooEv,_ZThn24_N7ee777603fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee777603fooEv,_ZThn16_N7ee777603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee777603fooEv,_ZTv0_n24_N7ee777603fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee777603fooEv,_ZThn8_N7ee777603fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee777603barEv,_ZTv0_n20_N7ee777603barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee777603barEv,_ZThn16_N7ee777603barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee777603barEv,_ZThn8_N7ee777603barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77760 = {  "ee77760", // class name
  bases_ee77760, 4,
  &(vtc_ee77760[0]), // expected_vtbl_contents
  &(vtt_ee77760[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77760),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77760),28, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77760),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names465,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  bb61  : aa1 {
  int b;
  virtual void  bar(); // _ZN4bb613barEv
  virtual void  foo(); // _ZN4bb613fooEv
  ~bb61(); // tgen
  bb61(); // tgen
};
//SIG(-1 bb61) C1{ BC2{ v2 Fi} v1 v2 Fi}


void  bb61 ::bar(){vfunc_called(this, "_ZN4bb613barEv");}
void  bb61 ::foo(){vfunc_called(this, "_ZN4bb613fooEv");}
bb61 ::~bb61(){ note_dtor("bb61", this);} // tgen
bb61 ::bb61(){ note_ctor("bb61", this);} // tgen

static void Test_bb61()
{
  extern Class_Descriptor cd_bb61;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(3,4)];
    init_test(&cd_bb61, buf);
    bb61 *dp, &lv = *(dp=new (buf) bb61());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(bb61)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(bb61)");
    check_base_class_offset(lv, (aa1*), 0, "bb61");
    check_field_offset(lv, b, ABISELECT(12,8), "bb61.b");
    test_class_info(&lv, &cd_bb61);
    dp->~bb61();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vbb61(Test_bb61, "bb61", ABISELECT(16,12));

#else // __cplusplus

extern void _ZN4bb61C1Ev();
extern void _ZN4bb61D1Ev();
Name_Map name_map_bb61[] = {
  NSPAIR(_ZN4bb61C1Ev),
  NSPAIR(_ZN4bb61D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
static Base_Class bases_bb61[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4bb61[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_bb61[] = {
  0,
  (VTBL_ENTRY)&(_ZTI4bb61[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
Class_Descriptor cd_bb61 = {  "bb61", // class name
  bases_bb61, 1,
  &(vtc_bb61[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,12), // object size
  NSPAIRA(_ZTI4bb61),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV4bb61),4, //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  cc061  : bb61 {
  int c;
  ~cc061(); // tgen
  cc061(); // tgen
};
//SIG(-1 cc061) C1{ BC2{ BC3{ v2 Fi} v1 v2 Fi} Fi}


cc061 ::~cc061(){ note_dtor("cc061", this);} // tgen
cc061 ::cc061(){ note_ctor("cc061", this);} // tgen

static void Test_cc061()
{
  extern Class_Descriptor cd_cc061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc061, buf);
    cc061 *dp, &lv = *(dp=new (buf) cc061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc061)");
    check_base_class_offset(lv, (aa1*)(bb61*), 0, "cc061");
    check_base_class_offset(lv, (bb61*), 0, "cc061");
    check_field_offset(lv, c, ABISELECT(16,12), "cc061.c");
    test_class_info(&lv, &cd_cc061);
    dp->~cc061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc061(Test_cc061, "cc061", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc061C1Ev();
extern void _ZN5cc061D1Ev();
Name_Map name_map_cc061[] = {
  NSPAIR(_ZN5cc061C1Ev),
  NSPAIR(_ZN5cc061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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},
  {0}};
extern VTBL_ENTRY _ZTI5cc061[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_cc061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
Class_Descriptor cd_cc061 = {  "cc061", // class name
  bases_cc061, 2,
  &(vtc_cc061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc061),4, //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  dd0061  : cc061 {
  int d;
  ~dd0061(); // tgen
  dd0061(); // tgen
};
//SIG(-1 dd0061) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} Fi}


dd0061 ::~dd0061(){ note_dtor("dd0061", this);} // tgen
dd0061 ::dd0061(){ note_ctor("dd0061", this);} // tgen

static void Test_dd0061()
{
  extern Class_Descriptor cd_dd0061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0061, buf);
    dd0061 *dp, &lv = *(dp=new (buf) dd0061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), 0, "dd0061");
    check_base_class_offset(lv, (bb61*)(cc061*), 0, "dd0061");
    check_base_class_offset(lv, (cc061*), 0, "dd0061");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0061.d");
    test_class_info(&lv, &cd_dd0061);
    dp->~dd0061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0061(Test_dd0061, "dd0061", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0061C1Ev();
extern void _ZN6dd0061D1Ev();
Name_Map name_map_dd0061[] = {
  NSPAIR(_ZN6dd0061C1Ev),
  NSPAIR(_ZN6dd0061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd0061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd0061[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd0061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
Class_Descriptor cd_dd0061 = {  "dd0061", // class name
  bases_dd0061, 3,
  &(vtc_dd0061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0061),4, //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  ee00061  : dd0061 {
  int e;
  ~ee00061(); // tgen
  ee00061(); // tgen
};
//SIG(1 ee00061) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee00061 ::~ee00061(){ note_dtor("ee00061", this);} // tgen
ee00061 ::ee00061(){ note_ctor("ee00061", this);} // tgen

static void Test_ee00061()
{
  extern Class_Descriptor cd_ee00061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00061, buf);
    ee00061 *dp, &lv = *(dp=new (buf) ee00061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), 0, "ee00061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), 0, "ee00061");
    check_base_class_offset(lv, (cc061*)(dd0061*), 0, "ee00061");
    check_base_class_offset(lv, (dd0061*), 0, "ee00061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00061.e");
    test_class_info(&lv, &cd_ee00061);
    dp->~ee00061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00061(Test_ee00061, "ee00061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00061C1Ev();
extern void _ZN7ee00061D1Ev();
Name_Map name_map_ee00061[] = {
  NSPAIR(_ZN7ee00061C1Ev),
  NSPAIR(_ZN7ee00061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee00061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00061[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee00061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee00061[];
extern  VTBL_ENTRY _ZTV7ee00061[];
Class_Descriptor cd_ee00061 = {  "ee00061", // class name
  bases_ee00061, 4,
  &(vtc_ee00061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00061),4, //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  ee10061  : virtual dd0061 {
  int e;
  ~ee10061(); // tgen
  ee10061(); // tgen
};
//SIG(1 ee10061) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee10061 ::~ee10061(){ note_dtor("ee10061", this);} // tgen
ee10061 ::ee10061(){ note_ctor("ee10061", this);} // tgen

static void Test_ee10061()
{
  extern Class_Descriptor cd_ee10061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10061, buf);
    ee10061 *dp, &lv = *(dp=new (buf) ee10061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee10061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee10061");
    check_base_class_offset(lv, (cc061*)(dd0061*), ABISELECT(16,8), "ee10061");
    check_base_class_offset(lv, (dd0061*), ABISELECT(16,8), "ee10061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10061.e");
    test_class_info(&lv, &cd_ee10061);
    dp->~ee10061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10061(Test_ee10061, "ee10061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10061C1Ev();
extern void _ZN7ee10061D1Ev();
Name_Map name_map_ee10061[] = {
  NSPAIR(_ZN7ee10061C1Ev),
  NSPAIR(_ZN7ee10061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee10061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10061[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee10061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10061[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee10061[];
static  VTT_ENTRY vtt_ee10061[] = {
  {&(_ZTV7ee10061[3]),  3,9},
  {&(_ZTV7ee10061[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10061[];
extern  VTBL_ENTRY _ZTV7ee10061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10061[];
Class_Descriptor cd_ee10061 = {  "ee10061", // class name
  bases_ee10061, 4,
  &(vtc_ee10061[0]), // expected_vtbl_contents
  &(vtt_ee10061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10061),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10061),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  ee20061  : dd0061 {
  int e;
  virtual void  foo(); // _ZN7ee200613fooEv
  ~ee20061(); // tgen
  ee20061(); // tgen
};
//SIG(1 ee20061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee20061 ::foo(){vfunc_called(this, "_ZN7ee200613fooEv");}
ee20061 ::~ee20061(){ note_dtor("ee20061", this);} // tgen
ee20061 ::ee20061(){ note_ctor("ee20061", this);} // tgen

static void Test_ee20061()
{
  extern Class_Descriptor cd_ee20061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20061, buf);
    ee20061 *dp, &lv = *(dp=new (buf) ee20061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), 0, "ee20061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), 0, "ee20061");
    check_base_class_offset(lv, (cc061*)(dd0061*), 0, "ee20061");
    check_base_class_offset(lv, (dd0061*), 0, "ee20061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20061.e");
    test_class_info(&lv, &cd_ee20061);
    dp->~ee20061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20061(Test_ee20061, "ee20061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20061C1Ev();
extern void _ZN7ee20061D1Ev();
Name_Map name_map_ee20061[] = {
  NSPAIR(_ZN7ee20061C1Ev),
  NSPAIR(_ZN7ee20061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee20061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20061[];
extern void _ZN7ee200613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee20061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20061[0]),
  (VTBL_ENTRY)&_ZN7ee200613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee20061[];
extern  VTBL_ENTRY _ZTV7ee20061[];
Class_Descriptor cd_ee20061 = {  "ee20061", // class name
  bases_ee20061, 4,
  &(vtc_ee20061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20061),4, //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  ee30061  : virtual dd0061 {
  int e;
  virtual void  foo(); // _ZN7ee300613fooEv
  ~ee30061(); // tgen
  ee30061(); // tgen
};
//SIG(1 ee30061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee30061 ::foo(){vfunc_called(this, "_ZN7ee300613fooEv");}
ee30061 ::~ee30061(){ note_dtor("ee30061", this);} // tgen
ee30061 ::ee30061(){ note_ctor("ee30061", this);} // tgen

static void Test_ee30061()
{
  extern Class_Descriptor cd_ee30061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30061, buf);
    ee30061 *dp, &lv = *(dp=new (buf) ee30061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee30061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee30061");
    check_base_class_offset(lv, (cc061*)(dd0061*), ABISELECT(16,8), "ee30061");
    check_base_class_offset(lv, (dd0061*), ABISELECT(16,8), "ee30061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30061.e");
    test_class_info(&lv, &cd_ee30061);
    dp->~ee30061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30061(Test_ee30061, "ee30061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30061C1Ev();
extern void _ZN7ee30061D1Ev();
Name_Map name_map_ee30061[] = {
  NSPAIR(_ZN7ee30061C1Ev),
  NSPAIR(_ZN7ee30061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee30061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30061[];
extern void _ZN7ee300613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee300613fooEv,_ZTv0_n12_N7ee300613fooEv)();
extern void ABISELECT(_ZThn16_N7ee300613fooEv,_ZThn8_N7ee300613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee30061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30061[0]),
  (VTBL_ENTRY)&_ZN7ee300613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee300613fooEv,_ZTv0_n12_N7ee300613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee30061[];
static  VTT_ENTRY vtt_ee30061[] = {
  {&(_ZTV7ee30061[3]),  3,10},
  {&(_ZTV7ee30061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30061[];
extern  VTBL_ENTRY _ZTV7ee30061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30061[];
static VTBL_ENTRY alt_thunk_names466[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee300613fooEv,_ZTv0_n12_N7ee300613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee300613fooEv,_ZThn8_N7ee300613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30061 = {  "ee30061", // class name
  bases_ee30061, 4,
  &(vtc_ee30061[0]), // expected_vtbl_contents
  &(vtt_ee30061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30061),2, //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  ee40061  : dd0061 {
  int e;
  virtual void  bar(); // _ZN7ee400613barEv
  ~ee40061(); // tgen
  ee40061(); // tgen
};
//SIG(1 ee40061) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee40061 ::bar(){vfunc_called(this, "_ZN7ee400613barEv");}
ee40061 ::~ee40061(){ note_dtor("ee40061", this);} // tgen
ee40061 ::ee40061(){ note_ctor("ee40061", this);} // tgen

static void Test_ee40061()
{
  extern Class_Descriptor cd_ee40061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40061, buf);
    ee40061 *dp, &lv = *(dp=new (buf) ee40061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), 0, "ee40061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), 0, "ee40061");
    check_base_class_offset(lv, (cc061*)(dd0061*), 0, "ee40061");
    check_base_class_offset(lv, (dd0061*), 0, "ee40061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40061.e");
    test_class_info(&lv, &cd_ee40061);
    dp->~ee40061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40061(Test_ee40061, "ee40061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40061C1Ev();
extern void _ZN7ee40061D1Ev();
Name_Map name_map_ee40061[] = {
  NSPAIR(_ZN7ee40061C1Ev),
  NSPAIR(_ZN7ee40061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee40061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40061[];
extern void _ZN4bb613fooEv();
extern void _ZN7ee400613barEv();
static  VTBL_ENTRY vtc_ee40061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN7ee400613barEv,
};
extern VTBL_ENTRY _ZTI7ee40061[];
extern  VTBL_ENTRY _ZTV7ee40061[];
Class_Descriptor cd_ee40061 = {  "ee40061", // class name
  bases_ee40061, 4,
  &(vtc_ee40061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40061),4, //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  ee50061  : virtual dd0061 {
  int e;
  virtual void  bar(); // _ZN7ee500613barEv
  ~ee50061(); // tgen
  ee50061(); // tgen
};
//SIG(1 ee50061) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee50061 ::bar(){vfunc_called(this, "_ZN7ee500613barEv");}
ee50061 ::~ee50061(){ note_dtor("ee50061", this);} // tgen
ee50061 ::ee50061(){ note_ctor("ee50061", this);} // tgen

static void Test_ee50061()
{
  extern Class_Descriptor cd_ee50061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50061, buf);
    ee50061 *dp, &lv = *(dp=new (buf) ee50061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee50061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee50061");
    check_base_class_offset(lv, (cc061*)(dd0061*), ABISELECT(16,8), "ee50061");
    check_base_class_offset(lv, (dd0061*), ABISELECT(16,8), "ee50061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50061.e");
    test_class_info(&lv, &cd_ee50061);
    dp->~ee50061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50061(Test_ee50061, "ee50061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50061C1Ev();
extern void _ZN7ee50061D1Ev();
Name_Map name_map_ee50061[] = {
  NSPAIR(_ZN7ee50061C1Ev),
  NSPAIR(_ZN7ee50061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee50061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50061[];
extern void _ZN7ee500613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee500613barEv,_ZTv0_n16_N7ee500613barEv)();
extern void ABISELECT(_ZThn16_N7ee500613barEv,_ZThn8_N7ee500613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50061[0]),
  (VTBL_ENTRY)&_ZN7ee500613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee500613barEv,_ZTv0_n16_N7ee500613barEv),
};
extern VTBL_ENTRY _ZTV7ee50061[];
static  VTT_ENTRY vtt_ee50061[] = {
  {&(_ZTV7ee50061[3]),  3,10},
  {&(_ZTV7ee50061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50061[];
extern  VTBL_ENTRY _ZTV7ee50061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50061[];
static VTBL_ENTRY alt_thunk_names467[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee500613barEv,_ZTv0_n16_N7ee500613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee500613barEv,_ZThn8_N7ee500613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50061 = {  "ee50061", // class name
  bases_ee50061, 4,
  &(vtc_ee50061[0]), // expected_vtbl_contents
  &(vtt_ee50061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names467,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60061  : dd0061 {
  int e;
  virtual void  foo(); // _ZN7ee600613fooEv
  virtual void  bar(); // _ZN7ee600613barEv
  ~ee60061(); // tgen
  ee60061(); // tgen
};
//SIG(1 ee60061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee60061 ::foo(){vfunc_called(this, "_ZN7ee600613fooEv");}
void  ee60061 ::bar(){vfunc_called(this, "_ZN7ee600613barEv");}
ee60061 ::~ee60061(){ note_dtor("ee60061", this);} // tgen
ee60061 ::ee60061(){ note_ctor("ee60061", this);} // tgen

static void Test_ee60061()
{
  extern Class_Descriptor cd_ee60061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60061, buf);
    ee60061 *dp, &lv = *(dp=new (buf) ee60061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), 0, "ee60061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), 0, "ee60061");
    check_base_class_offset(lv, (cc061*)(dd0061*), 0, "ee60061");
    check_base_class_offset(lv, (dd0061*), 0, "ee60061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60061.e");
    test_class_info(&lv, &cd_ee60061);
    dp->~ee60061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60061(Test_ee60061, "ee60061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60061C1Ev();
extern void _ZN7ee60061D1Ev();
Name_Map name_map_ee60061[] = {
  NSPAIR(_ZN7ee60061C1Ev),
  NSPAIR(_ZN7ee60061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee60061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60061[];
extern void _ZN7ee600613fooEv();
extern void _ZN7ee600613barEv();
static  VTBL_ENTRY vtc_ee60061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60061[0]),
  (VTBL_ENTRY)&_ZN7ee600613fooEv,
  (VTBL_ENTRY)&_ZN7ee600613barEv,
};
extern VTBL_ENTRY _ZTI7ee60061[];
extern  VTBL_ENTRY _ZTV7ee60061[];
Class_Descriptor cd_ee60061 = {  "ee60061", // class name
  bases_ee60061, 4,
  &(vtc_ee60061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60061),4, //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  ee70061  : virtual dd0061 {
  int e;
  virtual void  foo(); // _ZN7ee700613fooEv
  virtual void  bar(); // _ZN7ee700613barEv
  ~ee70061(); // tgen
  ee70061(); // tgen
};
//SIG(1 ee70061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee70061 ::foo(){vfunc_called(this, "_ZN7ee700613fooEv");}
void  ee70061 ::bar(){vfunc_called(this, "_ZN7ee700613barEv");}
ee70061 ::~ee70061(){ note_dtor("ee70061", this);} // tgen
ee70061 ::ee70061(){ note_ctor("ee70061", this);} // tgen

static void Test_ee70061()
{
  extern Class_Descriptor cd_ee70061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70061, buf);
    ee70061 *dp, &lv = *(dp=new (buf) ee70061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee70061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd0061*), ABISELECT(16,8), "ee70061");
    check_base_class_offset(lv, (cc061*)(dd0061*), ABISELECT(16,8), "ee70061");
    check_base_class_offset(lv, (dd0061*), ABISELECT(16,8), "ee70061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70061.e");
    test_class_info(&lv, &cd_ee70061);
    dp->~ee70061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70061(Test_ee70061, "ee70061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70061C1Ev();
extern void _ZN7ee70061D1Ev();
Name_Map name_map_ee70061[] = {
  NSPAIR(_ZN7ee70061C1Ev),
  NSPAIR(_ZN7ee70061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd0061;
extern VTBL_ENTRY _ZTI6dd0061[];
extern  VTBL_ENTRY _ZTV6dd0061[];
static Base_Class bases_ee70061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70061[];
extern void _ZN7ee700613fooEv();
extern void _ZN7ee700613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee700613fooEv,_ZTv0_n12_N7ee700613fooEv)();
extern void ABISELECT(_ZThn16_N7ee700613fooEv,_ZThn8_N7ee700613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee700613barEv,_ZTv0_n16_N7ee700613barEv)();
extern void ABISELECT(_ZThn16_N7ee700613barEv,_ZThn8_N7ee700613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70061[0]),
  (VTBL_ENTRY)&_ZN7ee700613fooEv,
  (VTBL_ENTRY)&_ZN7ee700613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee700613fooEv,_ZTv0_n12_N7ee700613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee700613barEv,_ZTv0_n16_N7ee700613barEv),
};
extern VTBL_ENTRY _ZTV7ee70061[];
static  VTT_ENTRY vtt_ee70061[] = {
  {&(_ZTV7ee70061[3]),  3,11},
  {&(_ZTV7ee70061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70061[];
extern  VTBL_ENTRY _ZTV7ee70061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70061[];
static VTBL_ENTRY alt_thunk_names468[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee700613barEv,_ZTv0_n16_N7ee700613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee700613barEv,_ZThn8_N7ee700613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee700613fooEv,_ZTv0_n12_N7ee700613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee700613fooEv,_ZThn8_N7ee700613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70061 = {  "ee70061", // class name
  bases_ee70061, 4,
  &(vtc_ee70061[0]), // expected_vtbl_contents
  &(vtt_ee70061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70061),2, //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  dd1061  : virtual cc061 {
  int d;
  ~dd1061(); // tgen
  dd1061(); // tgen
};
//SIG(-1 dd1061) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} Fi}


dd1061 ::~dd1061(){ note_dtor("dd1061", this);} // tgen
dd1061 ::dd1061(){ note_ctor("dd1061", this);} // tgen

static void Test_dd1061()
{
  extern Class_Descriptor cd_dd1061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1061, buf);
    dd1061 *dp, &lv = *(dp=new (buf) dd1061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,8), "dd1061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,8), "dd1061");
    check_base_class_offset(lv, (cc061*), ABISELECT(16,8), "dd1061");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1061.d");
    test_class_info(&lv, &cd_dd1061);
    dp->~dd1061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1061(Test_dd1061, "dd1061", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1061C1Ev();
extern void _ZN6dd1061D1Ev();
Name_Map name_map_dd1061[] = {
  NSPAIR(_ZN6dd1061C1Ev),
  NSPAIR(_ZN6dd1061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd1061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1061[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd1061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd1061[];
static  VTT_ENTRY vtt_dd1061[] = {
  {&(_ZTV6dd1061[3]),  3,9},
  {&(_ZTV6dd1061[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
Class_Descriptor cd_dd1061 = {  "dd1061", // class name
  bases_dd1061, 3,
  &(vtc_dd1061[0]), // expected_vtbl_contents
  &(vtt_dd1061[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1061),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1061),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  ee01061  : dd1061 {
  int e;
  ~ee01061(); // tgen
  ee01061(); // tgen
};
//SIG(1 ee01061) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee01061 ::~ee01061(){ note_dtor("ee01061", this);} // tgen
ee01061 ::ee01061(){ note_ctor("ee01061", this);} // tgen

static void Test_ee01061()
{
  extern Class_Descriptor cd_ee01061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01061, buf);
    ee01061 *dp, &lv = *(dp=new (buf) ee01061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee01061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee01061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(16,12), "ee01061");
    check_base_class_offset(lv, (dd1061*), 0, "ee01061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01061.e");
    test_class_info(&lv, &cd_ee01061);
    dp->~ee01061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01061(Test_ee01061, "ee01061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01061C1Ev();
extern void _ZN7ee01061D1Ev();
Name_Map name_map_ee01061[] = {
  NSPAIR(_ZN7ee01061C1Ev),
  NSPAIR(_ZN7ee01061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee01061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01061[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee01061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01061[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee01061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee01061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee01061[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee01061[] = {
  {&(_ZTV7ee01061[3]),  3,9},
  {&(_tg__ZTV6dd1061__7ee01061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee01061[4]),  4,6},
  {&(_ZTV7ee01061[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01061[];
extern  VTBL_ENTRY _ZTV7ee01061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01061[];
Class_Descriptor cd_ee01061 = {  "ee01061", // class name
  bases_ee01061, 4,
  &(vtc_ee01061[0]), // expected_vtbl_contents
  &(vtt_ee01061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01061),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01061),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  ee11061  : virtual dd1061 {
  int e;
  ~ee11061(); // tgen
  ee11061(); // tgen
};
//SIG(1 ee11061) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee11061 ::~ee11061(){ note_dtor("ee11061", this);} // tgen
ee11061 ::ee11061(){ note_ctor("ee11061", this);} // tgen

static void Test_ee11061()
{
  extern Class_Descriptor cd_ee11061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11061, buf);
    ee11061 *dp, &lv = *(dp=new (buf) ee11061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee11061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee11061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(32,16), "ee11061");
    check_base_class_offset(lv, (dd1061*), ABISELECT(16,8), "ee11061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11061.e");
    test_class_info(&lv, &cd_ee11061);
    dp->~ee11061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11061(Test_ee11061, "ee11061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11061C1Ev();
extern void _ZN7ee11061D1Ev();
Name_Map name_map_ee11061[] = {
  NSPAIR(_ZN7ee11061C1Ev),
  NSPAIR(_ZN7ee11061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee11061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11061[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee11061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11061[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11061[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee11061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee11061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee11061[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee11061[] = {
  {&(_ZTV7ee11061[4]),  4,13},
  {&(_ZTV7ee11061[7]),  7,13},
  {&(_ZTV7ee11061[11]),  11,13},
  {&(_tg__ZTV6dd1061__7ee11061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee11061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11061[];
extern  VTBL_ENTRY _ZTV7ee11061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11061[];
Class_Descriptor cd_ee11061 = {  "ee11061", // class name
  bases_ee11061, 4,
  &(vtc_ee11061[0]), // expected_vtbl_contents
  &(vtt_ee11061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11061),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11061),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  ee21061  : dd1061 {
  int e;
  virtual void  foo(); // _ZN7ee210613fooEv
  ~ee21061(); // tgen
  ee21061(); // tgen
};
//SIG(1 ee21061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee21061 ::foo(){vfunc_called(this, "_ZN7ee210613fooEv");}
ee21061 ::~ee21061(){ note_dtor("ee21061", this);} // tgen
ee21061 ::ee21061(){ note_ctor("ee21061", this);} // tgen

static void Test_ee21061()
{
  extern Class_Descriptor cd_ee21061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21061, buf);
    ee21061 *dp, &lv = *(dp=new (buf) ee21061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee21061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee21061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(16,12), "ee21061");
    check_base_class_offset(lv, (dd1061*), 0, "ee21061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21061.e");
    test_class_info(&lv, &cd_ee21061);
    dp->~ee21061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21061(Test_ee21061, "ee21061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21061C1Ev();
extern void _ZN7ee21061D1Ev();
Name_Map name_map_ee21061[] = {
  NSPAIR(_ZN7ee21061C1Ev),
  NSPAIR(_ZN7ee21061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee21061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21061[];
extern void _ZN7ee210613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee210613fooEv,_ZTv0_n12_N7ee210613fooEv)();
extern void ABISELECT(_ZThn16_N7ee210613fooEv,_ZThn12_N7ee210613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee21061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21061[0]),
  (VTBL_ENTRY)&_ZN7ee210613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee210613fooEv,_ZTv0_n12_N7ee210613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee21061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee21061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee21061[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee21061[] = {
  {&(_ZTV7ee21061[3]),  3,10},
  {&(_tg__ZTV6dd1061__7ee21061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee21061[4]),  4,6},
  {&(_ZTV7ee21061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21061[];
extern  VTBL_ENTRY _ZTV7ee21061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21061[];
static VTBL_ENTRY alt_thunk_names469[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee210613fooEv,_ZTv0_n12_N7ee210613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee210613fooEv,_ZThn12_N7ee210613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21061 = {  "ee21061", // class name
  bases_ee21061, 4,
  &(vtc_ee21061[0]), // expected_vtbl_contents
  &(vtt_ee21061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21061),4, //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  ee31061  : virtual dd1061 {
  int e;
  virtual void  foo(); // _ZN7ee310613fooEv
  ~ee31061(); // tgen
  ee31061(); // tgen
};
//SIG(1 ee31061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee31061 ::foo(){vfunc_called(this, "_ZN7ee310613fooEv");}
ee31061 ::~ee31061(){ note_dtor("ee31061", this);} // tgen
ee31061 ::ee31061(){ note_ctor("ee31061", this);} // tgen

static void Test_ee31061()
{
  extern Class_Descriptor cd_ee31061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31061, buf);
    ee31061 *dp, &lv = *(dp=new (buf) ee31061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee31061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee31061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(32,16), "ee31061");
    check_base_class_offset(lv, (dd1061*), ABISELECT(16,8), "ee31061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31061.e");
    test_class_info(&lv, &cd_ee31061);
    dp->~ee31061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31061(Test_ee31061, "ee31061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31061C1Ev();
extern void _ZN7ee31061D1Ev();
Name_Map name_map_ee31061[] = {
  NSPAIR(_ZN7ee31061C1Ev),
  NSPAIR(_ZN7ee31061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee31061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31061[];
extern void _ZN7ee310613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee310613fooEv,_ZTv0_n12_N7ee310613fooEv)();
extern void ABISELECT(_ZThn32_N7ee310613fooEv,_ZThn16_N7ee310613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee31061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31061[0]),
  (VTBL_ENTRY)&_ZN7ee310613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31061[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee310613fooEv,_ZTv0_n12_N7ee310613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee31061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee31061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee31061[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee31061[] = {
  {&(_ZTV7ee31061[4]),  4,14},
  {&(_ZTV7ee31061[8]),  8,14},
  {&(_ZTV7ee31061[12]),  12,14},
  {&(_tg__ZTV6dd1061__7ee31061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee31061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31061[];
extern  VTBL_ENTRY _ZTV7ee31061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31061[];
static VTBL_ENTRY alt_thunk_names470[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee310613fooEv,_ZTv0_n12_N7ee310613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee310613fooEv,_ZThn16_N7ee310613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31061 = {  "ee31061", // class name
  bases_ee31061, 4,
  &(vtc_ee31061[0]), // expected_vtbl_contents
  &(vtt_ee31061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31061),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31061),5, //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  ee41061  : dd1061 {
  int e;
  virtual void  bar(); // _ZN7ee410613barEv
  ~ee41061(); // tgen
  ee41061(); // tgen
};
//SIG(1 ee41061) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee41061 ::bar(){vfunc_called(this, "_ZN7ee410613barEv");}
ee41061 ::~ee41061(){ note_dtor("ee41061", this);} // tgen
ee41061 ::ee41061(){ note_ctor("ee41061", this);} // tgen

static void Test_ee41061()
{
  extern Class_Descriptor cd_ee41061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41061, buf);
    ee41061 *dp, &lv = *(dp=new (buf) ee41061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee41061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee41061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(16,12), "ee41061");
    check_base_class_offset(lv, (dd1061*), 0, "ee41061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41061.e");
    test_class_info(&lv, &cd_ee41061);
    dp->~ee41061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41061(Test_ee41061, "ee41061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41061C1Ev();
extern void _ZN7ee41061D1Ev();
Name_Map name_map_ee41061[] = {
  NSPAIR(_ZN7ee41061C1Ev),
  NSPAIR(_ZN7ee41061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee41061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41061[];
extern void _ZN7ee410613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee410613barEv,_ZTv0_n16_N7ee410613barEv)();
extern void ABISELECT(_ZThn16_N7ee410613barEv,_ZThn12_N7ee410613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41061[0]),
  (VTBL_ENTRY)&_ZN7ee410613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee410613barEv,_ZTv0_n16_N7ee410613barEv),
};
extern VTBL_ENTRY _ZTV7ee41061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee41061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee41061[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee41061[] = {
  {&(_ZTV7ee41061[3]),  3,10},
  {&(_tg__ZTV6dd1061__7ee41061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee41061[4]),  4,6},
  {&(_ZTV7ee41061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41061[];
extern  VTBL_ENTRY _ZTV7ee41061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41061[];
static VTBL_ENTRY alt_thunk_names471[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee410613barEv,_ZTv0_n16_N7ee410613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee410613barEv,_ZThn12_N7ee410613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41061 = {  "ee41061", // class name
  bases_ee41061, 4,
  &(vtc_ee41061[0]), // expected_vtbl_contents
  &(vtt_ee41061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41061),4, //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  ee51061  : virtual dd1061 {
  int e;
  virtual void  bar(); // _ZN7ee510613barEv
  ~ee51061(); // tgen
  ee51061(); // tgen
};
//SIG(1 ee51061) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee51061 ::bar(){vfunc_called(this, "_ZN7ee510613barEv");}
ee51061 ::~ee51061(){ note_dtor("ee51061", this);} // tgen
ee51061 ::ee51061(){ note_ctor("ee51061", this);} // tgen

static void Test_ee51061()
{
  extern Class_Descriptor cd_ee51061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51061, buf);
    ee51061 *dp, &lv = *(dp=new (buf) ee51061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee51061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee51061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(32,16), "ee51061");
    check_base_class_offset(lv, (dd1061*), ABISELECT(16,8), "ee51061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51061.e");
    test_class_info(&lv, &cd_ee51061);
    dp->~ee51061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51061(Test_ee51061, "ee51061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51061C1Ev();
extern void _ZN7ee51061D1Ev();
Name_Map name_map_ee51061[] = {
  NSPAIR(_ZN7ee51061C1Ev),
  NSPAIR(_ZN7ee51061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee51061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51061[];
extern void _ZN7ee510613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee510613barEv,_ZTv0_n16_N7ee510613barEv)();
extern void ABISELECT(_ZThn32_N7ee510613barEv,_ZThn16_N7ee510613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51061[0]),
  (VTBL_ENTRY)&_ZN7ee510613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51061[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee510613barEv,_ZTv0_n16_N7ee510613barEv),
};
extern VTBL_ENTRY _ZTV7ee51061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee51061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee51061[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee51061[] = {
  {&(_ZTV7ee51061[4]),  4,14},
  {&(_ZTV7ee51061[8]),  8,14},
  {&(_ZTV7ee51061[12]),  12,14},
  {&(_tg__ZTV6dd1061__7ee51061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee51061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51061[];
extern  VTBL_ENTRY _ZTV7ee51061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51061[];
static VTBL_ENTRY alt_thunk_names472[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee510613barEv,_ZTv0_n16_N7ee510613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee510613barEv,_ZThn16_N7ee510613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51061 = {  "ee51061", // class name
  bases_ee51061, 4,
  &(vtc_ee51061[0]), // expected_vtbl_contents
  &(vtt_ee51061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51061),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names472,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61061  : dd1061 {
  int e;
  virtual void  foo(); // _ZN7ee610613fooEv
  virtual void  bar(); // _ZN7ee610613barEv
  ~ee61061(); // tgen
  ee61061(); // tgen
};
//SIG(1 ee61061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee61061 ::foo(){vfunc_called(this, "_ZN7ee610613fooEv");}
void  ee61061 ::bar(){vfunc_called(this, "_ZN7ee610613barEv");}
ee61061 ::~ee61061(){ note_dtor("ee61061", this);} // tgen
ee61061 ::ee61061(){ note_ctor("ee61061", this);} // tgen

static void Test_ee61061()
{
  extern Class_Descriptor cd_ee61061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61061, buf);
    ee61061 *dp, &lv = *(dp=new (buf) ee61061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee61061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee61061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(16,12), "ee61061");
    check_base_class_offset(lv, (dd1061*), 0, "ee61061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61061.e");
    test_class_info(&lv, &cd_ee61061);
    dp->~ee61061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61061(Test_ee61061, "ee61061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61061C1Ev();
extern void _ZN7ee61061D1Ev();
Name_Map name_map_ee61061[] = {
  NSPAIR(_ZN7ee61061C1Ev),
  NSPAIR(_ZN7ee61061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee61061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61061[];
extern void _ZN7ee610613fooEv();
extern void _ZN7ee610613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee610613fooEv,_ZTv0_n12_N7ee610613fooEv)();
extern void ABISELECT(_ZThn16_N7ee610613fooEv,_ZThn12_N7ee610613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee610613barEv,_ZTv0_n16_N7ee610613barEv)();
extern void ABISELECT(_ZThn16_N7ee610613barEv,_ZThn12_N7ee610613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61061[0]),
  (VTBL_ENTRY)&_ZN7ee610613fooEv,
  (VTBL_ENTRY)&_ZN7ee610613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee610613fooEv,_ZTv0_n12_N7ee610613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee610613barEv,_ZTv0_n16_N7ee610613barEv),
};
extern VTBL_ENTRY _ZTV7ee61061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee61061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee61061[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee61061[] = {
  {&(_ZTV7ee61061[3]),  3,11},
  {&(_tg__ZTV6dd1061__7ee61061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee61061[4]),  4,6},
  {&(_ZTV7ee61061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61061[];
extern  VTBL_ENTRY _ZTV7ee61061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61061[];
static VTBL_ENTRY alt_thunk_names473[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee610613barEv,_ZTv0_n16_N7ee610613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee610613barEv,_ZThn12_N7ee610613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee610613fooEv,_ZTv0_n12_N7ee610613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee610613fooEv,_ZThn12_N7ee610613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61061 = {  "ee61061", // class name
  bases_ee61061, 4,
  &(vtc_ee61061[0]), // expected_vtbl_contents
  &(vtt_ee61061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61061),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names473,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71061  : virtual dd1061 {
  int e;
  virtual void  foo(); // _ZN7ee710613fooEv
  virtual void  bar(); // _ZN7ee710613barEv
  ~ee71061(); // tgen
  ee71061(); // tgen
};
//SIG(1 ee71061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee71061 ::foo(){vfunc_called(this, "_ZN7ee710613fooEv");}
void  ee71061 ::bar(){vfunc_called(this, "_ZN7ee710613barEv");}
ee71061 ::~ee71061(){ note_dtor("ee71061", this);} // tgen
ee71061 ::ee71061(){ note_ctor("ee71061", this);} // tgen

static void Test_ee71061()
{
  extern Class_Descriptor cd_ee71061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71061, buf);
    ee71061 *dp, &lv = *(dp=new (buf) ee71061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee71061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee71061");
    check_base_class_offset(lv, (cc061*)(dd1061*), ABISELECT(32,16), "ee71061");
    check_base_class_offset(lv, (dd1061*), ABISELECT(16,8), "ee71061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71061.e");
    test_class_info(&lv, &cd_ee71061);
    dp->~ee71061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71061(Test_ee71061, "ee71061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71061C1Ev();
extern void _ZN7ee71061D1Ev();
Name_Map name_map_ee71061[] = {
  NSPAIR(_ZN7ee71061C1Ev),
  NSPAIR(_ZN7ee71061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd1061;
extern VTBL_ENTRY _ZTI6dd1061[];
extern  VTBL_ENTRY _ZTV6dd1061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1061[];
static Base_Class bases_ee71061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1061,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71061[];
extern void _ZN7ee710613fooEv();
extern void _ZN7ee710613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee710613fooEv,_ZTv0_n12_N7ee710613fooEv)();
extern void ABISELECT(_ZThn32_N7ee710613fooEv,_ZThn16_N7ee710613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee710613barEv,_ZTv0_n16_N7ee710613barEv)();
extern void ABISELECT(_ZThn32_N7ee710613barEv,_ZThn16_N7ee710613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71061[0]),
  (VTBL_ENTRY)&_ZN7ee710613fooEv,
  (VTBL_ENTRY)&_ZN7ee710613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71061[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee710613fooEv,_ZTv0_n12_N7ee710613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee710613barEv,_ZTv0_n16_N7ee710613barEv),
};
extern VTBL_ENTRY _ZTV7ee71061[];
static  VTBL_ENTRY _tg__ZTV6dd1061__7ee71061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd1061__7ee71061[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee71061[] = {
  {&(_ZTV7ee71061[4]),  4,15},
  {&(_ZTV7ee71061[9]),  9,15},
  {&(_ZTV7ee71061[13]),  13,15},
  {&(_tg__ZTV6dd1061__7ee71061[3]),  3,3},
  {&(_tg__ZTV4bb615cc061__6dd1061__7ee71061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71061[];
extern  VTBL_ENTRY _ZTV7ee71061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71061[];
static VTBL_ENTRY alt_thunk_names474[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee710613barEv,_ZTv0_n16_N7ee710613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee710613barEv,_ZThn16_N7ee710613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee710613fooEv,_ZTv0_n12_N7ee710613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee710613fooEv,_ZThn16_N7ee710613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71061 = {  "ee71061", // class name
  bases_ee71061, 4,
  &(vtc_ee71061[0]), // expected_vtbl_contents
  &(vtt_ee71061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71061),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names474,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2061  : cc061 {
  int d;
  virtual void  foo(); // _ZN6dd20613fooEv
  ~dd2061(); // tgen
  dd2061(); // tgen
};
//SIG(-1 dd2061) C1{ BC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd2061 ::foo(){vfunc_called(this, "_ZN6dd20613fooEv");}
dd2061 ::~dd2061(){ note_dtor("dd2061", this);} // tgen
dd2061 ::dd2061(){ note_ctor("dd2061", this);} // tgen

static void Test_dd2061()
{
  extern Class_Descriptor cd_dd2061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2061, buf);
    dd2061 *dp, &lv = *(dp=new (buf) dd2061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), 0, "dd2061");
    check_base_class_offset(lv, (bb61*)(cc061*), 0, "dd2061");
    check_base_class_offset(lv, (cc061*), 0, "dd2061");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2061.d");
    test_class_info(&lv, &cd_dd2061);
    dp->~dd2061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2061(Test_dd2061, "dd2061", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2061C1Ev();
extern void _ZN6dd2061D1Ev();
Name_Map name_map_dd2061[] = {
  NSPAIR(_ZN6dd2061C1Ev),
  NSPAIR(_ZN6dd2061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd2061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2061[];
extern void _ZN6dd20613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd2061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2061[0]),
  (VTBL_ENTRY)&_ZN6dd20613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
Class_Descriptor cd_dd2061 = {  "dd2061", // class name
  bases_dd2061, 3,
  &(vtc_dd2061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2061),4, //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  ee02061  : dd2061 {
  int e;
  ~ee02061(); // tgen
  ee02061(); // tgen
};
//SIG(1 ee02061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee02061 ::~ee02061(){ note_dtor("ee02061", this);} // tgen
ee02061 ::ee02061(){ note_ctor("ee02061", this);} // tgen

static void Test_ee02061()
{
  extern Class_Descriptor cd_ee02061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02061, buf);
    ee02061 *dp, &lv = *(dp=new (buf) ee02061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), 0, "ee02061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), 0, "ee02061");
    check_base_class_offset(lv, (cc061*)(dd2061*), 0, "ee02061");
    check_base_class_offset(lv, (dd2061*), 0, "ee02061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02061.e");
    test_class_info(&lv, &cd_ee02061);
    dp->~ee02061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02061(Test_ee02061, "ee02061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02061C1Ev();
extern void _ZN7ee02061D1Ev();
Name_Map name_map_ee02061[] = {
  NSPAIR(_ZN7ee02061C1Ev),
  NSPAIR(_ZN7ee02061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee02061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02061[];
extern void _ZN6dd20613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee02061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02061[0]),
  (VTBL_ENTRY)&_ZN6dd20613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee02061[];
extern  VTBL_ENTRY _ZTV7ee02061[];
Class_Descriptor cd_ee02061 = {  "ee02061", // class name
  bases_ee02061, 4,
  &(vtc_ee02061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02061),4, //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  ee12061  : virtual dd2061 {
  int e;
  ~ee12061(); // tgen
  ee12061(); // tgen
};
//SIG(1 ee12061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee12061 ::~ee12061(){ note_dtor("ee12061", this);} // tgen
ee12061 ::ee12061(){ note_ctor("ee12061", this);} // tgen

static void Test_ee12061()
{
  extern Class_Descriptor cd_ee12061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12061, buf);
    ee12061 *dp, &lv = *(dp=new (buf) ee12061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee12061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee12061");
    check_base_class_offset(lv, (cc061*)(dd2061*), ABISELECT(16,8), "ee12061");
    check_base_class_offset(lv, (dd2061*), ABISELECT(16,8), "ee12061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12061.e");
    test_class_info(&lv, &cd_ee12061);
    dp->~ee12061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12061(Test_ee12061, "ee12061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12061C1Ev();
extern void _ZN7ee12061D1Ev();
Name_Map name_map_ee12061[] = {
  NSPAIR(_ZN7ee12061C1Ev),
  NSPAIR(_ZN7ee12061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee12061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12061[];
extern void _ZN6dd20613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee12061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12061[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12061[0]),
  (VTBL_ENTRY)&_ZN6dd20613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee12061[];
static  VTT_ENTRY vtt_ee12061[] = {
  {&(_ZTV7ee12061[3]),  3,9},
  {&(_ZTV7ee12061[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12061[];
extern  VTBL_ENTRY _ZTV7ee12061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12061[];
Class_Descriptor cd_ee12061 = {  "ee12061", // class name
  bases_ee12061, 4,
  &(vtc_ee12061[0]), // expected_vtbl_contents
  &(vtt_ee12061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12061),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12061),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  ee22061  : dd2061 {
  int e;
  virtual void  foo(); // _ZN7ee220613fooEv
  ~ee22061(); // tgen
  ee22061(); // tgen
};
//SIG(1 ee22061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee22061 ::foo(){vfunc_called(this, "_ZN7ee220613fooEv");}
ee22061 ::~ee22061(){ note_dtor("ee22061", this);} // tgen
ee22061 ::ee22061(){ note_ctor("ee22061", this);} // tgen

static void Test_ee22061()
{
  extern Class_Descriptor cd_ee22061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22061, buf);
    ee22061 *dp, &lv = *(dp=new (buf) ee22061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), 0, "ee22061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), 0, "ee22061");
    check_base_class_offset(lv, (cc061*)(dd2061*), 0, "ee22061");
    check_base_class_offset(lv, (dd2061*), 0, "ee22061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22061.e");
    test_class_info(&lv, &cd_ee22061);
    dp->~ee22061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22061(Test_ee22061, "ee22061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22061C1Ev();
extern void _ZN7ee22061D1Ev();
Name_Map name_map_ee22061[] = {
  NSPAIR(_ZN7ee22061C1Ev),
  NSPAIR(_ZN7ee22061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee22061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22061[];
extern void _ZN7ee220613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee22061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22061[0]),
  (VTBL_ENTRY)&_ZN7ee220613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee22061[];
extern  VTBL_ENTRY _ZTV7ee22061[];
Class_Descriptor cd_ee22061 = {  "ee22061", // class name
  bases_ee22061, 4,
  &(vtc_ee22061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22061),4, //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  ee32061  : virtual dd2061 {
  int e;
  virtual void  foo(); // _ZN7ee320613fooEv
  ~ee32061(); // tgen
  ee32061(); // tgen
};
//SIG(1 ee32061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee32061 ::foo(){vfunc_called(this, "_ZN7ee320613fooEv");}
ee32061 ::~ee32061(){ note_dtor("ee32061", this);} // tgen
ee32061 ::ee32061(){ note_ctor("ee32061", this);} // tgen

static void Test_ee32061()
{
  extern Class_Descriptor cd_ee32061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32061, buf);
    ee32061 *dp, &lv = *(dp=new (buf) ee32061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee32061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee32061");
    check_base_class_offset(lv, (cc061*)(dd2061*), ABISELECT(16,8), "ee32061");
    check_base_class_offset(lv, (dd2061*), ABISELECT(16,8), "ee32061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32061.e");
    test_class_info(&lv, &cd_ee32061);
    dp->~ee32061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32061(Test_ee32061, "ee32061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32061C1Ev();
extern void _ZN7ee32061D1Ev();
Name_Map name_map_ee32061[] = {
  NSPAIR(_ZN7ee32061C1Ev),
  NSPAIR(_ZN7ee32061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee32061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32061[];
extern void _ZN7ee320613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee320613fooEv,_ZTv0_n12_N7ee320613fooEv)();
extern void ABISELECT(_ZThn16_N7ee320613fooEv,_ZThn8_N7ee320613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee32061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32061[0]),
  (VTBL_ENTRY)&_ZN7ee320613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee320613fooEv,_ZTv0_n12_N7ee320613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee32061[];
static  VTT_ENTRY vtt_ee32061[] = {
  {&(_ZTV7ee32061[3]),  3,10},
  {&(_ZTV7ee32061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32061[];
extern  VTBL_ENTRY _ZTV7ee32061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32061[];
static VTBL_ENTRY alt_thunk_names475[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee320613fooEv,_ZTv0_n12_N7ee320613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee320613fooEv,_ZThn8_N7ee320613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32061 = {  "ee32061", // class name
  bases_ee32061, 4,
  &(vtc_ee32061[0]), // expected_vtbl_contents
  &(vtt_ee32061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names475,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42061  : dd2061 {
  int e;
  virtual void  bar(); // _ZN7ee420613barEv
  ~ee42061(); // tgen
  ee42061(); // tgen
};
//SIG(1 ee42061) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee42061 ::bar(){vfunc_called(this, "_ZN7ee420613barEv");}
ee42061 ::~ee42061(){ note_dtor("ee42061", this);} // tgen
ee42061 ::ee42061(){ note_ctor("ee42061", this);} // tgen

static void Test_ee42061()
{
  extern Class_Descriptor cd_ee42061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42061, buf);
    ee42061 *dp, &lv = *(dp=new (buf) ee42061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), 0, "ee42061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), 0, "ee42061");
    check_base_class_offset(lv, (cc061*)(dd2061*), 0, "ee42061");
    check_base_class_offset(lv, (dd2061*), 0, "ee42061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42061.e");
    test_class_info(&lv, &cd_ee42061);
    dp->~ee42061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42061(Test_ee42061, "ee42061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42061C1Ev();
extern void _ZN7ee42061D1Ev();
Name_Map name_map_ee42061[] = {
  NSPAIR(_ZN7ee42061C1Ev),
  NSPAIR(_ZN7ee42061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee42061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42061[];
extern void _ZN6dd20613fooEv();
extern void _ZN7ee420613barEv();
static  VTBL_ENTRY vtc_ee42061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42061[0]),
  (VTBL_ENTRY)&_ZN6dd20613fooEv,
  (VTBL_ENTRY)&_ZN7ee420613barEv,
};
extern VTBL_ENTRY _ZTI7ee42061[];
extern  VTBL_ENTRY _ZTV7ee42061[];
Class_Descriptor cd_ee42061 = {  "ee42061", // class name
  bases_ee42061, 4,
  &(vtc_ee42061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42061),4, //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  ee52061  : virtual dd2061 {
  int e;
  virtual void  bar(); // _ZN7ee520613barEv
  ~ee52061(); // tgen
  ee52061(); // tgen
};
//SIG(1 ee52061) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee52061 ::bar(){vfunc_called(this, "_ZN7ee520613barEv");}
ee52061 ::~ee52061(){ note_dtor("ee52061", this);} // tgen
ee52061 ::ee52061(){ note_ctor("ee52061", this);} // tgen

static void Test_ee52061()
{
  extern Class_Descriptor cd_ee52061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52061, buf);
    ee52061 *dp, &lv = *(dp=new (buf) ee52061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee52061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee52061");
    check_base_class_offset(lv, (cc061*)(dd2061*), ABISELECT(16,8), "ee52061");
    check_base_class_offset(lv, (dd2061*), ABISELECT(16,8), "ee52061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52061.e");
    test_class_info(&lv, &cd_ee52061);
    dp->~ee52061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52061(Test_ee52061, "ee52061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52061C1Ev();
extern void _ZN7ee52061D1Ev();
Name_Map name_map_ee52061[] = {
  NSPAIR(_ZN7ee52061C1Ev),
  NSPAIR(_ZN7ee52061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee52061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52061[];
extern void _ZN7ee520613barEv();
extern void _ZN6dd20613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee520613barEv,_ZTv0_n16_N7ee520613barEv)();
extern void ABISELECT(_ZThn16_N7ee520613barEv,_ZThn8_N7ee520613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52061[0]),
  (VTBL_ENTRY)&_ZN7ee520613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52061[0]),
  (VTBL_ENTRY)&_ZN6dd20613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee520613barEv,_ZTv0_n16_N7ee520613barEv),
};
extern VTBL_ENTRY _ZTV7ee52061[];
static  VTT_ENTRY vtt_ee52061[] = {
  {&(_ZTV7ee52061[3]),  3,10},
  {&(_ZTV7ee52061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52061[];
extern  VTBL_ENTRY _ZTV7ee52061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52061[];
static VTBL_ENTRY alt_thunk_names476[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee520613barEv,_ZTv0_n16_N7ee520613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee520613barEv,_ZThn8_N7ee520613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52061 = {  "ee52061", // class name
  bases_ee52061, 4,
  &(vtc_ee52061[0]), // expected_vtbl_contents
  &(vtt_ee52061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names476,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62061  : dd2061 {
  int e;
  virtual void  foo(); // _ZN7ee620613fooEv
  virtual void  bar(); // _ZN7ee620613barEv
  ~ee62061(); // tgen
  ee62061(); // tgen
};
//SIG(1 ee62061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee62061 ::foo(){vfunc_called(this, "_ZN7ee620613fooEv");}
void  ee62061 ::bar(){vfunc_called(this, "_ZN7ee620613barEv");}
ee62061 ::~ee62061(){ note_dtor("ee62061", this);} // tgen
ee62061 ::ee62061(){ note_ctor("ee62061", this);} // tgen

static void Test_ee62061()
{
  extern Class_Descriptor cd_ee62061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62061, buf);
    ee62061 *dp, &lv = *(dp=new (buf) ee62061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), 0, "ee62061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), 0, "ee62061");
    check_base_class_offset(lv, (cc061*)(dd2061*), 0, "ee62061");
    check_base_class_offset(lv, (dd2061*), 0, "ee62061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62061.e");
    test_class_info(&lv, &cd_ee62061);
    dp->~ee62061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62061(Test_ee62061, "ee62061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62061C1Ev();
extern void _ZN7ee62061D1Ev();
Name_Map name_map_ee62061[] = {
  NSPAIR(_ZN7ee62061C1Ev),
  NSPAIR(_ZN7ee62061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee62061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62061[];
extern void _ZN7ee620613fooEv();
extern void _ZN7ee620613barEv();
static  VTBL_ENTRY vtc_ee62061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62061[0]),
  (VTBL_ENTRY)&_ZN7ee620613fooEv,
  (VTBL_ENTRY)&_ZN7ee620613barEv,
};
extern VTBL_ENTRY _ZTI7ee62061[];
extern  VTBL_ENTRY _ZTV7ee62061[];
Class_Descriptor cd_ee62061 = {  "ee62061", // class name
  bases_ee62061, 4,
  &(vtc_ee62061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62061),4, //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  ee72061  : virtual dd2061 {
  int e;
  virtual void  foo(); // _ZN7ee720613fooEv
  virtual void  bar(); // _ZN7ee720613barEv
  ~ee72061(); // tgen
  ee72061(); // tgen
};
//SIG(1 ee72061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee72061 ::foo(){vfunc_called(this, "_ZN7ee720613fooEv");}
void  ee72061 ::bar(){vfunc_called(this, "_ZN7ee720613barEv");}
ee72061 ::~ee72061(){ note_dtor("ee72061", this);} // tgen
ee72061 ::ee72061(){ note_ctor("ee72061", this);} // tgen

static void Test_ee72061()
{
  extern Class_Descriptor cd_ee72061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72061, buf);
    ee72061 *dp, &lv = *(dp=new (buf) ee72061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee72061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd2061*), ABISELECT(16,8), "ee72061");
    check_base_class_offset(lv, (cc061*)(dd2061*), ABISELECT(16,8), "ee72061");
    check_base_class_offset(lv, (dd2061*), ABISELECT(16,8), "ee72061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72061.e");
    test_class_info(&lv, &cd_ee72061);
    dp->~ee72061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72061(Test_ee72061, "ee72061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72061C1Ev();
extern void _ZN7ee72061D1Ev();
Name_Map name_map_ee72061[] = {
  NSPAIR(_ZN7ee72061C1Ev),
  NSPAIR(_ZN7ee72061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd2061;
extern VTBL_ENTRY _ZTI6dd2061[];
extern  VTBL_ENTRY _ZTV6dd2061[];
static Base_Class bases_ee72061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2061,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72061[];
extern void _ZN7ee720613fooEv();
extern void _ZN7ee720613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee720613fooEv,_ZTv0_n12_N7ee720613fooEv)();
extern void ABISELECT(_ZThn16_N7ee720613fooEv,_ZThn8_N7ee720613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee720613barEv,_ZTv0_n16_N7ee720613barEv)();
extern void ABISELECT(_ZThn16_N7ee720613barEv,_ZThn8_N7ee720613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72061[0]),
  (VTBL_ENTRY)&_ZN7ee720613fooEv,
  (VTBL_ENTRY)&_ZN7ee720613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee720613fooEv,_ZTv0_n12_N7ee720613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee720613barEv,_ZTv0_n16_N7ee720613barEv),
};
extern VTBL_ENTRY _ZTV7ee72061[];
static  VTT_ENTRY vtt_ee72061[] = {
  {&(_ZTV7ee72061[3]),  3,11},
  {&(_ZTV7ee72061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72061[];
extern  VTBL_ENTRY _ZTV7ee72061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72061[];
static VTBL_ENTRY alt_thunk_names477[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee720613barEv,_ZTv0_n16_N7ee720613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee720613barEv,_ZThn8_N7ee720613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee720613fooEv,_ZTv0_n12_N7ee720613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee720613fooEv,_ZThn8_N7ee720613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72061 = {  "ee72061", // class name
  bases_ee72061, 4,
  &(vtc_ee72061[0]), // expected_vtbl_contents
  &(vtt_ee72061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72061),2, //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  dd3061  : virtual cc061 {
  int d;
  virtual void  foo(); // _ZN6dd30613fooEv
  ~dd3061(); // tgen
  dd3061(); // tgen
};
//SIG(-1 dd3061) C1{ VBC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd3061 ::foo(){vfunc_called(this, "_ZN6dd30613fooEv");}
dd3061 ::~dd3061(){ note_dtor("dd3061", this);} // tgen
dd3061 ::dd3061(){ note_ctor("dd3061", this);} // tgen

static void Test_dd3061()
{
  extern Class_Descriptor cd_dd3061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3061, buf);
    dd3061 *dp, &lv = *(dp=new (buf) dd3061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,8), "dd3061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,8), "dd3061");
    check_base_class_offset(lv, (cc061*), ABISELECT(16,8), "dd3061");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3061.d");
    test_class_info(&lv, &cd_dd3061);
    dp->~dd3061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3061(Test_dd3061, "dd3061", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3061C1Ev();
extern void _ZN6dd3061D1Ev();
Name_Map name_map_dd3061[] = {
  NSPAIR(_ZN6dd3061C1Ev),
  NSPAIR(_ZN6dd3061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd3061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3061[];
extern void _ZN6dd30613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd3061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd3061[];
static  VTT_ENTRY vtt_dd3061[] = {
  {&(_ZTV6dd3061[3]),  3,10},
  {&(_ZTV6dd3061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static VTBL_ENTRY alt_thunk_names478[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3061 = {  "dd3061", // class name
  bases_dd3061, 3,
  &(vtc_dd3061[0]), // expected_vtbl_contents
  &(vtt_dd3061[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3061),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names478,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03061  : dd3061 {
  int e;
  ~ee03061(); // tgen
  ee03061(); // tgen
};
//SIG(1 ee03061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee03061 ::~ee03061(){ note_dtor("ee03061", this);} // tgen
ee03061 ::ee03061(){ note_ctor("ee03061", this);} // tgen

static void Test_ee03061()
{
  extern Class_Descriptor cd_ee03061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03061, buf);
    ee03061 *dp, &lv = *(dp=new (buf) ee03061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee03061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee03061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(16,12), "ee03061");
    check_base_class_offset(lv, (dd3061*), 0, "ee03061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03061.e");
    test_class_info(&lv, &cd_ee03061);
    dp->~ee03061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03061(Test_ee03061, "ee03061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03061C1Ev();
extern void _ZN7ee03061D1Ev();
Name_Map name_map_ee03061[] = {
  NSPAIR(_ZN7ee03061C1Ev),
  NSPAIR(_ZN7ee03061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee03061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03061[];
extern void _ZN6dd30613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee03061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee03061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee03061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee03061[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee03061[] = {
  {&(_ZTV7ee03061[3]),  3,10},
  {&(_tg__ZTV6dd3061__7ee03061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee03061[4]),  4,6},
  {&(_ZTV7ee03061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03061[];
extern  VTBL_ENTRY _ZTV7ee03061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03061[];
static VTBL_ENTRY alt_thunk_names479[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03061 = {  "ee03061", // class name
  bases_ee03061, 4,
  &(vtc_ee03061[0]), // expected_vtbl_contents
  &(vtt_ee03061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03061),4, //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  ee13061  : virtual dd3061 {
  int e;
  ~ee13061(); // tgen
  ee13061(); // tgen
};
//SIG(1 ee13061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee13061 ::~ee13061(){ note_dtor("ee13061", this);} // tgen
ee13061 ::ee13061(){ note_ctor("ee13061", this);} // tgen

static void Test_ee13061()
{
  extern Class_Descriptor cd_ee13061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13061, buf);
    ee13061 *dp, &lv = *(dp=new (buf) ee13061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee13061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee13061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(32,16), "ee13061");
    check_base_class_offset(lv, (dd3061*), ABISELECT(16,8), "ee13061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13061.e");
    test_class_info(&lv, &cd_ee13061);
    dp->~ee13061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13061(Test_ee13061, "ee13061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13061C1Ev();
extern void _ZN7ee13061D1Ev();
Name_Map name_map_ee13061[] = {
  NSPAIR(_ZN7ee13061C1Ev),
  NSPAIR(_ZN7ee13061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee13061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13061[];
extern void _ZN6dd30613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee13061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13061[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee13061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee13061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee13061[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee13061[] = {
  {&(_ZTV7ee13061[4]),  4,15},
  {&(_ZTV7ee13061[8]),  8,15},
  {&(_ZTV7ee13061[13]),  13,15},
  {&(_tg__ZTV6dd3061__7ee13061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee13061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13061[];
extern  VTBL_ENTRY _ZTV7ee13061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13061[];
static VTBL_ENTRY alt_thunk_names480[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13061 = {  "ee13061", // class name
  bases_ee13061, 4,
  &(vtc_ee13061[0]), // expected_vtbl_contents
  &(vtt_ee13061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13061),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13061),5, //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  ee23061  : dd3061 {
  int e;
  virtual void  foo(); // _ZN7ee230613fooEv
  ~ee23061(); // tgen
  ee23061(); // tgen
};
//SIG(1 ee23061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee23061 ::foo(){vfunc_called(this, "_ZN7ee230613fooEv");}
ee23061 ::~ee23061(){ note_dtor("ee23061", this);} // tgen
ee23061 ::ee23061(){ note_ctor("ee23061", this);} // tgen

static void Test_ee23061()
{
  extern Class_Descriptor cd_ee23061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23061, buf);
    ee23061 *dp, &lv = *(dp=new (buf) ee23061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee23061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee23061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(16,12), "ee23061");
    check_base_class_offset(lv, (dd3061*), 0, "ee23061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23061.e");
    test_class_info(&lv, &cd_ee23061);
    dp->~ee23061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23061(Test_ee23061, "ee23061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23061C1Ev();
extern void _ZN7ee23061D1Ev();
Name_Map name_map_ee23061[] = {
  NSPAIR(_ZN7ee23061C1Ev),
  NSPAIR(_ZN7ee23061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee23061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23061[];
extern void _ZN7ee230613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee230613fooEv,_ZTv0_n12_N7ee230613fooEv)();
extern void ABISELECT(_ZThn16_N7ee230613fooEv,_ZThn12_N7ee230613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee23061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23061[0]),
  (VTBL_ENTRY)&_ZN7ee230613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee230613fooEv,_ZTv0_n12_N7ee230613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee23061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee23061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee23061[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee23061[] = {
  {&(_ZTV7ee23061[3]),  3,10},
  {&(_tg__ZTV6dd3061__7ee23061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee23061[4]),  4,6},
  {&(_ZTV7ee23061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23061[];
extern  VTBL_ENTRY _ZTV7ee23061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23061[];
static VTBL_ENTRY alt_thunk_names481[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee230613fooEv,_ZTv0_n12_N7ee230613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee230613fooEv,_ZThn12_N7ee230613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23061 = {  "ee23061", // class name
  bases_ee23061, 4,
  &(vtc_ee23061[0]), // expected_vtbl_contents
  &(vtt_ee23061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23061),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names481,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33061  : virtual dd3061 {
  int e;
  virtual void  foo(); // _ZN7ee330613fooEv
  ~ee33061(); // tgen
  ee33061(); // tgen
};
//SIG(1 ee33061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee33061 ::foo(){vfunc_called(this, "_ZN7ee330613fooEv");}
ee33061 ::~ee33061(){ note_dtor("ee33061", this);} // tgen
ee33061 ::ee33061(){ note_ctor("ee33061", this);} // tgen

static void Test_ee33061()
{
  extern Class_Descriptor cd_ee33061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33061, buf);
    ee33061 *dp, &lv = *(dp=new (buf) ee33061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee33061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee33061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(32,16), "ee33061");
    check_base_class_offset(lv, (dd3061*), ABISELECT(16,8), "ee33061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33061.e");
    test_class_info(&lv, &cd_ee33061);
    dp->~ee33061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33061(Test_ee33061, "ee33061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33061C1Ev();
extern void _ZN7ee33061D1Ev();
Name_Map name_map_ee33061[] = {
  NSPAIR(_ZN7ee33061C1Ev),
  NSPAIR(_ZN7ee33061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee33061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33061[];
extern void _ZN7ee330613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee330613fooEv,_ZTv0_n16_N7ee330613fooEv)();
extern void ABISELECT(_ZThn16_N7ee330613fooEv,_ZThn8_N7ee330613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee330613fooEv,_ZTv0_n12_N7ee330613fooEv)();
extern void ABISELECT(_ZThn32_N7ee330613fooEv,_ZThn16_N7ee330613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee33061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33061[0]),
  (VTBL_ENTRY)&_ZN7ee330613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee330613fooEv,_ZTv0_n16_N7ee330613fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee330613fooEv,_ZTv0_n12_N7ee330613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee33061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee33061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee33061[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee33061[] = {
  {&(_ZTV7ee33061[4]),  4,16},
  {&(_ZTV7ee33061[9]),  9,16},
  {&(_ZTV7ee33061[14]),  14,16},
  {&(_tg__ZTV6dd3061__7ee33061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee33061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33061[];
extern  VTBL_ENTRY _ZTV7ee33061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33061[];
static VTBL_ENTRY alt_thunk_names482[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee330613fooEv,_ZTv0_n12_N7ee330613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee330613fooEv,_ZThn16_N7ee330613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee330613fooEv,_ZTv0_n16_N7ee330613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee330613fooEv,_ZThn8_N7ee330613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33061 = {  "ee33061", // class name
  bases_ee33061, 4,
  &(vtc_ee33061[0]), // expected_vtbl_contents
  &(vtt_ee33061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33061),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names482,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43061  : dd3061 {
  int e;
  virtual void  bar(); // _ZN7ee430613barEv
  ~ee43061(); // tgen
  ee43061(); // tgen
};
//SIG(1 ee43061) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee43061 ::bar(){vfunc_called(this, "_ZN7ee430613barEv");}
ee43061 ::~ee43061(){ note_dtor("ee43061", this);} // tgen
ee43061 ::ee43061(){ note_ctor("ee43061", this);} // tgen

static void Test_ee43061()
{
  extern Class_Descriptor cd_ee43061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43061, buf);
    ee43061 *dp, &lv = *(dp=new (buf) ee43061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee43061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee43061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(16,12), "ee43061");
    check_base_class_offset(lv, (dd3061*), 0, "ee43061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43061.e");
    test_class_info(&lv, &cd_ee43061);
    dp->~ee43061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43061(Test_ee43061, "ee43061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43061C1Ev();
extern void _ZN7ee43061D1Ev();
Name_Map name_map_ee43061[] = {
  NSPAIR(_ZN7ee43061C1Ev),
  NSPAIR(_ZN7ee43061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee43061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43061[];
extern void _ZN6dd30613fooEv();
extern void _ZN7ee430613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee430613barEv,_ZTv0_n16_N7ee430613barEv)();
extern void ABISELECT(_ZThn16_N7ee430613barEv,_ZThn12_N7ee430613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
  (VTBL_ENTRY)&_ZN7ee430613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee430613barEv,_ZTv0_n16_N7ee430613barEv),
};
extern VTBL_ENTRY _ZTV7ee43061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee43061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee43061[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee43061[] = {
  {&(_ZTV7ee43061[3]),  3,11},
  {&(_tg__ZTV6dd3061__7ee43061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee43061[4]),  4,6},
  {&(_ZTV7ee43061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43061[];
extern  VTBL_ENTRY _ZTV7ee43061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43061[];
static VTBL_ENTRY alt_thunk_names483[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee430613barEv,_ZTv0_n16_N7ee430613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee430613barEv,_ZThn12_N7ee430613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43061 = {  "ee43061", // class name
  bases_ee43061, 4,
  &(vtc_ee43061[0]), // expected_vtbl_contents
  &(vtt_ee43061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43061),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names483,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53061  : virtual dd3061 {
  int e;
  virtual void  bar(); // _ZN7ee530613barEv
  ~ee53061(); // tgen
  ee53061(); // tgen
};
//SIG(1 ee53061) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee53061 ::bar(){vfunc_called(this, "_ZN7ee530613barEv");}
ee53061 ::~ee53061(){ note_dtor("ee53061", this);} // tgen
ee53061 ::ee53061(){ note_ctor("ee53061", this);} // tgen

static void Test_ee53061()
{
  extern Class_Descriptor cd_ee53061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53061, buf);
    ee53061 *dp, &lv = *(dp=new (buf) ee53061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee53061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee53061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(32,16), "ee53061");
    check_base_class_offset(lv, (dd3061*), ABISELECT(16,8), "ee53061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53061.e");
    test_class_info(&lv, &cd_ee53061);
    dp->~ee53061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53061(Test_ee53061, "ee53061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53061C1Ev();
extern void _ZN7ee53061D1Ev();
Name_Map name_map_ee53061[] = {
  NSPAIR(_ZN7ee53061C1Ev),
  NSPAIR(_ZN7ee53061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee53061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53061[];
extern void _ZN7ee530613barEv();
extern void _ZN6dd30613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee530613barEv,_ZTv0_n16_N7ee530613barEv)();
extern void ABISELECT(_ZThn32_N7ee530613barEv,_ZThn16_N7ee530613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53061[0]),
  (VTBL_ENTRY)&_ZN7ee530613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee530613barEv,_ZTv0_n16_N7ee530613barEv),
};
extern VTBL_ENTRY _ZTV7ee53061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee53061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee53061[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee53061[] = {
  {&(_ZTV7ee53061[4]),  4,16},
  {&(_ZTV7ee53061[9]),  9,16},
  {&(_ZTV7ee53061[14]),  14,16},
  {&(_tg__ZTV6dd3061__7ee53061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee53061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53061[];
extern  VTBL_ENTRY _ZTV7ee53061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53061[];
static VTBL_ENTRY alt_thunk_names484[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee530613barEv,_ZTv0_n16_N7ee530613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee530613barEv,_ZThn16_N7ee530613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53061 = {  "ee53061", // class name
  bases_ee53061, 4,
  &(vtc_ee53061[0]), // expected_vtbl_contents
  &(vtt_ee53061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53061),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names484,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63061  : dd3061 {
  int e;
  virtual void  foo(); // _ZN7ee630613fooEv
  virtual void  bar(); // _ZN7ee630613barEv
  ~ee63061(); // tgen
  ee63061(); // tgen
};
//SIG(1 ee63061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee63061 ::foo(){vfunc_called(this, "_ZN7ee630613fooEv");}
void  ee63061 ::bar(){vfunc_called(this, "_ZN7ee630613barEv");}
ee63061 ::~ee63061(){ note_dtor("ee63061", this);} // tgen
ee63061 ::ee63061(){ note_ctor("ee63061", this);} // tgen

static void Test_ee63061()
{
  extern Class_Descriptor cd_ee63061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63061, buf);
    ee63061 *dp, &lv = *(dp=new (buf) ee63061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee63061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee63061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(16,12), "ee63061");
    check_base_class_offset(lv, (dd3061*), 0, "ee63061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63061.e");
    test_class_info(&lv, &cd_ee63061);
    dp->~ee63061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63061(Test_ee63061, "ee63061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63061C1Ev();
extern void _ZN7ee63061D1Ev();
Name_Map name_map_ee63061[] = {
  NSPAIR(_ZN7ee63061C1Ev),
  NSPAIR(_ZN7ee63061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee63061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63061[];
extern void _ZN7ee630613fooEv();
extern void _ZN7ee630613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee630613fooEv,_ZTv0_n12_N7ee630613fooEv)();
extern void ABISELECT(_ZThn16_N7ee630613fooEv,_ZThn12_N7ee630613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee630613barEv,_ZTv0_n16_N7ee630613barEv)();
extern void ABISELECT(_ZThn16_N7ee630613barEv,_ZThn12_N7ee630613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63061[0]),
  (VTBL_ENTRY)&_ZN7ee630613fooEv,
  (VTBL_ENTRY)&_ZN7ee630613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee630613fooEv,_ZTv0_n12_N7ee630613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee630613barEv,_ZTv0_n16_N7ee630613barEv),
};
extern VTBL_ENTRY _ZTV7ee63061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee63061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee63061[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee63061[] = {
  {&(_ZTV7ee63061[3]),  3,11},
  {&(_tg__ZTV6dd3061__7ee63061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee63061[4]),  4,6},
  {&(_ZTV7ee63061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63061[];
extern  VTBL_ENTRY _ZTV7ee63061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63061[];
static VTBL_ENTRY alt_thunk_names485[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn12_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee630613barEv,_ZTv0_n16_N7ee630613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee630613barEv,_ZThn12_N7ee630613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee630613fooEv,_ZTv0_n12_N7ee630613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee630613fooEv,_ZThn12_N7ee630613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63061 = {  "ee63061", // class name
  bases_ee63061, 4,
  &(vtc_ee63061[0]), // expected_vtbl_contents
  &(vtt_ee63061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63061),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names485,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73061  : virtual dd3061 {
  int e;
  virtual void  foo(); // _ZN7ee730613fooEv
  virtual void  bar(); // _ZN7ee730613barEv
  ~ee73061(); // tgen
  ee73061(); // tgen
};
//SIG(1 ee73061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee73061 ::foo(){vfunc_called(this, "_ZN7ee730613fooEv");}
void  ee73061 ::bar(){vfunc_called(this, "_ZN7ee730613barEv");}
ee73061 ::~ee73061(){ note_dtor("ee73061", this);} // tgen
ee73061 ::ee73061(){ note_ctor("ee73061", this);} // tgen

static void Test_ee73061()
{
  extern Class_Descriptor cd_ee73061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73061, buf);
    ee73061 *dp, &lv = *(dp=new (buf) ee73061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee73061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee73061");
    check_base_class_offset(lv, (cc061*)(dd3061*), ABISELECT(32,16), "ee73061");
    check_base_class_offset(lv, (dd3061*), ABISELECT(16,8), "ee73061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73061.e");
    test_class_info(&lv, &cd_ee73061);
    dp->~ee73061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73061(Test_ee73061, "ee73061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73061C1Ev();
extern void _ZN7ee73061D1Ev();
Name_Map name_map_ee73061[] = {
  NSPAIR(_ZN7ee73061C1Ev),
  NSPAIR(_ZN7ee73061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd3061;
extern VTBL_ENTRY _ZTI6dd3061[];
extern  VTBL_ENTRY _ZTV6dd3061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3061[];
static Base_Class bases_ee73061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3061,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73061[];
extern void _ZN7ee730613fooEv();
extern void _ZN7ee730613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee730613fooEv,_ZTv0_n16_N7ee730613fooEv)();
extern void ABISELECT(_ZThn16_N7ee730613fooEv,_ZThn8_N7ee730613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee730613fooEv,_ZTv0_n12_N7ee730613fooEv)();
extern void ABISELECT(_ZThn32_N7ee730613fooEv,_ZThn16_N7ee730613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee730613barEv,_ZTv0_n16_N7ee730613barEv)();
extern void ABISELECT(_ZThn32_N7ee730613barEv,_ZThn16_N7ee730613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73061[0]),
  (VTBL_ENTRY)&_ZN7ee730613fooEv,
  (VTBL_ENTRY)&_ZN7ee730613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee730613fooEv,_ZTv0_n16_N7ee730613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee730613fooEv,_ZTv0_n12_N7ee730613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee730613barEv,_ZTv0_n16_N7ee730613barEv),
};
extern VTBL_ENTRY _ZTV7ee73061[];
extern void _ZN6dd30613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3061__7ee73061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&_ZN6dd30613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv)();
extern void ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd3061__7ee73061[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee73061[] = {
  {&(_ZTV7ee73061[4]),  4,17},
  {&(_ZTV7ee73061[10]),  10,17},
  {&(_ZTV7ee73061[15]),  15,17},
  {&(_tg__ZTV6dd3061__7ee73061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd3061__7ee73061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73061[];
extern  VTBL_ENTRY _ZTV7ee73061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73061[];
static VTBL_ENTRY alt_thunk_names486[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30613fooEv,_ZTv0_n12_N6dd30613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30613fooEv,_ZThn8_N6dd30613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee730613barEv,_ZTv0_n16_N7ee730613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee730613barEv,_ZThn16_N7ee730613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee730613fooEv,_ZTv0_n12_N7ee730613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee730613fooEv,_ZThn16_N7ee730613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee730613fooEv,_ZTv0_n16_N7ee730613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee730613fooEv,_ZThn8_N7ee730613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73061 = {  "ee73061", // class name
  bases_ee73061, 4,
  &(vtc_ee73061[0]), // expected_vtbl_contents
  &(vtt_ee73061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73061),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names486,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4061  : cc061 {
  int d;
  virtual void  bar(); // _ZN6dd40613barEv
  ~dd4061(); // tgen
  dd4061(); // tgen
};
//SIG(-1 dd4061) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd4061 ::bar(){vfunc_called(this, "_ZN6dd40613barEv");}
dd4061 ::~dd4061(){ note_dtor("dd4061", this);} // tgen
dd4061 ::dd4061(){ note_ctor("dd4061", this);} // tgen

static void Test_dd4061()
{
  extern Class_Descriptor cd_dd4061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4061, buf);
    dd4061 *dp, &lv = *(dp=new (buf) dd4061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), 0, "dd4061");
    check_base_class_offset(lv, (bb61*)(cc061*), 0, "dd4061");
    check_base_class_offset(lv, (cc061*), 0, "dd4061");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4061.d");
    test_class_info(&lv, &cd_dd4061);
    dp->~dd4061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4061(Test_dd4061, "dd4061", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4061C1Ev();
extern void _ZN6dd4061D1Ev();
Name_Map name_map_dd4061[] = {
  NSPAIR(_ZN6dd4061C1Ev),
  NSPAIR(_ZN6dd4061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd4061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4061[];
extern void _ZN4bb613fooEv();
extern void _ZN6dd40613barEv();
static  VTBL_ENTRY vtc_dd4061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN6dd40613barEv,
};
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
Class_Descriptor cd_dd4061 = {  "dd4061", // class name
  bases_dd4061, 3,
  &(vtc_dd4061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4061),4, //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  ee04061  : dd4061 {
  int e;
  ~ee04061(); // tgen
  ee04061(); // tgen
};
//SIG(1 ee04061) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee04061 ::~ee04061(){ note_dtor("ee04061", this);} // tgen
ee04061 ::ee04061(){ note_ctor("ee04061", this);} // tgen

static void Test_ee04061()
{
  extern Class_Descriptor cd_ee04061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04061, buf);
    ee04061 *dp, &lv = *(dp=new (buf) ee04061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), 0, "ee04061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), 0, "ee04061");
    check_base_class_offset(lv, (cc061*)(dd4061*), 0, "ee04061");
    check_base_class_offset(lv, (dd4061*), 0, "ee04061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04061.e");
    test_class_info(&lv, &cd_ee04061);
    dp->~ee04061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04061(Test_ee04061, "ee04061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04061C1Ev();
extern void _ZN7ee04061D1Ev();
Name_Map name_map_ee04061[] = {
  NSPAIR(_ZN7ee04061C1Ev),
  NSPAIR(_ZN7ee04061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee04061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04061[];
extern void _ZN4bb613fooEv();
extern void _ZN6dd40613barEv();
static  VTBL_ENTRY vtc_ee04061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN6dd40613barEv,
};
extern VTBL_ENTRY _ZTI7ee04061[];
extern  VTBL_ENTRY _ZTV7ee04061[];
Class_Descriptor cd_ee04061 = {  "ee04061", // class name
  bases_ee04061, 4,
  &(vtc_ee04061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04061),4, //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  ee14061  : virtual dd4061 {
  int e;
  ~ee14061(); // tgen
  ee14061(); // tgen
};
//SIG(1 ee14061) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee14061 ::~ee14061(){ note_dtor("ee14061", this);} // tgen
ee14061 ::ee14061(){ note_ctor("ee14061", this);} // tgen

static void Test_ee14061()
{
  extern Class_Descriptor cd_ee14061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14061, buf);
    ee14061 *dp, &lv = *(dp=new (buf) ee14061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee14061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee14061");
    check_base_class_offset(lv, (cc061*)(dd4061*), ABISELECT(16,8), "ee14061");
    check_base_class_offset(lv, (dd4061*), ABISELECT(16,8), "ee14061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14061.e");
    test_class_info(&lv, &cd_ee14061);
    dp->~ee14061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14061(Test_ee14061, "ee14061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14061C1Ev();
extern void _ZN7ee14061D1Ev();
Name_Map name_map_ee14061[] = {
  NSPAIR(_ZN7ee14061C1Ev),
  NSPAIR(_ZN7ee14061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee14061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14061[];
extern void _ZN4bb613fooEv();
extern void _ZN6dd40613barEv();
static  VTBL_ENTRY vtc_ee14061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14061[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN6dd40613barEv,
};
extern VTBL_ENTRY _ZTV7ee14061[];
static  VTT_ENTRY vtt_ee14061[] = {
  {&(_ZTV7ee14061[3]),  3,9},
  {&(_ZTV7ee14061[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14061[];
extern  VTBL_ENTRY _ZTV7ee14061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14061[];
Class_Descriptor cd_ee14061 = {  "ee14061", // class name
  bases_ee14061, 4,
  &(vtc_ee14061[0]), // expected_vtbl_contents
  &(vtt_ee14061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14061),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14061),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  ee24061  : dd4061 {
  int e;
  virtual void  foo(); // _ZN7ee240613fooEv
  ~ee24061(); // tgen
  ee24061(); // tgen
};
//SIG(1 ee24061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee24061 ::foo(){vfunc_called(this, "_ZN7ee240613fooEv");}
ee24061 ::~ee24061(){ note_dtor("ee24061", this);} // tgen
ee24061 ::ee24061(){ note_ctor("ee24061", this);} // tgen

static void Test_ee24061()
{
  extern Class_Descriptor cd_ee24061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24061, buf);
    ee24061 *dp, &lv = *(dp=new (buf) ee24061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), 0, "ee24061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), 0, "ee24061");
    check_base_class_offset(lv, (cc061*)(dd4061*), 0, "ee24061");
    check_base_class_offset(lv, (dd4061*), 0, "ee24061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24061.e");
    test_class_info(&lv, &cd_ee24061);
    dp->~ee24061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24061(Test_ee24061, "ee24061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24061C1Ev();
extern void _ZN7ee24061D1Ev();
Name_Map name_map_ee24061[] = {
  NSPAIR(_ZN7ee24061C1Ev),
  NSPAIR(_ZN7ee24061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee24061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24061[];
extern void _ZN7ee240613fooEv();
extern void _ZN6dd40613barEv();
static  VTBL_ENTRY vtc_ee24061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24061[0]),
  (VTBL_ENTRY)&_ZN7ee240613fooEv,
  (VTBL_ENTRY)&_ZN6dd40613barEv,
};
extern VTBL_ENTRY _ZTI7ee24061[];
extern  VTBL_ENTRY _ZTV7ee24061[];
Class_Descriptor cd_ee24061 = {  "ee24061", // class name
  bases_ee24061, 4,
  &(vtc_ee24061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24061),4, //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  ee34061  : virtual dd4061 {
  int e;
  virtual void  foo(); // _ZN7ee340613fooEv
  ~ee34061(); // tgen
  ee34061(); // tgen
};
//SIG(1 ee34061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee34061 ::foo(){vfunc_called(this, "_ZN7ee340613fooEv");}
ee34061 ::~ee34061(){ note_dtor("ee34061", this);} // tgen
ee34061 ::ee34061(){ note_ctor("ee34061", this);} // tgen

static void Test_ee34061()
{
  extern Class_Descriptor cd_ee34061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34061, buf);
    ee34061 *dp, &lv = *(dp=new (buf) ee34061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee34061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee34061");
    check_base_class_offset(lv, (cc061*)(dd4061*), ABISELECT(16,8), "ee34061");
    check_base_class_offset(lv, (dd4061*), ABISELECT(16,8), "ee34061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34061.e");
    test_class_info(&lv, &cd_ee34061);
    dp->~ee34061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34061(Test_ee34061, "ee34061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34061C1Ev();
extern void _ZN7ee34061D1Ev();
Name_Map name_map_ee34061[] = {
  NSPAIR(_ZN7ee34061C1Ev),
  NSPAIR(_ZN7ee34061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee34061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34061[];
extern void _ZN7ee340613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee340613fooEv,_ZTv0_n12_N7ee340613fooEv)();
extern void ABISELECT(_ZThn16_N7ee340613fooEv,_ZThn8_N7ee340613fooEv)() __attribute__((weak));
extern void _ZN6dd40613barEv();
static  VTBL_ENTRY vtc_ee34061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34061[0]),
  (VTBL_ENTRY)&_ZN7ee340613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee340613fooEv,_ZTv0_n12_N7ee340613fooEv),
  (VTBL_ENTRY)&_ZN6dd40613barEv,
};
extern VTBL_ENTRY _ZTV7ee34061[];
static  VTT_ENTRY vtt_ee34061[] = {
  {&(_ZTV7ee34061[3]),  3,10},
  {&(_ZTV7ee34061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34061[];
extern  VTBL_ENTRY _ZTV7ee34061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34061[];
static VTBL_ENTRY alt_thunk_names487[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee340613fooEv,_ZTv0_n12_N7ee340613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee340613fooEv,_ZThn8_N7ee340613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34061 = {  "ee34061", // class name
  bases_ee34061, 4,
  &(vtc_ee34061[0]), // expected_vtbl_contents
  &(vtt_ee34061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names487,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44061  : dd4061 {
  int e;
  virtual void  bar(); // _ZN7ee440613barEv
  ~ee44061(); // tgen
  ee44061(); // tgen
};
//SIG(1 ee44061) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee44061 ::bar(){vfunc_called(this, "_ZN7ee440613barEv");}
ee44061 ::~ee44061(){ note_dtor("ee44061", this);} // tgen
ee44061 ::ee44061(){ note_ctor("ee44061", this);} // tgen

static void Test_ee44061()
{
  extern Class_Descriptor cd_ee44061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44061, buf);
    ee44061 *dp, &lv = *(dp=new (buf) ee44061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), 0, "ee44061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), 0, "ee44061");
    check_base_class_offset(lv, (cc061*)(dd4061*), 0, "ee44061");
    check_base_class_offset(lv, (dd4061*), 0, "ee44061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44061.e");
    test_class_info(&lv, &cd_ee44061);
    dp->~ee44061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44061(Test_ee44061, "ee44061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44061C1Ev();
extern void _ZN7ee44061D1Ev();
Name_Map name_map_ee44061[] = {
  NSPAIR(_ZN7ee44061C1Ev),
  NSPAIR(_ZN7ee44061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee44061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44061[];
extern void _ZN4bb613fooEv();
extern void _ZN7ee440613barEv();
static  VTBL_ENTRY vtc_ee44061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN7ee440613barEv,
};
extern VTBL_ENTRY _ZTI7ee44061[];
extern  VTBL_ENTRY _ZTV7ee44061[];
Class_Descriptor cd_ee44061 = {  "ee44061", // class name
  bases_ee44061, 4,
  &(vtc_ee44061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44061),4, //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  ee54061  : virtual dd4061 {
  int e;
  virtual void  bar(); // _ZN7ee540613barEv
  ~ee54061(); // tgen
  ee54061(); // tgen
};
//SIG(1 ee54061) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee54061 ::bar(){vfunc_called(this, "_ZN7ee540613barEv");}
ee54061 ::~ee54061(){ note_dtor("ee54061", this);} // tgen
ee54061 ::ee54061(){ note_ctor("ee54061", this);} // tgen

static void Test_ee54061()
{
  extern Class_Descriptor cd_ee54061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54061, buf);
    ee54061 *dp, &lv = *(dp=new (buf) ee54061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee54061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee54061");
    check_base_class_offset(lv, (cc061*)(dd4061*), ABISELECT(16,8), "ee54061");
    check_base_class_offset(lv, (dd4061*), ABISELECT(16,8), "ee54061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54061.e");
    test_class_info(&lv, &cd_ee54061);
    dp->~ee54061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54061(Test_ee54061, "ee54061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54061C1Ev();
extern void _ZN7ee54061D1Ev();
Name_Map name_map_ee54061[] = {
  NSPAIR(_ZN7ee54061C1Ev),
  NSPAIR(_ZN7ee54061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee54061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54061[];
extern void _ZN7ee540613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee540613barEv,_ZTv0_n16_N7ee540613barEv)();
extern void ABISELECT(_ZThn16_N7ee540613barEv,_ZThn8_N7ee540613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54061[0]),
  (VTBL_ENTRY)&_ZN7ee540613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee540613barEv,_ZTv0_n16_N7ee540613barEv),
};
extern VTBL_ENTRY _ZTV7ee54061[];
static  VTT_ENTRY vtt_ee54061[] = {
  {&(_ZTV7ee54061[3]),  3,10},
  {&(_ZTV7ee54061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54061[];
extern  VTBL_ENTRY _ZTV7ee54061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54061[];
static VTBL_ENTRY alt_thunk_names488[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee540613barEv,_ZTv0_n16_N7ee540613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee540613barEv,_ZThn8_N7ee540613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54061 = {  "ee54061", // class name
  bases_ee54061, 4,
  &(vtc_ee54061[0]), // expected_vtbl_contents
  &(vtt_ee54061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names488,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64061  : dd4061 {
  int e;
  virtual void  foo(); // _ZN7ee640613fooEv
  virtual void  bar(); // _ZN7ee640613barEv
  ~ee64061(); // tgen
  ee64061(); // tgen
};
//SIG(1 ee64061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee64061 ::foo(){vfunc_called(this, "_ZN7ee640613fooEv");}
void  ee64061 ::bar(){vfunc_called(this, "_ZN7ee640613barEv");}
ee64061 ::~ee64061(){ note_dtor("ee64061", this);} // tgen
ee64061 ::ee64061(){ note_ctor("ee64061", this);} // tgen

static void Test_ee64061()
{
  extern Class_Descriptor cd_ee64061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64061, buf);
    ee64061 *dp, &lv = *(dp=new (buf) ee64061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), 0, "ee64061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), 0, "ee64061");
    check_base_class_offset(lv, (cc061*)(dd4061*), 0, "ee64061");
    check_base_class_offset(lv, (dd4061*), 0, "ee64061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64061.e");
    test_class_info(&lv, &cd_ee64061);
    dp->~ee64061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64061(Test_ee64061, "ee64061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64061C1Ev();
extern void _ZN7ee64061D1Ev();
Name_Map name_map_ee64061[] = {
  NSPAIR(_ZN7ee64061C1Ev),
  NSPAIR(_ZN7ee64061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee64061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64061[];
extern void _ZN7ee640613fooEv();
extern void _ZN7ee640613barEv();
static  VTBL_ENTRY vtc_ee64061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64061[0]),
  (VTBL_ENTRY)&_ZN7ee640613fooEv,
  (VTBL_ENTRY)&_ZN7ee640613barEv,
};
extern VTBL_ENTRY _ZTI7ee64061[];
extern  VTBL_ENTRY _ZTV7ee64061[];
Class_Descriptor cd_ee64061 = {  "ee64061", // class name
  bases_ee64061, 4,
  &(vtc_ee64061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64061),4, //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  ee74061  : virtual dd4061 {
  int e;
  virtual void  foo(); // _ZN7ee740613fooEv
  virtual void  bar(); // _ZN7ee740613barEv
  ~ee74061(); // tgen
  ee74061(); // tgen
};
//SIG(1 ee74061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee74061 ::foo(){vfunc_called(this, "_ZN7ee740613fooEv");}
void  ee74061 ::bar(){vfunc_called(this, "_ZN7ee740613barEv");}
ee74061 ::~ee74061(){ note_dtor("ee74061", this);} // tgen
ee74061 ::ee74061(){ note_ctor("ee74061", this);} // tgen

static void Test_ee74061()
{
  extern Class_Descriptor cd_ee74061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74061, buf);
    ee74061 *dp, &lv = *(dp=new (buf) ee74061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee74061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd4061*), ABISELECT(16,8), "ee74061");
    check_base_class_offset(lv, (cc061*)(dd4061*), ABISELECT(16,8), "ee74061");
    check_base_class_offset(lv, (dd4061*), ABISELECT(16,8), "ee74061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74061.e");
    test_class_info(&lv, &cd_ee74061);
    dp->~ee74061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74061(Test_ee74061, "ee74061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74061C1Ev();
extern void _ZN7ee74061D1Ev();
Name_Map name_map_ee74061[] = {
  NSPAIR(_ZN7ee74061C1Ev),
  NSPAIR(_ZN7ee74061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd4061;
extern VTBL_ENTRY _ZTI6dd4061[];
extern  VTBL_ENTRY _ZTV6dd4061[];
static Base_Class bases_ee74061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4061,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74061[];
extern void _ZN7ee740613fooEv();
extern void _ZN7ee740613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee740613fooEv,_ZTv0_n12_N7ee740613fooEv)();
extern void ABISELECT(_ZThn16_N7ee740613fooEv,_ZThn8_N7ee740613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee740613barEv,_ZTv0_n16_N7ee740613barEv)();
extern void ABISELECT(_ZThn16_N7ee740613barEv,_ZThn8_N7ee740613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74061[0]),
  (VTBL_ENTRY)&_ZN7ee740613fooEv,
  (VTBL_ENTRY)&_ZN7ee740613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee740613fooEv,_ZTv0_n12_N7ee740613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee740613barEv,_ZTv0_n16_N7ee740613barEv),
};
extern VTBL_ENTRY _ZTV7ee74061[];
static  VTT_ENTRY vtt_ee74061[] = {
  {&(_ZTV7ee74061[3]),  3,11},
  {&(_ZTV7ee74061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74061[];
extern  VTBL_ENTRY _ZTV7ee74061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74061[];
static VTBL_ENTRY alt_thunk_names489[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee740613barEv,_ZTv0_n16_N7ee740613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee740613barEv,_ZThn8_N7ee740613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee740613fooEv,_ZTv0_n12_N7ee740613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee740613fooEv,_ZThn8_N7ee740613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74061 = {  "ee74061", // class name
  bases_ee74061, 4,
  &(vtc_ee74061[0]), // expected_vtbl_contents
  &(vtt_ee74061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names489,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5061  : virtual cc061 {
  int d;
  virtual void  bar(); // _ZN6dd50613barEv
  ~dd5061(); // tgen
  dd5061(); // tgen
};
//SIG(-1 dd5061) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd5061 ::bar(){vfunc_called(this, "_ZN6dd50613barEv");}
dd5061 ::~dd5061(){ note_dtor("dd5061", this);} // tgen
dd5061 ::dd5061(){ note_ctor("dd5061", this);} // tgen

static void Test_dd5061()
{
  extern Class_Descriptor cd_dd5061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5061, buf);
    dd5061 *dp, &lv = *(dp=new (buf) dd5061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,8), "dd5061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,8), "dd5061");
    check_base_class_offset(lv, (cc061*), ABISELECT(16,8), "dd5061");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5061.d");
    test_class_info(&lv, &cd_dd5061);
    dp->~dd5061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5061(Test_dd5061, "dd5061", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5061C1Ev();
extern void _ZN6dd5061D1Ev();
Name_Map name_map_dd5061[] = {
  NSPAIR(_ZN6dd5061C1Ev),
  NSPAIR(_ZN6dd5061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd5061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5061[];
extern void _ZN6dd50613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
extern VTBL_ENTRY _ZTV6dd5061[];
static  VTT_ENTRY vtt_dd5061[] = {
  {&(_ZTV6dd5061[3]),  3,10},
  {&(_ZTV6dd5061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static VTBL_ENTRY alt_thunk_names490[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5061 = {  "dd5061", // class name
  bases_dd5061, 3,
  &(vtc_dd5061[0]), // expected_vtbl_contents
  &(vtt_dd5061[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5061),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names490,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05061  : dd5061 {
  int e;
  ~ee05061(); // tgen
  ee05061(); // tgen
};
//SIG(1 ee05061) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee05061 ::~ee05061(){ note_dtor("ee05061", this);} // tgen
ee05061 ::ee05061(){ note_ctor("ee05061", this);} // tgen

static void Test_ee05061()
{
  extern Class_Descriptor cd_ee05061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05061, buf);
    ee05061 *dp, &lv = *(dp=new (buf) ee05061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee05061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee05061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(16,12), "ee05061");
    check_base_class_offset(lv, (dd5061*), 0, "ee05061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05061.e");
    test_class_info(&lv, &cd_ee05061);
    dp->~ee05061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05061(Test_ee05061, "ee05061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05061C1Ev();
extern void _ZN7ee05061D1Ev();
Name_Map name_map_ee05061[] = {
  NSPAIR(_ZN7ee05061C1Ev),
  NSPAIR(_ZN7ee05061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee05061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05061[];
extern void _ZN6dd50613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
extern VTBL_ENTRY _ZTV7ee05061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee05061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee05061[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee05061[] = {
  {&(_ZTV7ee05061[3]),  3,10},
  {&(_tg__ZTV6dd5061__7ee05061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee05061[4]),  4,6},
  {&(_ZTV7ee05061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05061[];
extern  VTBL_ENTRY _ZTV7ee05061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05061[];
static VTBL_ENTRY alt_thunk_names491[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05061 = {  "ee05061", // class name
  bases_ee05061, 4,
  &(vtc_ee05061[0]), // expected_vtbl_contents
  &(vtt_ee05061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05061),4, //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  ee15061  : virtual dd5061 {
  int e;
  ~ee15061(); // tgen
  ee15061(); // tgen
};
//SIG(1 ee15061) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee15061 ::~ee15061(){ note_dtor("ee15061", this);} // tgen
ee15061 ::ee15061(){ note_ctor("ee15061", this);} // tgen

static void Test_ee15061()
{
  extern Class_Descriptor cd_ee15061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15061, buf);
    ee15061 *dp, &lv = *(dp=new (buf) ee15061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee15061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee15061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(32,16), "ee15061");
    check_base_class_offset(lv, (dd5061*), ABISELECT(16,8), "ee15061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15061.e");
    test_class_info(&lv, &cd_ee15061);
    dp->~ee15061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15061(Test_ee15061, "ee15061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15061C1Ev();
extern void _ZN7ee15061D1Ev();
Name_Map name_map_ee15061[] = {
  NSPAIR(_ZN7ee15061C1Ev),
  NSPAIR(_ZN7ee15061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee15061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15061[];
extern void _ZN6dd50613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15061[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
extern VTBL_ENTRY _ZTV7ee15061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee15061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee15061[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee15061[] = {
  {&(_ZTV7ee15061[4]),  4,15},
  {&(_ZTV7ee15061[8]),  8,15},
  {&(_ZTV7ee15061[13]),  13,15},
  {&(_tg__ZTV6dd5061__7ee15061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee15061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15061[];
extern  VTBL_ENTRY _ZTV7ee15061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15061[];
static VTBL_ENTRY alt_thunk_names492[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15061 = {  "ee15061", // class name
  bases_ee15061, 4,
  &(vtc_ee15061[0]), // expected_vtbl_contents
  &(vtt_ee15061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15061),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15061),5, //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  ee25061  : dd5061 {
  int e;
  virtual void  foo(); // _ZN7ee250613fooEv
  ~ee25061(); // tgen
  ee25061(); // tgen
};
//SIG(1 ee25061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee25061 ::foo(){vfunc_called(this, "_ZN7ee250613fooEv");}
ee25061 ::~ee25061(){ note_dtor("ee25061", this);} // tgen
ee25061 ::ee25061(){ note_ctor("ee25061", this);} // tgen

static void Test_ee25061()
{
  extern Class_Descriptor cd_ee25061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25061, buf);
    ee25061 *dp, &lv = *(dp=new (buf) ee25061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee25061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee25061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(16,12), "ee25061");
    check_base_class_offset(lv, (dd5061*), 0, "ee25061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25061.e");
    test_class_info(&lv, &cd_ee25061);
    dp->~ee25061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25061(Test_ee25061, "ee25061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25061C1Ev();
extern void _ZN7ee25061D1Ev();
Name_Map name_map_ee25061[] = {
  NSPAIR(_ZN7ee25061C1Ev),
  NSPAIR(_ZN7ee25061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee25061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25061[];
extern void _ZN6dd50613barEv();
extern void _ZN7ee250613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee250613fooEv,_ZTv0_n12_N7ee250613fooEv)();
extern void ABISELECT(_ZThn16_N7ee250613fooEv,_ZThn12_N7ee250613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
  (VTBL_ENTRY)&_ZN7ee250613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee250613fooEv,_ZTv0_n12_N7ee250613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
extern VTBL_ENTRY _ZTV7ee25061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee25061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee25061[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee25061[] = {
  {&(_ZTV7ee25061[3]),  3,11},
  {&(_tg__ZTV6dd5061__7ee25061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee25061[4]),  4,6},
  {&(_ZTV7ee25061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25061[];
extern  VTBL_ENTRY _ZTV7ee25061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25061[];
static VTBL_ENTRY alt_thunk_names493[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee250613fooEv,_ZTv0_n12_N7ee250613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee250613fooEv,_ZThn12_N7ee250613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25061 = {  "ee25061", // class name
  bases_ee25061, 4,
  &(vtc_ee25061[0]), // expected_vtbl_contents
  &(vtt_ee25061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25061),4, //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  ee35061  : virtual dd5061 {
  int e;
  virtual void  foo(); // _ZN7ee350613fooEv
  ~ee35061(); // tgen
  ee35061(); // tgen
};
//SIG(1 ee35061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee35061 ::foo(){vfunc_called(this, "_ZN7ee350613fooEv");}
ee35061 ::~ee35061(){ note_dtor("ee35061", this);} // tgen
ee35061 ::ee35061(){ note_ctor("ee35061", this);} // tgen

static void Test_ee35061()
{
  extern Class_Descriptor cd_ee35061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35061, buf);
    ee35061 *dp, &lv = *(dp=new (buf) ee35061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee35061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee35061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(32,16), "ee35061");
    check_base_class_offset(lv, (dd5061*), ABISELECT(16,8), "ee35061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35061.e");
    test_class_info(&lv, &cd_ee35061);
    dp->~ee35061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35061(Test_ee35061, "ee35061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35061C1Ev();
extern void _ZN7ee35061D1Ev();
Name_Map name_map_ee35061[] = {
  NSPAIR(_ZN7ee35061C1Ev),
  NSPAIR(_ZN7ee35061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee35061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35061[];
extern void _ZN7ee350613fooEv();
extern void _ZN6dd50613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee350613fooEv,_ZTv0_n12_N7ee350613fooEv)();
extern void ABISELECT(_ZThn32_N7ee350613fooEv,_ZThn16_N7ee350613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35061[0]),
  (VTBL_ENTRY)&_ZN7ee350613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee350613fooEv,_ZTv0_n12_N7ee350613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
extern VTBL_ENTRY _ZTV7ee35061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee35061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee35061[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee35061[] = {
  {&(_ZTV7ee35061[4]),  4,16},
  {&(_ZTV7ee35061[9]),  9,16},
  {&(_ZTV7ee35061[14]),  14,16},
  {&(_tg__ZTV6dd5061__7ee35061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee35061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35061[];
extern  VTBL_ENTRY _ZTV7ee35061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35061[];
static VTBL_ENTRY alt_thunk_names494[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee350613fooEv,_ZTv0_n12_N7ee350613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee350613fooEv,_ZThn16_N7ee350613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35061 = {  "ee35061", // class name
  bases_ee35061, 4,
  &(vtc_ee35061[0]), // expected_vtbl_contents
  &(vtt_ee35061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35061),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names494,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45061  : dd5061 {
  int e;
  virtual void  bar(); // _ZN7ee450613barEv
  ~ee45061(); // tgen
  ee45061(); // tgen
};
//SIG(1 ee45061) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee45061 ::bar(){vfunc_called(this, "_ZN7ee450613barEv");}
ee45061 ::~ee45061(){ note_dtor("ee45061", this);} // tgen
ee45061 ::ee45061(){ note_ctor("ee45061", this);} // tgen

static void Test_ee45061()
{
  extern Class_Descriptor cd_ee45061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45061, buf);
    ee45061 *dp, &lv = *(dp=new (buf) ee45061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee45061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee45061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(16,12), "ee45061");
    check_base_class_offset(lv, (dd5061*), 0, "ee45061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45061.e");
    test_class_info(&lv, &cd_ee45061);
    dp->~ee45061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45061(Test_ee45061, "ee45061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45061C1Ev();
extern void _ZN7ee45061D1Ev();
Name_Map name_map_ee45061[] = {
  NSPAIR(_ZN7ee45061C1Ev),
  NSPAIR(_ZN7ee45061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee45061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45061[];
extern void _ZN7ee450613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee450613barEv,_ZTv0_n16_N7ee450613barEv)();
extern void ABISELECT(_ZThn16_N7ee450613barEv,_ZThn12_N7ee450613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45061[0]),
  (VTBL_ENTRY)&_ZN7ee450613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee450613barEv,_ZTv0_n16_N7ee450613barEv),
};
extern VTBL_ENTRY _ZTV7ee45061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee45061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee45061[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee45061[] = {
  {&(_ZTV7ee45061[3]),  3,10},
  {&(_tg__ZTV6dd5061__7ee45061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee45061[4]),  4,6},
  {&(_ZTV7ee45061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45061[];
extern  VTBL_ENTRY _ZTV7ee45061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45061[];
static VTBL_ENTRY alt_thunk_names495[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee450613barEv,_ZTv0_n16_N7ee450613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee450613barEv,_ZThn12_N7ee450613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45061 = {  "ee45061", // class name
  bases_ee45061, 4,
  &(vtc_ee45061[0]), // expected_vtbl_contents
  &(vtt_ee45061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45061),4, //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  ee55061  : virtual dd5061 {
  int e;
  virtual void  bar(); // _ZN7ee550613barEv
  ~ee55061(); // tgen
  ee55061(); // tgen
};
//SIG(1 ee55061) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee55061 ::bar(){vfunc_called(this, "_ZN7ee550613barEv");}
ee55061 ::~ee55061(){ note_dtor("ee55061", this);} // tgen
ee55061 ::ee55061(){ note_ctor("ee55061", this);} // tgen

static void Test_ee55061()
{
  extern Class_Descriptor cd_ee55061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55061, buf);
    ee55061 *dp, &lv = *(dp=new (buf) ee55061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee55061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee55061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(32,16), "ee55061");
    check_base_class_offset(lv, (dd5061*), ABISELECT(16,8), "ee55061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55061.e");
    test_class_info(&lv, &cd_ee55061);
    dp->~ee55061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55061(Test_ee55061, "ee55061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55061C1Ev();
extern void _ZN7ee55061D1Ev();
Name_Map name_map_ee55061[] = {
  NSPAIR(_ZN7ee55061C1Ev),
  NSPAIR(_ZN7ee55061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee55061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55061[];
extern void _ZN7ee550613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee550613barEv,_ZTv0_n16_N7ee550613barEv)();
extern void ABISELECT(_ZThn16_N7ee550613barEv,_ZThn8_N7ee550613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee550613barEv,_ZTv0_n16_N7ee550613barEv)();
extern void ABISELECT(_ZThn32_N7ee550613barEv,_ZThn16_N7ee550613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55061[0]),
  (VTBL_ENTRY)&_ZN7ee550613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee550613barEv,_ZTv0_n16_N7ee550613barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee550613barEv,_ZTv0_n16_N7ee550613barEv),
};
extern VTBL_ENTRY _ZTV7ee55061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee55061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee55061[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee55061[] = {
  {&(_ZTV7ee55061[4]),  4,16},
  {&(_ZTV7ee55061[9]),  9,16},
  {&(_ZTV7ee55061[14]),  14,16},
  {&(_tg__ZTV6dd5061__7ee55061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee55061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55061[];
extern  VTBL_ENTRY _ZTV7ee55061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55061[];
static VTBL_ENTRY alt_thunk_names496[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee550613barEv,_ZTv0_n16_N7ee550613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee550613barEv,_ZThn16_N7ee550613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee550613barEv,_ZThn8_N7ee550613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55061 = {  "ee55061", // class name
  bases_ee55061, 4,
  &(vtc_ee55061[0]), // expected_vtbl_contents
  &(vtt_ee55061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55061),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55061),5, //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  ee65061  : dd5061 {
  int e;
  virtual void  foo(); // _ZN7ee650613fooEv
  virtual void  bar(); // _ZN7ee650613barEv
  ~ee65061(); // tgen
  ee65061(); // tgen
};
//SIG(1 ee65061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee65061 ::foo(){vfunc_called(this, "_ZN7ee650613fooEv");}
void  ee65061 ::bar(){vfunc_called(this, "_ZN7ee650613barEv");}
ee65061 ::~ee65061(){ note_dtor("ee65061", this);} // tgen
ee65061 ::ee65061(){ note_ctor("ee65061", this);} // tgen

static void Test_ee65061()
{
  extern Class_Descriptor cd_ee65061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65061, buf);
    ee65061 *dp, &lv = *(dp=new (buf) ee65061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee65061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee65061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(16,12), "ee65061");
    check_base_class_offset(lv, (dd5061*), 0, "ee65061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65061.e");
    test_class_info(&lv, &cd_ee65061);
    dp->~ee65061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65061(Test_ee65061, "ee65061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65061C1Ev();
extern void _ZN7ee65061D1Ev();
Name_Map name_map_ee65061[] = {
  NSPAIR(_ZN7ee65061C1Ev),
  NSPAIR(_ZN7ee65061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee65061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65061[];
extern void _ZN7ee650613barEv();
extern void _ZN7ee650613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee650613fooEv,_ZTv0_n12_N7ee650613fooEv)();
extern void ABISELECT(_ZThn16_N7ee650613fooEv,_ZThn12_N7ee650613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee650613barEv,_ZTv0_n16_N7ee650613barEv)();
extern void ABISELECT(_ZThn16_N7ee650613barEv,_ZThn12_N7ee650613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65061[0]),
  (VTBL_ENTRY)&_ZN7ee650613barEv,
  (VTBL_ENTRY)&_ZN7ee650613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee650613fooEv,_ZTv0_n12_N7ee650613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee650613barEv,_ZTv0_n16_N7ee650613barEv),
};
extern VTBL_ENTRY _ZTV7ee65061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee65061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee65061[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee65061[] = {
  {&(_ZTV7ee65061[3]),  3,11},
  {&(_tg__ZTV6dd5061__7ee65061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee65061[4]),  4,6},
  {&(_ZTV7ee65061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65061[];
extern  VTBL_ENTRY _ZTV7ee65061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65061[];
static VTBL_ENTRY alt_thunk_names497[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn12_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee650613barEv,_ZTv0_n16_N7ee650613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee650613barEv,_ZThn12_N7ee650613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee650613fooEv,_ZTv0_n12_N7ee650613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee650613fooEv,_ZThn12_N7ee650613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65061 = {  "ee65061", // class name
  bases_ee65061, 4,
  &(vtc_ee65061[0]), // expected_vtbl_contents
  &(vtt_ee65061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65061),4, //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  ee75061  : virtual dd5061 {
  int e;
  virtual void  foo(); // _ZN7ee750613fooEv
  virtual void  bar(); // _ZN7ee750613barEv
  ~ee75061(); // tgen
  ee75061(); // tgen
};
//SIG(1 ee75061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee75061 ::foo(){vfunc_called(this, "_ZN7ee750613fooEv");}
void  ee75061 ::bar(){vfunc_called(this, "_ZN7ee750613barEv");}
ee75061 ::~ee75061(){ note_dtor("ee75061", this);} // tgen
ee75061 ::ee75061(){ note_ctor("ee75061", this);} // tgen

static void Test_ee75061()
{
  extern Class_Descriptor cd_ee75061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75061, buf);
    ee75061 *dp, &lv = *(dp=new (buf) ee75061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee75061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee75061");
    check_base_class_offset(lv, (cc061*)(dd5061*), ABISELECT(32,16), "ee75061");
    check_base_class_offset(lv, (dd5061*), ABISELECT(16,8), "ee75061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75061.e");
    test_class_info(&lv, &cd_ee75061);
    dp->~ee75061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75061(Test_ee75061, "ee75061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75061C1Ev();
extern void _ZN7ee75061D1Ev();
Name_Map name_map_ee75061[] = {
  NSPAIR(_ZN7ee75061C1Ev),
  NSPAIR(_ZN7ee75061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd5061;
extern VTBL_ENTRY _ZTI6dd5061[];
extern  VTBL_ENTRY _ZTV6dd5061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5061[];
static Base_Class bases_ee75061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5061,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75061[];
extern void _ZN7ee750613fooEv();
extern void _ZN7ee750613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee750613barEv,_ZTv0_n16_N7ee750613barEv)();
extern void ABISELECT(_ZThn16_N7ee750613barEv,_ZThn8_N7ee750613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee750613fooEv,_ZTv0_n12_N7ee750613fooEv)();
extern void ABISELECT(_ZThn32_N7ee750613fooEv,_ZThn16_N7ee750613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee750613barEv,_ZTv0_n16_N7ee750613barEv)();
extern void ABISELECT(_ZThn32_N7ee750613barEv,_ZThn16_N7ee750613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75061[0]),
  (VTBL_ENTRY)&_ZN7ee750613fooEv,
  (VTBL_ENTRY)&_ZN7ee750613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee750613barEv,_ZTv0_n16_N7ee750613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee750613fooEv,_ZTv0_n12_N7ee750613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee750613barEv,_ZTv0_n16_N7ee750613barEv),
};
extern VTBL_ENTRY _ZTV7ee75061[];
extern void _ZN6dd50613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5061__7ee75061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN6dd50613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv)();
extern void ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd5061__7ee75061[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5061[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv),
};
static  VTT_ENTRY vtt_ee75061[] = {
  {&(_ZTV7ee75061[4]),  4,17},
  {&(_ZTV7ee75061[10]),  10,17},
  {&(_ZTV7ee75061[15]),  15,17},
  {&(_tg__ZTV6dd5061__7ee75061[3]),  3,4},
  {&(_tg__ZTV4bb615cc061__6dd5061__7ee75061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75061[];
extern  VTBL_ENTRY _ZTV7ee75061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75061[];
static VTBL_ENTRY alt_thunk_names498[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50613barEv,_ZTv0_n16_N6dd50613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50613barEv,_ZThn8_N6dd50613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee750613fooEv,_ZTv0_n12_N7ee750613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee750613fooEv,_ZThn16_N7ee750613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee750613barEv,_ZTv0_n16_N7ee750613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee750613barEv,_ZThn16_N7ee750613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee750613barEv,_ZThn8_N7ee750613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75061 = {  "ee75061", // class name
  bases_ee75061, 4,
  &(vtc_ee75061[0]), // expected_vtbl_contents
  &(vtt_ee75061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75061),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75061),5, //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  dd6061  : cc061 {
  int d;
  virtual void  bar(); // _ZN6dd60613barEv
  virtual void  foo(); // _ZN6dd60613fooEv
  ~dd6061(); // tgen
  dd6061(); // tgen
};
//SIG(-1 dd6061) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd6061 ::bar(){vfunc_called(this, "_ZN6dd60613barEv");}
void  dd6061 ::foo(){vfunc_called(this, "_ZN6dd60613fooEv");}
dd6061 ::~dd6061(){ note_dtor("dd6061", this);} // tgen
dd6061 ::dd6061(){ note_ctor("dd6061", this);} // tgen

static void Test_dd6061()
{
  extern Class_Descriptor cd_dd6061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6061, buf);
    dd6061 *dp, &lv = *(dp=new (buf) dd6061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), 0, "dd6061");
    check_base_class_offset(lv, (bb61*)(cc061*), 0, "dd6061");
    check_base_class_offset(lv, (cc061*), 0, "dd6061");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6061.d");
    test_class_info(&lv, &cd_dd6061);
    dp->~dd6061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6061(Test_dd6061, "dd6061", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6061C1Ev();
extern void _ZN6dd6061D1Ev();
Name_Map name_map_dd6061[] = {
  NSPAIR(_ZN6dd6061C1Ev),
  NSPAIR(_ZN6dd6061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd6061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6061[];
extern void _ZN6dd60613fooEv();
extern void _ZN6dd60613barEv();
static  VTBL_ENTRY vtc_dd6061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6061[0]),
  (VTBL_ENTRY)&_ZN6dd60613fooEv,
  (VTBL_ENTRY)&_ZN6dd60613barEv,
};
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
Class_Descriptor cd_dd6061 = {  "dd6061", // class name
  bases_dd6061, 3,
  &(vtc_dd6061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6061),4, //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  ee06061  : dd6061 {
  int e;
  ~ee06061(); // tgen
  ee06061(); // tgen
};
//SIG(1 ee06061) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee06061 ::~ee06061(){ note_dtor("ee06061", this);} // tgen
ee06061 ::ee06061(){ note_ctor("ee06061", this);} // tgen

static void Test_ee06061()
{
  extern Class_Descriptor cd_ee06061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06061, buf);
    ee06061 *dp, &lv = *(dp=new (buf) ee06061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), 0, "ee06061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), 0, "ee06061");
    check_base_class_offset(lv, (cc061*)(dd6061*), 0, "ee06061");
    check_base_class_offset(lv, (dd6061*), 0, "ee06061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06061.e");
    test_class_info(&lv, &cd_ee06061);
    dp->~ee06061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06061(Test_ee06061, "ee06061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06061C1Ev();
extern void _ZN7ee06061D1Ev();
Name_Map name_map_ee06061[] = {
  NSPAIR(_ZN7ee06061C1Ev),
  NSPAIR(_ZN7ee06061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee06061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06061[];
extern void _ZN6dd60613fooEv();
extern void _ZN6dd60613barEv();
static  VTBL_ENTRY vtc_ee06061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06061[0]),
  (VTBL_ENTRY)&_ZN6dd60613fooEv,
  (VTBL_ENTRY)&_ZN6dd60613barEv,
};
extern VTBL_ENTRY _ZTI7ee06061[];
extern  VTBL_ENTRY _ZTV7ee06061[];
Class_Descriptor cd_ee06061 = {  "ee06061", // class name
  bases_ee06061, 4,
  &(vtc_ee06061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06061),4, //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  ee16061  : virtual dd6061 {
  int e;
  ~ee16061(); // tgen
  ee16061(); // tgen
};
//SIG(1 ee16061) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee16061 ::~ee16061(){ note_dtor("ee16061", this);} // tgen
ee16061 ::ee16061(){ note_ctor("ee16061", this);} // tgen

static void Test_ee16061()
{
  extern Class_Descriptor cd_ee16061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16061, buf);
    ee16061 *dp, &lv = *(dp=new (buf) ee16061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee16061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee16061");
    check_base_class_offset(lv, (cc061*)(dd6061*), ABISELECT(16,8), "ee16061");
    check_base_class_offset(lv, (dd6061*), ABISELECT(16,8), "ee16061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16061.e");
    test_class_info(&lv, &cd_ee16061);
    dp->~ee16061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16061(Test_ee16061, "ee16061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16061C1Ev();
extern void _ZN7ee16061D1Ev();
Name_Map name_map_ee16061[] = {
  NSPAIR(_ZN7ee16061C1Ev),
  NSPAIR(_ZN7ee16061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee16061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16061[];
extern void _ZN6dd60613fooEv();
extern void _ZN6dd60613barEv();
static  VTBL_ENTRY vtc_ee16061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16061[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16061[0]),
  (VTBL_ENTRY)&_ZN6dd60613fooEv,
  (VTBL_ENTRY)&_ZN6dd60613barEv,
};
extern VTBL_ENTRY _ZTV7ee16061[];
static  VTT_ENTRY vtt_ee16061[] = {
  {&(_ZTV7ee16061[3]),  3,9},
  {&(_ZTV7ee16061[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16061[];
extern  VTBL_ENTRY _ZTV7ee16061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16061[];
Class_Descriptor cd_ee16061 = {  "ee16061", // class name
  bases_ee16061, 4,
  &(vtc_ee16061[0]), // expected_vtbl_contents
  &(vtt_ee16061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16061),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16061),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  ee26061  : dd6061 {
  int e;
  virtual void  foo(); // _ZN7ee260613fooEv
  ~ee26061(); // tgen
  ee26061(); // tgen
};
//SIG(1 ee26061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee26061 ::foo(){vfunc_called(this, "_ZN7ee260613fooEv");}
ee26061 ::~ee26061(){ note_dtor("ee26061", this);} // tgen
ee26061 ::ee26061(){ note_ctor("ee26061", this);} // tgen

static void Test_ee26061()
{
  extern Class_Descriptor cd_ee26061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26061, buf);
    ee26061 *dp, &lv = *(dp=new (buf) ee26061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), 0, "ee26061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), 0, "ee26061");
    check_base_class_offset(lv, (cc061*)(dd6061*), 0, "ee26061");
    check_base_class_offset(lv, (dd6061*), 0, "ee26061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26061.e");
    test_class_info(&lv, &cd_ee26061);
    dp->~ee26061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26061(Test_ee26061, "ee26061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26061C1Ev();
extern void _ZN7ee26061D1Ev();
Name_Map name_map_ee26061[] = {
  NSPAIR(_ZN7ee26061C1Ev),
  NSPAIR(_ZN7ee26061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee26061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26061[];
extern void _ZN7ee260613fooEv();
extern void _ZN6dd60613barEv();
static  VTBL_ENTRY vtc_ee26061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26061[0]),
  (VTBL_ENTRY)&_ZN7ee260613fooEv,
  (VTBL_ENTRY)&_ZN6dd60613barEv,
};
extern VTBL_ENTRY _ZTI7ee26061[];
extern  VTBL_ENTRY _ZTV7ee26061[];
Class_Descriptor cd_ee26061 = {  "ee26061", // class name
  bases_ee26061, 4,
  &(vtc_ee26061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26061),4, //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  ee36061  : virtual dd6061 {
  int e;
  virtual void  foo(); // _ZN7ee360613fooEv
  ~ee36061(); // tgen
  ee36061(); // tgen
};
//SIG(1 ee36061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee36061 ::foo(){vfunc_called(this, "_ZN7ee360613fooEv");}
ee36061 ::~ee36061(){ note_dtor("ee36061", this);} // tgen
ee36061 ::ee36061(){ note_ctor("ee36061", this);} // tgen

static void Test_ee36061()
{
  extern Class_Descriptor cd_ee36061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36061, buf);
    ee36061 *dp, &lv = *(dp=new (buf) ee36061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee36061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee36061");
    check_base_class_offset(lv, (cc061*)(dd6061*), ABISELECT(16,8), "ee36061");
    check_base_class_offset(lv, (dd6061*), ABISELECT(16,8), "ee36061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36061.e");
    test_class_info(&lv, &cd_ee36061);
    dp->~ee36061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36061(Test_ee36061, "ee36061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36061C1Ev();
extern void _ZN7ee36061D1Ev();
Name_Map name_map_ee36061[] = {
  NSPAIR(_ZN7ee36061C1Ev),
  NSPAIR(_ZN7ee36061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee36061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36061[];
extern void _ZN7ee360613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee360613fooEv,_ZTv0_n12_N7ee360613fooEv)();
extern void ABISELECT(_ZThn16_N7ee360613fooEv,_ZThn8_N7ee360613fooEv)() __attribute__((weak));
extern void _ZN6dd60613barEv();
static  VTBL_ENTRY vtc_ee36061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36061[0]),
  (VTBL_ENTRY)&_ZN7ee360613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee360613fooEv,_ZTv0_n12_N7ee360613fooEv),
  (VTBL_ENTRY)&_ZN6dd60613barEv,
};
extern VTBL_ENTRY _ZTV7ee36061[];
static  VTT_ENTRY vtt_ee36061[] = {
  {&(_ZTV7ee36061[3]),  3,10},
  {&(_ZTV7ee36061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36061[];
extern  VTBL_ENTRY _ZTV7ee36061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36061[];
static VTBL_ENTRY alt_thunk_names499[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee360613fooEv,_ZTv0_n12_N7ee360613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee360613fooEv,_ZThn8_N7ee360613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36061 = {  "ee36061", // class name
  bases_ee36061, 4,
  &(vtc_ee36061[0]), // expected_vtbl_contents
  &(vtt_ee36061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names499,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46061  : dd6061 {
  int e;
  virtual void  bar(); // _ZN7ee460613barEv
  ~ee46061(); // tgen
  ee46061(); // tgen
};
//SIG(1 ee46061) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee46061 ::bar(){vfunc_called(this, "_ZN7ee460613barEv");}
ee46061 ::~ee46061(){ note_dtor("ee46061", this);} // tgen
ee46061 ::ee46061(){ note_ctor("ee46061", this);} // tgen

static void Test_ee46061()
{
  extern Class_Descriptor cd_ee46061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46061, buf);
    ee46061 *dp, &lv = *(dp=new (buf) ee46061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), 0, "ee46061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), 0, "ee46061");
    check_base_class_offset(lv, (cc061*)(dd6061*), 0, "ee46061");
    check_base_class_offset(lv, (dd6061*), 0, "ee46061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46061.e");
    test_class_info(&lv, &cd_ee46061);
    dp->~ee46061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46061(Test_ee46061, "ee46061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46061C1Ev();
extern void _ZN7ee46061D1Ev();
Name_Map name_map_ee46061[] = {
  NSPAIR(_ZN7ee46061C1Ev),
  NSPAIR(_ZN7ee46061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee46061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46061[];
extern void _ZN6dd60613fooEv();
extern void _ZN7ee460613barEv();
static  VTBL_ENTRY vtc_ee46061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46061[0]),
  (VTBL_ENTRY)&_ZN6dd60613fooEv,
  (VTBL_ENTRY)&_ZN7ee460613barEv,
};
extern VTBL_ENTRY _ZTI7ee46061[];
extern  VTBL_ENTRY _ZTV7ee46061[];
Class_Descriptor cd_ee46061 = {  "ee46061", // class name
  bases_ee46061, 4,
  &(vtc_ee46061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46061),4, //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  ee56061  : virtual dd6061 {
  int e;
  virtual void  bar(); // _ZN7ee560613barEv
  ~ee56061(); // tgen
  ee56061(); // tgen
};
//SIG(1 ee56061) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee56061 ::bar(){vfunc_called(this, "_ZN7ee560613barEv");}
ee56061 ::~ee56061(){ note_dtor("ee56061", this);} // tgen
ee56061 ::ee56061(){ note_ctor("ee56061", this);} // tgen

static void Test_ee56061()
{
  extern Class_Descriptor cd_ee56061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56061, buf);
    ee56061 *dp, &lv = *(dp=new (buf) ee56061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee56061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee56061");
    check_base_class_offset(lv, (cc061*)(dd6061*), ABISELECT(16,8), "ee56061");
    check_base_class_offset(lv, (dd6061*), ABISELECT(16,8), "ee56061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56061.e");
    test_class_info(&lv, &cd_ee56061);
    dp->~ee56061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56061(Test_ee56061, "ee56061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56061C1Ev();
extern void _ZN7ee56061D1Ev();
Name_Map name_map_ee56061[] = {
  NSPAIR(_ZN7ee56061C1Ev),
  NSPAIR(_ZN7ee56061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee56061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56061[];
extern void _ZN7ee560613barEv();
extern void _ZN6dd60613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee560613barEv,_ZTv0_n16_N7ee560613barEv)();
extern void ABISELECT(_ZThn16_N7ee560613barEv,_ZThn8_N7ee560613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56061[0]),
  (VTBL_ENTRY)&_ZN7ee560613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56061[0]),
  (VTBL_ENTRY)&_ZN6dd60613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee560613barEv,_ZTv0_n16_N7ee560613barEv),
};
extern VTBL_ENTRY _ZTV7ee56061[];
static  VTT_ENTRY vtt_ee56061[] = {
  {&(_ZTV7ee56061[3]),  3,10},
  {&(_ZTV7ee56061[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56061[];
extern  VTBL_ENTRY _ZTV7ee56061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56061[];
static VTBL_ENTRY alt_thunk_names500[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee560613barEv,_ZTv0_n16_N7ee560613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee560613barEv,_ZThn8_N7ee560613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56061 = {  "ee56061", // class name
  bases_ee56061, 4,
  &(vtc_ee56061[0]), // expected_vtbl_contents
  &(vtt_ee56061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56061),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names500,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66061  : dd6061 {
  int e;
  virtual void  foo(); // _ZN7ee660613fooEv
  virtual void  bar(); // _ZN7ee660613barEv
  ~ee66061(); // tgen
  ee66061(); // tgen
};
//SIG(1 ee66061) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66061 ::foo(){vfunc_called(this, "_ZN7ee660613fooEv");}
void  ee66061 ::bar(){vfunc_called(this, "_ZN7ee660613barEv");}
ee66061 ::~ee66061(){ note_dtor("ee66061", this);} // tgen
ee66061 ::ee66061(){ note_ctor("ee66061", this);} // tgen

static void Test_ee66061()
{
  extern Class_Descriptor cd_ee66061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66061, buf);
    ee66061 *dp, &lv = *(dp=new (buf) ee66061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), 0, "ee66061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), 0, "ee66061");
    check_base_class_offset(lv, (cc061*)(dd6061*), 0, "ee66061");
    check_base_class_offset(lv, (dd6061*), 0, "ee66061");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66061.e");
    test_class_info(&lv, &cd_ee66061);
    dp->~ee66061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66061(Test_ee66061, "ee66061", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66061C1Ev();
extern void _ZN7ee66061D1Ev();
Name_Map name_map_ee66061[] = {
  NSPAIR(_ZN7ee66061C1Ev),
  NSPAIR(_ZN7ee66061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee66061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66061[];
extern void _ZN7ee660613fooEv();
extern void _ZN7ee660613barEv();
static  VTBL_ENTRY vtc_ee66061[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66061[0]),
  (VTBL_ENTRY)&_ZN7ee660613fooEv,
  (VTBL_ENTRY)&_ZN7ee660613barEv,
};
extern VTBL_ENTRY _ZTI7ee66061[];
extern  VTBL_ENTRY _ZTV7ee66061[];
Class_Descriptor cd_ee66061 = {  "ee66061", // class name
  bases_ee66061, 4,
  &(vtc_ee66061[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66061),4, //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  ee76061  : virtual dd6061 {
  int e;
  virtual void  foo(); // _ZN7ee760613fooEv
  virtual void  bar(); // _ZN7ee760613barEv
  ~ee76061(); // tgen
  ee76061(); // tgen
};
//SIG(1 ee76061) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76061 ::foo(){vfunc_called(this, "_ZN7ee760613fooEv");}
void  ee76061 ::bar(){vfunc_called(this, "_ZN7ee760613barEv");}
ee76061 ::~ee76061(){ note_dtor("ee76061", this);} // tgen
ee76061 ::ee76061(){ note_ctor("ee76061", this);} // tgen

static void Test_ee76061()
{
  extern Class_Descriptor cd_ee76061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76061, buf);
    ee76061 *dp, &lv = *(dp=new (buf) ee76061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee76061");
    check_base_class_offset(lv, (bb61*)(cc061*)(dd6061*), ABISELECT(16,8), "ee76061");
    check_base_class_offset(lv, (cc061*)(dd6061*), ABISELECT(16,8), "ee76061");
    check_base_class_offset(lv, (dd6061*), ABISELECT(16,8), "ee76061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76061.e");
    test_class_info(&lv, &cd_ee76061);
    dp->~ee76061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76061(Test_ee76061, "ee76061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76061C1Ev();
extern void _ZN7ee76061D1Ev();
Name_Map name_map_ee76061[] = {
  NSPAIR(_ZN7ee76061C1Ev),
  NSPAIR(_ZN7ee76061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd6061;
extern VTBL_ENTRY _ZTI6dd6061[];
extern  VTBL_ENTRY _ZTV6dd6061[];
static Base_Class bases_ee76061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc061,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6061,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76061[];
extern void _ZN7ee760613fooEv();
extern void _ZN7ee760613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee760613fooEv,_ZTv0_n12_N7ee760613fooEv)();
extern void ABISELECT(_ZThn16_N7ee760613fooEv,_ZThn8_N7ee760613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee760613barEv,_ZTv0_n16_N7ee760613barEv)();
extern void ABISELECT(_ZThn16_N7ee760613barEv,_ZThn8_N7ee760613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76061[0]),
  (VTBL_ENTRY)&_ZN7ee760613fooEv,
  (VTBL_ENTRY)&_ZN7ee760613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee760613fooEv,_ZTv0_n12_N7ee760613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee760613barEv,_ZTv0_n16_N7ee760613barEv),
};
extern VTBL_ENTRY _ZTV7ee76061[];
static  VTT_ENTRY vtt_ee76061[] = {
  {&(_ZTV7ee76061[3]),  3,11},
  {&(_ZTV7ee76061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76061[];
extern  VTBL_ENTRY _ZTV7ee76061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76061[];
static VTBL_ENTRY alt_thunk_names501[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee760613barEv,_ZTv0_n16_N7ee760613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee760613barEv,_ZThn8_N7ee760613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee760613fooEv,_ZTv0_n12_N7ee760613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee760613fooEv,_ZThn8_N7ee760613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76061 = {  "ee76061", // class name
  bases_ee76061, 4,
  &(vtc_ee76061[0]), // expected_vtbl_contents
  &(vtt_ee76061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76061),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names501,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7061  : virtual cc061 {
  int d;
  virtual void  bar(); // _ZN6dd70613barEv
  virtual void  foo(); // _ZN6dd70613fooEv
  ~dd7061(); // tgen
  dd7061(); // tgen
};
//SIG(-1 dd7061) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd7061 ::bar(){vfunc_called(this, "_ZN6dd70613barEv");}
void  dd7061 ::foo(){vfunc_called(this, "_ZN6dd70613fooEv");}
dd7061 ::~dd7061(){ note_dtor("dd7061", this);} // tgen
dd7061 ::dd7061(){ note_ctor("dd7061", this);} // tgen

static void Test_dd7061()
{
  extern Class_Descriptor cd_dd7061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7061, buf);
    dd7061 *dp, &lv = *(dp=new (buf) dd7061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,8), "dd7061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,8), "dd7061");
    check_base_class_offset(lv, (cc061*), ABISELECT(16,8), "dd7061");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7061.d");
    test_class_info(&lv, &cd_dd7061);
    dp->~dd7061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7061(Test_dd7061, "dd7061", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7061C1Ev();
extern void _ZN6dd7061D1Ev();
Name_Map name_map_dd7061[] = {
  NSPAIR(_ZN6dd7061C1Ev),
  NSPAIR(_ZN6dd7061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
static Base_Class bases_dd7061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
extern VTBL_ENTRY _ZTV6dd7061[];
static  VTT_ENTRY vtt_dd7061[] = {
  {&(_ZTV6dd7061[3]),  3,11},
  {&(_ZTV6dd7061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static VTBL_ENTRY alt_thunk_names502[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7061 = {  "dd7061", // class name
  bases_dd7061, 3,
  &(vtc_dd7061[0]), // expected_vtbl_contents
  &(vtt_dd7061[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7061),2, //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  ee07061  : dd7061 {
  int e;
  ~ee07061(); // tgen
  ee07061(); // tgen
};
//SIG(1 ee07061) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee07061 ::~ee07061(){ note_dtor("ee07061", this);} // tgen
ee07061 ::ee07061(){ note_ctor("ee07061", this);} // tgen

static void Test_ee07061()
{
  extern Class_Descriptor cd_ee07061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07061, buf);
    ee07061 *dp, &lv = *(dp=new (buf) ee07061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee07061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee07061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(16,12), "ee07061");
    check_base_class_offset(lv, (dd7061*), 0, "ee07061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07061.e");
    test_class_info(&lv, &cd_ee07061);
    dp->~ee07061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07061(Test_ee07061, "ee07061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07061C1Ev();
extern void _ZN7ee07061D1Ev();
Name_Map name_map_ee07061[] = {
  NSPAIR(_ZN7ee07061C1Ev),
  NSPAIR(_ZN7ee07061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee07061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
extern VTBL_ENTRY _ZTV7ee07061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee07061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee07061[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee07061[] = {
  {&(_ZTV7ee07061[3]),  3,11},
  {&(_tg__ZTV6dd7061__7ee07061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee07061[4]),  4,6},
  {&(_ZTV7ee07061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07061[];
extern  VTBL_ENTRY _ZTV7ee07061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07061[];
static VTBL_ENTRY alt_thunk_names503[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07061 = {  "ee07061", // class name
  bases_ee07061, 4,
  &(vtc_ee07061[0]), // expected_vtbl_contents
  &(vtt_ee07061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07061),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names503,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17061  : virtual dd7061 {
  int e;
  ~ee17061(); // tgen
  ee17061(); // tgen
};
//SIG(1 ee17061) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee17061 ::~ee17061(){ note_dtor("ee17061", this);} // tgen
ee17061 ::ee17061(){ note_ctor("ee17061", this);} // tgen

static void Test_ee17061()
{
  extern Class_Descriptor cd_ee17061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17061, buf);
    ee17061 *dp, &lv = *(dp=new (buf) ee17061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee17061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee17061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(32,16), "ee17061");
    check_base_class_offset(lv, (dd7061*), ABISELECT(16,8), "ee17061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17061.e");
    test_class_info(&lv, &cd_ee17061);
    dp->~ee17061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17061(Test_ee17061, "ee17061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17061C1Ev();
extern void _ZN7ee17061D1Ev();
Name_Map name_map_ee17061[] = {
  NSPAIR(_ZN7ee17061C1Ev),
  NSPAIR(_ZN7ee17061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee17061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17061[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
extern VTBL_ENTRY _ZTV7ee17061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee17061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee17061[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee17061[] = {
  {&(_ZTV7ee17061[4]),  4,17},
  {&(_ZTV7ee17061[9]),  9,17},
  {&(_ZTV7ee17061[15]),  15,17},
  {&(_tg__ZTV6dd7061__7ee17061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee17061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17061[];
extern  VTBL_ENTRY _ZTV7ee17061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17061[];
static VTBL_ENTRY alt_thunk_names504[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17061 = {  "ee17061", // class name
  bases_ee17061, 4,
  &(vtc_ee17061[0]), // expected_vtbl_contents
  &(vtt_ee17061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17061),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names504,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27061  : dd7061 {
  int e;
  virtual void  foo(); // _ZN7ee270613fooEv
  ~ee27061(); // tgen
  ee27061(); // tgen
};
//SIG(1 ee27061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee27061 ::foo(){vfunc_called(this, "_ZN7ee270613fooEv");}
ee27061 ::~ee27061(){ note_dtor("ee27061", this);} // tgen
ee27061 ::ee27061(){ note_ctor("ee27061", this);} // tgen

static void Test_ee27061()
{
  extern Class_Descriptor cd_ee27061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27061, buf);
    ee27061 *dp, &lv = *(dp=new (buf) ee27061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee27061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee27061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(16,12), "ee27061");
    check_base_class_offset(lv, (dd7061*), 0, "ee27061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27061.e");
    test_class_info(&lv, &cd_ee27061);
    dp->~ee27061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27061(Test_ee27061, "ee27061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27061C1Ev();
extern void _ZN7ee27061D1Ev();
Name_Map name_map_ee27061[] = {
  NSPAIR(_ZN7ee27061C1Ev),
  NSPAIR(_ZN7ee27061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee27061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27061[];
extern void _ZN6dd70613barEv();
extern void _ZN7ee270613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee270613fooEv,_ZTv0_n12_N7ee270613fooEv)();
extern void ABISELECT(_ZThn16_N7ee270613fooEv,_ZThn12_N7ee270613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN7ee270613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee270613fooEv,_ZTv0_n12_N7ee270613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
extern VTBL_ENTRY _ZTV7ee27061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee27061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee27061[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee27061[] = {
  {&(_ZTV7ee27061[3]),  3,11},
  {&(_tg__ZTV6dd7061__7ee27061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee27061[4]),  4,6},
  {&(_ZTV7ee27061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27061[];
extern  VTBL_ENTRY _ZTV7ee27061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27061[];
static VTBL_ENTRY alt_thunk_names505[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee270613fooEv,_ZTv0_n12_N7ee270613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee270613fooEv,_ZThn12_N7ee270613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27061 = {  "ee27061", // class name
  bases_ee27061, 4,
  &(vtc_ee27061[0]), // expected_vtbl_contents
  &(vtt_ee27061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27061),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names505,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37061  : virtual dd7061 {
  int e;
  virtual void  foo(); // _ZN7ee370613fooEv
  ~ee37061(); // tgen
  ee37061(); // tgen
};
//SIG(1 ee37061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee37061 ::foo(){vfunc_called(this, "_ZN7ee370613fooEv");}
ee37061 ::~ee37061(){ note_dtor("ee37061", this);} // tgen
ee37061 ::ee37061(){ note_ctor("ee37061", this);} // tgen

static void Test_ee37061()
{
  extern Class_Descriptor cd_ee37061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37061, buf);
    ee37061 *dp, &lv = *(dp=new (buf) ee37061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee37061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee37061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(32,16), "ee37061");
    check_base_class_offset(lv, (dd7061*), ABISELECT(16,8), "ee37061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37061.e");
    test_class_info(&lv, &cd_ee37061);
    dp->~ee37061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37061(Test_ee37061, "ee37061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37061C1Ev();
extern void _ZN7ee37061D1Ev();
Name_Map name_map_ee37061[] = {
  NSPAIR(_ZN7ee37061C1Ev),
  NSPAIR(_ZN7ee37061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee37061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37061[];
extern void _ZN7ee370613fooEv();
extern void _ZN6dd70613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee370613fooEv,_ZTv0_n20_N7ee370613fooEv)();
extern void ABISELECT(_ZThn16_N7ee370613fooEv,_ZThn8_N7ee370613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee370613fooEv,_ZTv0_n12_N7ee370613fooEv)();
extern void ABISELECT(_ZThn32_N7ee370613fooEv,_ZThn16_N7ee370613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37061[0]),
  (VTBL_ENTRY)&_ZN7ee370613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee370613fooEv,_ZTv0_n20_N7ee370613fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee370613fooEv,_ZTv0_n12_N7ee370613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
extern VTBL_ENTRY _ZTV7ee37061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee37061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee37061[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee37061[] = {
  {&(_ZTV7ee37061[4]),  4,18},
  {&(_ZTV7ee37061[10]),  10,18},
  {&(_ZTV7ee37061[16]),  16,18},
  {&(_tg__ZTV6dd7061__7ee37061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee37061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37061[];
extern  VTBL_ENTRY _ZTV7ee37061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37061[];
static VTBL_ENTRY alt_thunk_names506[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee370613fooEv,_ZTv0_n12_N7ee370613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee370613fooEv,_ZThn16_N7ee370613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee370613fooEv,_ZTv0_n20_N7ee370613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee370613fooEv,_ZThn8_N7ee370613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37061 = {  "ee37061", // class name
  bases_ee37061, 4,
  &(vtc_ee37061[0]), // expected_vtbl_contents
  &(vtt_ee37061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37061),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37061),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names506,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47061  : dd7061 {
  int e;
  virtual void  bar(); // _ZN7ee470613barEv
  ~ee47061(); // tgen
  ee47061(); // tgen
};
//SIG(1 ee47061) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee47061 ::bar(){vfunc_called(this, "_ZN7ee470613barEv");}
ee47061 ::~ee47061(){ note_dtor("ee47061", this);} // tgen
ee47061 ::ee47061(){ note_ctor("ee47061", this);} // tgen

static void Test_ee47061()
{
  extern Class_Descriptor cd_ee47061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47061, buf);
    ee47061 *dp, &lv = *(dp=new (buf) ee47061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee47061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee47061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(16,12), "ee47061");
    check_base_class_offset(lv, (dd7061*), 0, "ee47061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47061.e");
    test_class_info(&lv, &cd_ee47061);
    dp->~ee47061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47061(Test_ee47061, "ee47061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47061C1Ev();
extern void _ZN7ee47061D1Ev();
Name_Map name_map_ee47061[] = {
  NSPAIR(_ZN7ee47061C1Ev),
  NSPAIR(_ZN7ee47061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee47061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47061[];
extern void _ZN7ee470613barEv();
extern void _ZN6dd70613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee470613barEv,_ZTv0_n16_N7ee470613barEv)();
extern void ABISELECT(_ZThn16_N7ee470613barEv,_ZThn12_N7ee470613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47061[0]),
  (VTBL_ENTRY)&_ZN7ee470613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee470613barEv,_ZTv0_n16_N7ee470613barEv),
};
extern VTBL_ENTRY _ZTV7ee47061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee47061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee47061[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee47061[] = {
  {&(_ZTV7ee47061[3]),  3,11},
  {&(_tg__ZTV6dd7061__7ee47061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee47061[4]),  4,6},
  {&(_ZTV7ee47061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47061[];
extern  VTBL_ENTRY _ZTV7ee47061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47061[];
static VTBL_ENTRY alt_thunk_names507[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee470613barEv,_ZTv0_n16_N7ee470613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee470613barEv,_ZThn12_N7ee470613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47061 = {  "ee47061", // class name
  bases_ee47061, 4,
  &(vtc_ee47061[0]), // expected_vtbl_contents
  &(vtt_ee47061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47061),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names507,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57061  : virtual dd7061 {
  int e;
  virtual void  bar(); // _ZN7ee570613barEv
  ~ee57061(); // tgen
  ee57061(); // tgen
};
//SIG(1 ee57061) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee57061 ::bar(){vfunc_called(this, "_ZN7ee570613barEv");}
ee57061 ::~ee57061(){ note_dtor("ee57061", this);} // tgen
ee57061 ::ee57061(){ note_ctor("ee57061", this);} // tgen

static void Test_ee57061()
{
  extern Class_Descriptor cd_ee57061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57061, buf);
    ee57061 *dp, &lv = *(dp=new (buf) ee57061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee57061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee57061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(32,16), "ee57061");
    check_base_class_offset(lv, (dd7061*), ABISELECT(16,8), "ee57061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57061.e");
    test_class_info(&lv, &cd_ee57061);
    dp->~ee57061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57061(Test_ee57061, "ee57061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57061C1Ev();
extern void _ZN7ee57061D1Ev();
Name_Map name_map_ee57061[] = {
  NSPAIR(_ZN7ee57061C1Ev),
  NSPAIR(_ZN7ee57061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee57061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57061[];
extern void _ZN7ee570613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee570613barEv,_ZTv0_n16_N7ee570613barEv)();
extern void ABISELECT(_ZThn16_N7ee570613barEv,_ZThn8_N7ee570613barEv)() __attribute__((weak));
extern void _ZN6dd70613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee570613barEv,_ZTv0_n16_N7ee570613barEv)();
extern void ABISELECT(_ZThn32_N7ee570613barEv,_ZThn16_N7ee570613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57061[0]),
  (VTBL_ENTRY)&_ZN7ee570613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee570613barEv,_ZTv0_n16_N7ee570613barEv),
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee570613barEv,_ZTv0_n16_N7ee570613barEv),
};
extern VTBL_ENTRY _ZTV7ee57061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee57061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee57061[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee57061[] = {
  {&(_ZTV7ee57061[4]),  4,18},
  {&(_ZTV7ee57061[10]),  10,18},
  {&(_ZTV7ee57061[16]),  16,18},
  {&(_tg__ZTV6dd7061__7ee57061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee57061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57061[];
extern  VTBL_ENTRY _ZTV7ee57061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57061[];
static VTBL_ENTRY alt_thunk_names508[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee570613barEv,_ZTv0_n16_N7ee570613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee570613barEv,_ZThn16_N7ee570613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee570613barEv,_ZThn8_N7ee570613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57061 = {  "ee57061", // class name
  bases_ee57061, 4,
  &(vtc_ee57061[0]), // expected_vtbl_contents
  &(vtt_ee57061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57061),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57061),5, //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  ee67061  : dd7061 {
  int e;
  virtual void  foo(); // _ZN7ee670613fooEv
  virtual void  bar(); // _ZN7ee670613barEv
  ~ee67061(); // tgen
  ee67061(); // tgen
};
//SIG(1 ee67061) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67061 ::foo(){vfunc_called(this, "_ZN7ee670613fooEv");}
void  ee67061 ::bar(){vfunc_called(this, "_ZN7ee670613barEv");}
ee67061 ::~ee67061(){ note_dtor("ee67061", this);} // tgen
ee67061 ::ee67061(){ note_ctor("ee67061", this);} // tgen

static void Test_ee67061()
{
  extern Class_Descriptor cd_ee67061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67061, buf);
    ee67061 *dp, &lv = *(dp=new (buf) ee67061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(16,12), "ee67061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(16,12), "ee67061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(16,12), "ee67061");
    check_base_class_offset(lv, (dd7061*), 0, "ee67061");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67061.e");
    test_class_info(&lv, &cd_ee67061);
    dp->~ee67061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67061(Test_ee67061, "ee67061", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67061C1Ev();
extern void _ZN7ee67061D1Ev();
Name_Map name_map_ee67061[] = {
  NSPAIR(_ZN7ee67061C1Ev),
  NSPAIR(_ZN7ee67061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee67061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67061[];
extern void _ZN7ee670613barEv();
extern void _ZN7ee670613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee670613fooEv,_ZTv0_n12_N7ee670613fooEv)();
extern void ABISELECT(_ZThn16_N7ee670613fooEv,_ZThn12_N7ee670613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee670613barEv,_ZTv0_n16_N7ee670613barEv)();
extern void ABISELECT(_ZThn16_N7ee670613barEv,_ZThn12_N7ee670613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67061[0]),
  (VTBL_ENTRY)&_ZN7ee670613barEv,
  (VTBL_ENTRY)&_ZN7ee670613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee670613fooEv,_ZTv0_n12_N7ee670613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee670613barEv,_ZTv0_n16_N7ee670613barEv),
};
extern VTBL_ENTRY _ZTV7ee67061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee67061[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee67061[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee67061[] = {
  {&(_ZTV7ee67061[3]),  3,11},
  {&(_tg__ZTV6dd7061__7ee67061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee67061[4]),  4,6},
  {&(_ZTV7ee67061[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67061[];
extern  VTBL_ENTRY _ZTV7ee67061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67061[];
static VTBL_ENTRY alt_thunk_names509[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn12_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn12_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee670613barEv,_ZTv0_n16_N7ee670613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee670613barEv,_ZThn12_N7ee670613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee670613fooEv,_ZTv0_n12_N7ee670613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee670613fooEv,_ZThn12_N7ee670613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67061 = {  "ee67061", // class name
  bases_ee67061, 4,
  &(vtc_ee67061[0]), // expected_vtbl_contents
  &(vtt_ee67061[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67061),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67061),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67061),4, //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  ee77061  : virtual dd7061 {
  int e;
  virtual void  foo(); // _ZN7ee770613fooEv
  virtual void  bar(); // _ZN7ee770613barEv
  ~ee77061(); // tgen
  ee77061(); // tgen
};
//SIG(1 ee77061) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77061 ::foo(){vfunc_called(this, "_ZN7ee770613fooEv");}
void  ee77061 ::bar(){vfunc_called(this, "_ZN7ee770613barEv");}
ee77061 ::~ee77061(){ note_dtor("ee77061", this);} // tgen
ee77061 ::ee77061(){ note_ctor("ee77061", this);} // tgen

static void Test_ee77061()
{
  extern Class_Descriptor cd_ee77061;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77061, buf);
    ee77061 *dp, &lv = *(dp=new (buf) ee77061());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77061)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77061)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc061*), ABISELECT(32,16), "ee77061");
    check_base_class_offset(lv, (bb61*)(cc061*), ABISELECT(32,16), "ee77061");
    check_base_class_offset(lv, (cc061*)(dd7061*), ABISELECT(32,16), "ee77061");
    check_base_class_offset(lv, (dd7061*), ABISELECT(16,8), "ee77061");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77061.e");
    test_class_info(&lv, &cd_ee77061);
    dp->~ee77061();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77061(Test_ee77061, "ee77061", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77061C1Ev();
extern void _ZN7ee77061D1Ev();
Name_Map name_map_ee77061[] = {
  NSPAIR(_ZN7ee77061C1Ev),
  NSPAIR(_ZN7ee77061D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc061;
extern VTBL_ENTRY _ZTI5cc061[];
extern  VTBL_ENTRY _ZTV5cc061[];
extern Class_Descriptor cd_dd7061;
extern VTBL_ENTRY _ZTI6dd7061[];
extern  VTBL_ENTRY _ZTV6dd7061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7061[];
static Base_Class bases_ee77061[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc061,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7061,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77061[];
extern void _ZN7ee770613fooEv();
extern void _ZN7ee770613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee770613barEv,_ZTv0_n16_N7ee770613barEv)();
extern void ABISELECT(_ZThn16_N7ee770613barEv,_ZThn8_N7ee770613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee770613fooEv,_ZTv0_n20_N7ee770613fooEv)();
extern void ABISELECT(_ZThn16_N7ee770613fooEv,_ZThn8_N7ee770613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee770613fooEv,_ZTv0_n12_N7ee770613fooEv)();
extern void ABISELECT(_ZThn32_N7ee770613fooEv,_ZThn16_N7ee770613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee770613barEv,_ZTv0_n16_N7ee770613barEv)();
extern void ABISELECT(_ZThn32_N7ee770613barEv,_ZThn16_N7ee770613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77061[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77061[0]),
  (VTBL_ENTRY)&_ZN7ee770613fooEv,
  (VTBL_ENTRY)&_ZN7ee770613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee770613barEv,_ZTv0_n16_N7ee770613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee770613fooEv,_ZTv0_n20_N7ee770613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee770613fooEv,_ZTv0_n12_N7ee770613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee770613barEv,_ZTv0_n16_N7ee770613barEv),
};
extern VTBL_ENTRY _ZTV7ee77061[];
extern void _ZN6dd70613barEv();
extern void _ZN6dd70613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7061__7ee77061[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&_ZN6dd70613barEv,
  (VTBL_ENTRY)&_ZN6dd70613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv)();
extern void ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv)();
extern void ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb615cc061__6dd7061__7ee77061[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7061[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv),
};
static  VTT_ENTRY vtt_ee77061[] = {
  {&(_ZTV7ee77061[4]),  4,19},
  {&(_ZTV7ee77061[11]),  11,19},
  {&(_ZTV7ee77061[17]),  17,19},
  {&(_tg__ZTV6dd7061__7ee77061[3]),  3,5},
  {&(_tg__ZTV4bb615cc061__6dd7061__7ee77061[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77061[];
extern  VTBL_ENTRY _ZTV7ee77061[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77061[];
static VTBL_ENTRY alt_thunk_names510[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70613barEv,_ZTv0_n16_N6dd70613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613barEv,_ZThn8_N6dd70613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70613fooEv,_ZTv0_n12_N6dd70613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70613fooEv,_ZThn8_N6dd70613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee770613fooEv,_ZTv0_n12_N7ee770613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee770613fooEv,_ZThn16_N7ee770613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee770613fooEv,_ZTv0_n20_N7ee770613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee770613fooEv,_ZThn8_N7ee770613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee770613barEv,_ZTv0_n16_N7ee770613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee770613barEv,_ZThn16_N7ee770613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee770613barEv,_ZThn8_N7ee770613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77061 = {  "ee77061", // class name
  bases_ee77061, 4,
  &(vtc_ee77061[0]), // expected_vtbl_contents
  &(vtt_ee77061[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77061),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77061),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77061),5, //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  cc161  : virtual bb61 {
  int c;
  ~cc161(); // tgen
  cc161(); // tgen
};
//SIG(-1 cc161) C1{ VBC2{ BC3{ v2 Fi} v1 v2 Fi} Fi}


cc161 ::~cc161(){ note_dtor("cc161", this);} // tgen
cc161 ::cc161(){ note_ctor("cc161", this);} // tgen

static void Test_cc161()
{
  extern Class_Descriptor cd_cc161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc161, buf);
    cc161 *dp, &lv = *(dp=new (buf) cc161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,8), "cc161");
    check_base_class_offset(lv, (bb61*), ABISELECT(16,8), "cc161");
    check_field_offset(lv, c, ABISELECT(8,4), "cc161.c");
    test_class_info(&lv, &cd_cc161);
    dp->~cc161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc161(Test_cc161, "cc161", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc161C1Ev();
extern void _ZN5cc161D1Ev();
Name_Map name_map_cc161[] = {
  NSPAIR(_ZN5cc161C1Ev),
  NSPAIR(_ZN5cc161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI5cc161[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_cc161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV5cc161[];
static  VTT_ENTRY vtt_cc161[] = {
  {&(_ZTV5cc161[3]),  3,9},
  {&(_ZTV5cc161[7]),  7,9},
};
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
Class_Descriptor cd_cc161 = {  "cc161", // class name
  bases_cc161, 2,
  &(vtc_cc161[0]), // expected_vtbl_contents
  &(vtt_cc161[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc161),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc161),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  dd0161  : cc161 {
  int d;
  ~dd0161(); // tgen
  dd0161(); // tgen
};
//SIG(-1 dd0161) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} Fi}


dd0161 ::~dd0161(){ note_dtor("dd0161", this);} // tgen
dd0161 ::dd0161(){ note_ctor("dd0161", this);} // tgen

static void Test_dd0161()
{
  extern Class_Descriptor cd_dd0161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0161, buf);
    dd0161 *dp, &lv = *(dp=new (buf) dd0161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd0161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(16,12), "dd0161");
    check_base_class_offset(lv, (cc161*), 0, "dd0161");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0161.d");
    test_class_info(&lv, &cd_dd0161);
    dp->~dd0161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0161(Test_dd0161, "dd0161", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0161C1Ev();
extern void _ZN6dd0161D1Ev();
Name_Map name_map_dd0161[] = {
  NSPAIR(_ZN6dd0161C1Ev),
  NSPAIR(_ZN6dd0161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd0161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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_cc161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0161[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd0161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd0161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd0161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd0161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd0161[] = {
  {&(_ZTV6dd0161[3]),  3,9},
  {&(_tg__ZTV5cc161__6dd0161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd0161[4]),  4,6},
  {&(_ZTV6dd0161[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
Class_Descriptor cd_dd0161 = {  "dd0161", // class name
  bases_dd0161, 3,
  &(vtc_dd0161[0]), // expected_vtbl_contents
  &(vtt_dd0161[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0161),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0161),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  ee00161  : dd0161 {
  int e;
  ~ee00161(); // tgen
  ee00161(); // tgen
};
//SIG(1 ee00161) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee00161 ::~ee00161(){ note_dtor("ee00161", this);} // tgen
ee00161 ::ee00161(){ note_ctor("ee00161", this);} // tgen

static void Test_ee00161()
{
  extern Class_Descriptor cd_ee00161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00161, buf);
    ee00161 *dp, &lv = *(dp=new (buf) ee00161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee00161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(24,16), "ee00161");
    check_base_class_offset(lv, (cc161*)(dd0161*), 0, "ee00161");
    check_base_class_offset(lv, (dd0161*), 0, "ee00161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00161.e");
    test_class_info(&lv, &cd_ee00161);
    dp->~ee00161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00161(Test_ee00161, "ee00161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00161C1Ev();
extern void _ZN7ee00161D1Ev();
Name_Map name_map_ee00161[] = {
  NSPAIR(_ZN7ee00161C1Ev),
  NSPAIR(_ZN7ee00161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee00161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00161[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee00161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00161[0]),
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee00161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee00161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee00161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee00161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee00161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee00161[] = {
  {&(_ZTV7ee00161[3]),  3,9},
  {&(_tg__ZTV6dd0161__7ee00161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee00161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee00161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee00161[4]),  4,6},
  {&(_ZTV7ee00161[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee00161[];
extern  VTBL_ENTRY _ZTV7ee00161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00161[];
Class_Descriptor cd_ee00161 = {  "ee00161", // class name
  bases_ee00161, 4,
  &(vtc_ee00161[0]), // expected_vtbl_contents
  &(vtt_ee00161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00161),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10161  : virtual dd0161 {
  int e;
  ~ee10161(); // tgen
  ee10161(); // tgen
};
//SIG(1 ee10161) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee10161 ::~ee10161(){ note_dtor("ee10161", this);} // tgen
ee10161 ::ee10161(){ note_ctor("ee10161", this);} // tgen

static void Test_ee10161()
{
  extern Class_Descriptor cd_ee10161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10161, buf);
    ee10161 *dp, &lv = *(dp=new (buf) ee10161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee10161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(32,20), "ee10161");
    check_base_class_offset(lv, (cc161*)(dd0161*), ABISELECT(16,8), "ee10161");
    check_base_class_offset(lv, (dd0161*), ABISELECT(16,8), "ee10161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10161.e");
    test_class_info(&lv, &cd_ee10161);
    dp->~ee10161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10161(Test_ee10161, "ee10161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10161C1Ev();
extern void _ZN7ee10161D1Ev();
Name_Map name_map_ee10161[] = {
  NSPAIR(_ZN7ee10161C1Ev),
  NSPAIR(_ZN7ee10161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee10161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee10161[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee10161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10161[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10161[0]),
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee10161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee10161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee10161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee10161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee10161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee10161[] = {
  {&(_ZTV7ee10161[4]),  4,13},
  {&(_ZTV7ee10161[7]),  7,13},
  {&(_ZTV7ee10161[11]),  11,13},
  {&(_tg__ZTV6dd0161__7ee10161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee10161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee10161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee10161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10161[];
extern  VTBL_ENTRY _ZTV7ee10161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10161[];
Class_Descriptor cd_ee10161 = {  "ee10161", // class name
  bases_ee10161, 4,
  &(vtc_ee10161[0]), // expected_vtbl_contents
  &(vtt_ee10161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10161),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10161),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20161  : dd0161 {
  int e;
  virtual void  foo(); // _ZN7ee201613fooEv
  ~ee20161(); // tgen
  ee20161(); // tgen
};
//SIG(1 ee20161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee20161 ::foo(){vfunc_called(this, "_ZN7ee201613fooEv");}
ee20161 ::~ee20161(){ note_dtor("ee20161", this);} // tgen
ee20161 ::ee20161(){ note_ctor("ee20161", this);} // tgen

static void Test_ee20161()
{
  extern Class_Descriptor cd_ee20161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20161, buf);
    ee20161 *dp, &lv = *(dp=new (buf) ee20161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee20161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(24,16), "ee20161");
    check_base_class_offset(lv, (cc161*)(dd0161*), 0, "ee20161");
    check_base_class_offset(lv, (dd0161*), 0, "ee20161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20161.e");
    test_class_info(&lv, &cd_ee20161);
    dp->~ee20161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20161(Test_ee20161, "ee20161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20161C1Ev();
extern void _ZN7ee20161D1Ev();
Name_Map name_map_ee20161[] = {
  NSPAIR(_ZN7ee20161C1Ev),
  NSPAIR(_ZN7ee20161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee20161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20161[];
extern void _ZN7ee201613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee201613fooEv,_ZTv0_n12_N7ee201613fooEv)();
extern void ABISELECT(_ZThn24_N7ee201613fooEv,_ZThn16_N7ee201613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee20161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20161[0]),
  (VTBL_ENTRY)&_ZN7ee201613fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee201613fooEv,_ZTv0_n12_N7ee201613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee20161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee20161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee20161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee20161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee20161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee20161[] = {
  {&(_ZTV7ee20161[3]),  3,10},
  {&(_tg__ZTV6dd0161__7ee20161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee20161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee20161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee20161[4]),  4,6},
  {&(_ZTV7ee20161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee20161[];
extern  VTBL_ENTRY _ZTV7ee20161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20161[];
static VTBL_ENTRY alt_thunk_names511[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee201613fooEv,_ZTv0_n12_N7ee201613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee201613fooEv,_ZThn16_N7ee201613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20161 = {  "ee20161", // class name
  bases_ee20161, 4,
  &(vtc_ee20161[0]), // expected_vtbl_contents
  &(vtt_ee20161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20161),6, //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  ee30161  : virtual dd0161 {
  int e;
  virtual void  foo(); // _ZN7ee301613fooEv
  ~ee30161(); // tgen
  ee30161(); // tgen
};
//SIG(1 ee30161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee30161 ::foo(){vfunc_called(this, "_ZN7ee301613fooEv");}
ee30161 ::~ee30161(){ note_dtor("ee30161", this);} // tgen
ee30161 ::ee30161(){ note_ctor("ee30161", this);} // tgen

static void Test_ee30161()
{
  extern Class_Descriptor cd_ee30161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30161, buf);
    ee30161 *dp, &lv = *(dp=new (buf) ee30161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee30161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(32,20), "ee30161");
    check_base_class_offset(lv, (cc161*)(dd0161*), ABISELECT(16,8), "ee30161");
    check_base_class_offset(lv, (dd0161*), ABISELECT(16,8), "ee30161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30161.e");
    test_class_info(&lv, &cd_ee30161);
    dp->~ee30161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30161(Test_ee30161, "ee30161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30161C1Ev();
extern void _ZN7ee30161D1Ev();
Name_Map name_map_ee30161[] = {
  NSPAIR(_ZN7ee30161C1Ev),
  NSPAIR(_ZN7ee30161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee30161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee30161[];
extern void _ZN7ee301613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee301613fooEv,_ZTv0_n12_N7ee301613fooEv)();
extern void ABISELECT(_ZThn32_N7ee301613fooEv,_ZThn20_N7ee301613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee30161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30161[0]),
  (VTBL_ENTRY)&_ZN7ee301613fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30161[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee301613fooEv,_ZTv0_n12_N7ee301613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee30161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee30161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee30161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee30161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee30161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee30161[] = {
  {&(_ZTV7ee30161[4]),  4,14},
  {&(_ZTV7ee30161[8]),  8,14},
  {&(_ZTV7ee30161[12]),  12,14},
  {&(_tg__ZTV6dd0161__7ee30161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee30161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee30161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee30161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30161[];
extern  VTBL_ENTRY _ZTV7ee30161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30161[];
static VTBL_ENTRY alt_thunk_names512[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee301613fooEv,_ZTv0_n12_N7ee301613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee301613fooEv,_ZThn20_N7ee301613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30161 = {  "ee30161", // class name
  bases_ee30161, 4,
  &(vtc_ee30161[0]), // expected_vtbl_contents
  &(vtt_ee30161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30161),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names512,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40161  : dd0161 {
  int e;
  virtual void  bar(); // _ZN7ee401613barEv
  ~ee40161(); // tgen
  ee40161(); // tgen
};
//SIG(1 ee40161) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee40161 ::bar(){vfunc_called(this, "_ZN7ee401613barEv");}
ee40161 ::~ee40161(){ note_dtor("ee40161", this);} // tgen
ee40161 ::ee40161(){ note_ctor("ee40161", this);} // tgen

static void Test_ee40161()
{
  extern Class_Descriptor cd_ee40161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40161, buf);
    ee40161 *dp, &lv = *(dp=new (buf) ee40161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee40161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(24,16), "ee40161");
    check_base_class_offset(lv, (cc161*)(dd0161*), 0, "ee40161");
    check_base_class_offset(lv, (dd0161*), 0, "ee40161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40161.e");
    test_class_info(&lv, &cd_ee40161);
    dp->~ee40161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40161(Test_ee40161, "ee40161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40161C1Ev();
extern void _ZN7ee40161D1Ev();
Name_Map name_map_ee40161[] = {
  NSPAIR(_ZN7ee40161C1Ev),
  NSPAIR(_ZN7ee40161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee40161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40161[];
extern void _ZN7ee401613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee401613barEv,_ZTv0_n16_N7ee401613barEv)();
extern void ABISELECT(_ZThn24_N7ee401613barEv,_ZThn16_N7ee401613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40161[0]),
  (VTBL_ENTRY)&_ZN7ee401613barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee401613barEv,_ZTv0_n16_N7ee401613barEv),
};
extern VTBL_ENTRY _ZTV7ee40161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee40161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee40161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee40161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee40161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee40161[] = {
  {&(_ZTV7ee40161[3]),  3,10},
  {&(_tg__ZTV6dd0161__7ee40161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee40161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee40161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee40161[4]),  4,6},
  {&(_ZTV7ee40161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee40161[];
extern  VTBL_ENTRY _ZTV7ee40161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40161[];
static VTBL_ENTRY alt_thunk_names513[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee401613barEv,_ZTv0_n16_N7ee401613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee401613barEv,_ZThn16_N7ee401613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40161 = {  "ee40161", // class name
  bases_ee40161, 4,
  &(vtc_ee40161[0]), // expected_vtbl_contents
  &(vtt_ee40161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40161),6, //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  ee50161  : virtual dd0161 {
  int e;
  virtual void  bar(); // _ZN7ee501613barEv
  ~ee50161(); // tgen
  ee50161(); // tgen
};
//SIG(1 ee50161) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee50161 ::bar(){vfunc_called(this, "_ZN7ee501613barEv");}
ee50161 ::~ee50161(){ note_dtor("ee50161", this);} // tgen
ee50161 ::ee50161(){ note_ctor("ee50161", this);} // tgen

static void Test_ee50161()
{
  extern Class_Descriptor cd_ee50161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50161, buf);
    ee50161 *dp, &lv = *(dp=new (buf) ee50161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee50161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(32,20), "ee50161");
    check_base_class_offset(lv, (cc161*)(dd0161*), ABISELECT(16,8), "ee50161");
    check_base_class_offset(lv, (dd0161*), ABISELECT(16,8), "ee50161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50161.e");
    test_class_info(&lv, &cd_ee50161);
    dp->~ee50161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50161(Test_ee50161, "ee50161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50161C1Ev();
extern void _ZN7ee50161D1Ev();
Name_Map name_map_ee50161[] = {
  NSPAIR(_ZN7ee50161C1Ev),
  NSPAIR(_ZN7ee50161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee50161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee50161[];
extern void _ZN7ee501613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee501613barEv,_ZTv0_n16_N7ee501613barEv)();
extern void ABISELECT(_ZThn32_N7ee501613barEv,_ZThn20_N7ee501613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50161[0]),
  (VTBL_ENTRY)&_ZN7ee501613barEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50161[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee501613barEv,_ZTv0_n16_N7ee501613barEv),
};
extern VTBL_ENTRY _ZTV7ee50161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee50161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee50161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee50161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee50161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee50161[] = {
  {&(_ZTV7ee50161[4]),  4,14},
  {&(_ZTV7ee50161[8]),  8,14},
  {&(_ZTV7ee50161[12]),  12,14},
  {&(_tg__ZTV6dd0161__7ee50161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee50161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee50161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee50161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50161[];
extern  VTBL_ENTRY _ZTV7ee50161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50161[];
static VTBL_ENTRY alt_thunk_names514[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee501613barEv,_ZTv0_n16_N7ee501613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee501613barEv,_ZThn20_N7ee501613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50161 = {  "ee50161", // class name
  bases_ee50161, 4,
  &(vtc_ee50161[0]), // expected_vtbl_contents
  &(vtt_ee50161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50161),7, //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  ee60161  : dd0161 {
  int e;
  virtual void  foo(); // _ZN7ee601613fooEv
  virtual void  bar(); // _ZN7ee601613barEv
  ~ee60161(); // tgen
  ee60161(); // tgen
};
//SIG(1 ee60161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee60161 ::foo(){vfunc_called(this, "_ZN7ee601613fooEv");}
void  ee60161 ::bar(){vfunc_called(this, "_ZN7ee601613barEv");}
ee60161 ::~ee60161(){ note_dtor("ee60161", this);} // tgen
ee60161 ::ee60161(){ note_ctor("ee60161", this);} // tgen

static void Test_ee60161()
{
  extern Class_Descriptor cd_ee60161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60161, buf);
    ee60161 *dp, &lv = *(dp=new (buf) ee60161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee60161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(24,16), "ee60161");
    check_base_class_offset(lv, (cc161*)(dd0161*), 0, "ee60161");
    check_base_class_offset(lv, (dd0161*), 0, "ee60161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60161.e");
    test_class_info(&lv, &cd_ee60161);
    dp->~ee60161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60161(Test_ee60161, "ee60161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60161C1Ev();
extern void _ZN7ee60161D1Ev();
Name_Map name_map_ee60161[] = {
  NSPAIR(_ZN7ee60161C1Ev),
  NSPAIR(_ZN7ee60161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee60161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60161[];
extern void _ZN7ee601613fooEv();
extern void _ZN7ee601613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee601613fooEv,_ZTv0_n12_N7ee601613fooEv)();
extern void ABISELECT(_ZThn24_N7ee601613fooEv,_ZThn16_N7ee601613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee601613barEv,_ZTv0_n16_N7ee601613barEv)();
extern void ABISELECT(_ZThn24_N7ee601613barEv,_ZThn16_N7ee601613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60161[0]),
  (VTBL_ENTRY)&_ZN7ee601613fooEv,
  (VTBL_ENTRY)&_ZN7ee601613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee601613fooEv,_ZTv0_n12_N7ee601613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee601613barEv,_ZTv0_n16_N7ee601613barEv),
};
extern VTBL_ENTRY _ZTV7ee60161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee60161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee60161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee60161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee60161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee60161[] = {
  {&(_ZTV7ee60161[3]),  3,11},
  {&(_tg__ZTV6dd0161__7ee60161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee60161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee60161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee60161[4]),  4,6},
  {&(_ZTV7ee60161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60161[];
extern  VTBL_ENTRY _ZTV7ee60161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60161[];
static VTBL_ENTRY alt_thunk_names515[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee601613barEv,_ZTv0_n16_N7ee601613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee601613barEv,_ZThn16_N7ee601613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee601613fooEv,_ZTv0_n12_N7ee601613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee601613fooEv,_ZThn16_N7ee601613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60161 = {  "ee60161", // class name
  bases_ee60161, 4,
  &(vtc_ee60161[0]), // expected_vtbl_contents
  &(vtt_ee60161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60161),6, //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  ee70161  : virtual dd0161 {
  int e;
  virtual void  foo(); // _ZN7ee701613fooEv
  virtual void  bar(); // _ZN7ee701613barEv
  ~ee70161(); // tgen
  ee70161(); // tgen
};
//SIG(1 ee70161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee70161 ::foo(){vfunc_called(this, "_ZN7ee701613fooEv");}
void  ee70161 ::bar(){vfunc_called(this, "_ZN7ee701613barEv");}
ee70161 ::~ee70161(){ note_dtor("ee70161", this);} // tgen
ee70161 ::ee70161(){ note_ctor("ee70161", this);} // tgen

static void Test_ee70161()
{
  extern Class_Descriptor cd_ee70161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70161, buf);
    ee70161 *dp, &lv = *(dp=new (buf) ee70161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee70161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd0161*), ABISELECT(32,20), "ee70161");
    check_base_class_offset(lv, (cc161*)(dd0161*), ABISELECT(16,8), "ee70161");
    check_base_class_offset(lv, (dd0161*), ABISELECT(16,8), "ee70161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70161.e");
    test_class_info(&lv, &cd_ee70161);
    dp->~ee70161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70161(Test_ee70161, "ee70161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70161C1Ev();
extern void _ZN7ee70161D1Ev();
Name_Map name_map_ee70161[] = {
  NSPAIR(_ZN7ee70161C1Ev),
  NSPAIR(_ZN7ee70161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd0161;
extern VTBL_ENTRY _ZTI6dd0161[];
extern  VTBL_ENTRY _ZTV6dd0161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0161[];
static Base_Class bases_ee70161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0161,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee70161[];
extern void _ZN7ee701613fooEv();
extern void _ZN7ee701613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee701613fooEv,_ZTv0_n12_N7ee701613fooEv)();
extern void ABISELECT(_ZThn32_N7ee701613fooEv,_ZThn20_N7ee701613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee701613barEv,_ZTv0_n16_N7ee701613barEv)();
extern void ABISELECT(_ZThn32_N7ee701613barEv,_ZThn20_N7ee701613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70161[0]),
  (VTBL_ENTRY)&_ZN7ee701613fooEv,
  (VTBL_ENTRY)&_ZN7ee701613barEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee701613fooEv,_ZTv0_n12_N7ee701613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee701613barEv,_ZTv0_n16_N7ee701613barEv),
};
extern VTBL_ENTRY _ZTV7ee70161[];
static  VTBL_ENTRY _tg__ZTV6dd0161__7ee70161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd0161__7ee70161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd0161__7ee70161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0161__7ee70161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee70161[] = {
  {&(_ZTV7ee70161[4]),  4,15},
  {&(_ZTV7ee70161[9]),  9,15},
  {&(_ZTV7ee70161[13]),  13,15},
  {&(_tg__ZTV6dd0161__7ee70161[3]),  3,3},
  {&(_tg__ZTV5cc1616dd0161__7ee70161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd0161__7ee70161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0161__7ee70161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70161[];
extern  VTBL_ENTRY _ZTV7ee70161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70161[];
static VTBL_ENTRY alt_thunk_names516[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee701613barEv,_ZTv0_n16_N7ee701613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee701613barEv,_ZThn20_N7ee701613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee701613fooEv,_ZTv0_n12_N7ee701613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee701613fooEv,_ZThn20_N7ee701613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70161 = {  "ee70161", // class name
  bases_ee70161, 4,
  &(vtc_ee70161[0]), // expected_vtbl_contents
  &(vtt_ee70161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70161),7, //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  dd1161  : virtual cc161 {
  int d;
  ~dd1161(); // tgen
  dd1161(); // tgen
};
//SIG(-1 dd1161) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} Fi}


dd1161 ::~dd1161(){ note_dtor("dd1161", this);} // tgen
dd1161 ::dd1161(){ note_ctor("dd1161", this);} // tgen

static void Test_dd1161()
{
  extern Class_Descriptor cd_dd1161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1161, buf);
    dd1161 *dp, &lv = *(dp=new (buf) dd1161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd1161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,16), "dd1161");
    check_base_class_offset(lv, (cc161*), ABISELECT(16,8), "dd1161");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1161.d");
    test_class_info(&lv, &cd_dd1161);
    dp->~dd1161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1161(Test_dd1161, "dd1161", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1161C1Ev();
extern void _ZN6dd1161D1Ev();
Name_Map name_map_dd1161[] = {
  NSPAIR(_ZN6dd1161C1Ev),
  NSPAIR(_ZN6dd1161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd1161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd1161[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd1161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd1161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd1161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd1161[] = {
  {&(_ZTV6dd1161[4]),  4,13},
  {&(_ZTV6dd1161[7]),  7,13},
  {&(_ZTV6dd1161[11]),  11,13},
  {&(_tg__ZTV5cc161__6dd1161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd1161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
Class_Descriptor cd_dd1161 = {  "dd1161", // class name
  bases_dd1161, 3,
  &(vtc_dd1161[0]), // expected_vtbl_contents
  &(vtt_dd1161[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1161),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1161),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  ee01161  : dd1161 {
  int e;
  ~ee01161(); // tgen
  ee01161(); // tgen
};
//SIG(1 ee01161) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee01161 ::~ee01161(){ note_dtor("ee01161", this);} // tgen
ee01161 ::ee01161(){ note_ctor("ee01161", this);} // tgen

static void Test_ee01161()
{
  extern Class_Descriptor cd_ee01161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01161, buf);
    ee01161 *dp, &lv = *(dp=new (buf) ee01161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee01161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee01161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(16,12), "ee01161");
    check_base_class_offset(lv, (dd1161*), 0, "ee01161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01161.e");
    test_class_info(&lv, &cd_ee01161);
    dp->~ee01161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01161(Test_ee01161, "ee01161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01161C1Ev();
extern void _ZN7ee01161D1Ev();
Name_Map name_map_ee01161[] = {
  NSPAIR(_ZN7ee01161C1Ev),
  NSPAIR(_ZN7ee01161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee01161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01161[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee01161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01161[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01161[0]),
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee01161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee01161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee01161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee01161[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee01161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee01161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee01161[] = {
  {&(_ZTV7ee01161[4]),  4,13},
  {&(_tg__ZTV6dd1161__7ee01161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee01161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee01161[4]),  4,6},
  {&(_ZTV7ee01161[7]),  7,13},
  {&(_ZTV7ee01161[11]),  11,13},
  {&(_tg__ZTV5cc161__7ee01161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee01161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01161[];
extern  VTBL_ENTRY _ZTV7ee01161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01161[];
Class_Descriptor cd_ee01161 = {  "ee01161", // class name
  bases_ee01161, 4,
  &(vtc_ee01161[0]), // expected_vtbl_contents
  &(vtt_ee01161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01161),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11161  : virtual dd1161 {
  int e;
  ~ee11161(); // tgen
  ee11161(); // tgen
};
//SIG(1 ee11161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee11161 ::~ee11161(){ note_dtor("ee11161", this);} // tgen
ee11161 ::ee11161(){ note_ctor("ee11161", this);} // tgen

static void Test_ee11161()
{
  extern Class_Descriptor cd_ee11161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11161, buf);
    ee11161 *dp, &lv = *(dp=new (buf) ee11161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee11161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee11161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(32,16), "ee11161");
    check_base_class_offset(lv, (dd1161*), ABISELECT(16,8), "ee11161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11161.e");
    test_class_info(&lv, &cd_ee11161);
    dp->~ee11161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11161(Test_ee11161, "ee11161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11161C1Ev();
extern void _ZN7ee11161D1Ev();
Name_Map name_map_ee11161[] = {
  NSPAIR(_ZN7ee11161C1Ev),
  NSPAIR(_ZN7ee11161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee11161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11161[];
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee11161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11161[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11161[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11161[0]),
  0,
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee11161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee11161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee11161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee11161[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee11161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee11161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee11161[] = {
  {&(_ZTV7ee11161[5]),  5,18},
  {&(_ZTV7ee11161[9]),  9,18},
  {&(_ZTV7ee11161[12]),  12,18},
  {&(_ZTV7ee11161[16]),  16,18},
  {&(_tg__ZTV6dd1161__7ee11161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee11161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee11161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee11161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee11161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11161[];
extern  VTBL_ENTRY _ZTV7ee11161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11161[];
Class_Descriptor cd_ee11161 = {  "ee11161", // class name
  bases_ee11161, 4,
  &(vtc_ee11161[0]), // expected_vtbl_contents
  &(vtt_ee11161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11161),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21161  : dd1161 {
  int e;
  virtual void  foo(); // _ZN7ee211613fooEv
  ~ee21161(); // tgen
  ee21161(); // tgen
};
//SIG(1 ee21161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee21161 ::foo(){vfunc_called(this, "_ZN7ee211613fooEv");}
ee21161 ::~ee21161(){ note_dtor("ee21161", this);} // tgen
ee21161 ::ee21161(){ note_ctor("ee21161", this);} // tgen

static void Test_ee21161()
{
  extern Class_Descriptor cd_ee21161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21161, buf);
    ee21161 *dp, &lv = *(dp=new (buf) ee21161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee21161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee21161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(16,12), "ee21161");
    check_base_class_offset(lv, (dd1161*), 0, "ee21161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21161.e");
    test_class_info(&lv, &cd_ee21161);
    dp->~ee21161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21161(Test_ee21161, "ee21161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21161C1Ev();
extern void _ZN7ee21161D1Ev();
Name_Map name_map_ee21161[] = {
  NSPAIR(_ZN7ee21161C1Ev),
  NSPAIR(_ZN7ee21161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee21161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21161[];
extern void _ZN7ee211613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee211613fooEv,_ZTv0_n12_N7ee211613fooEv)();
extern void ABISELECT(_ZThn32_N7ee211613fooEv,_ZThn20_N7ee211613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee21161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21161[0]),
  (VTBL_ENTRY)&_ZN7ee211613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21161[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee211613fooEv,_ZTv0_n12_N7ee211613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee21161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee21161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee21161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee21161[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee21161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee21161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee21161[] = {
  {&(_ZTV7ee21161[4]),  4,14},
  {&(_tg__ZTV6dd1161__7ee21161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee21161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee21161[4]),  4,6},
  {&(_ZTV7ee21161[8]),  8,14},
  {&(_ZTV7ee21161[12]),  12,14},
  {&(_tg__ZTV5cc161__7ee21161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee21161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21161[];
extern  VTBL_ENTRY _ZTV7ee21161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21161[];
static VTBL_ENTRY alt_thunk_names517[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee211613fooEv,_ZTv0_n12_N7ee211613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee211613fooEv,_ZThn20_N7ee211613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21161 = {  "ee21161", // class name
  bases_ee21161, 4,
  &(vtc_ee21161[0]), // expected_vtbl_contents
  &(vtt_ee21161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names517,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31161  : virtual dd1161 {
  int e;
  virtual void  foo(); // _ZN7ee311613fooEv
  ~ee31161(); // tgen
  ee31161(); // tgen
};
//SIG(1 ee31161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee31161 ::foo(){vfunc_called(this, "_ZN7ee311613fooEv");}
ee31161 ::~ee31161(){ note_dtor("ee31161", this);} // tgen
ee31161 ::ee31161(){ note_ctor("ee31161", this);} // tgen

static void Test_ee31161()
{
  extern Class_Descriptor cd_ee31161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31161, buf);
    ee31161 *dp, &lv = *(dp=new (buf) ee31161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee31161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee31161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(32,16), "ee31161");
    check_base_class_offset(lv, (dd1161*), ABISELECT(16,8), "ee31161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31161.e");
    test_class_info(&lv, &cd_ee31161);
    dp->~ee31161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31161(Test_ee31161, "ee31161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31161C1Ev();
extern void _ZN7ee31161D1Ev();
Name_Map name_map_ee31161[] = {
  NSPAIR(_ZN7ee31161C1Ev),
  NSPAIR(_ZN7ee31161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee31161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31161[];
extern void _ZN7ee311613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee311613fooEv,_ZTv0_n12_N7ee311613fooEv)();
extern void ABISELECT(_ZThn48_N7ee311613fooEv,_ZThn24_N7ee311613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee31161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31161[0]),
  (VTBL_ENTRY)&_ZN7ee311613fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31161[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31161[0]),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee311613fooEv,_ZTv0_n12_N7ee311613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee31161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee31161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee31161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee31161[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee31161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee31161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee31161[] = {
  {&(_ZTV7ee31161[5]),  5,19},
  {&(_ZTV7ee31161[10]),  10,19},
  {&(_ZTV7ee31161[13]),  13,19},
  {&(_ZTV7ee31161[17]),  17,19},
  {&(_tg__ZTV6dd1161__7ee31161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee31161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee31161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee31161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee31161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31161[];
extern  VTBL_ENTRY _ZTV7ee31161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31161[];
static VTBL_ENTRY alt_thunk_names518[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee311613fooEv,_ZTv0_n12_N7ee311613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee311613fooEv,_ZThn24_N7ee311613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31161 = {  "ee31161", // class name
  bases_ee31161, 4,
  &(vtc_ee31161[0]), // expected_vtbl_contents
  &(vtt_ee31161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31161),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names518,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41161  : dd1161 {
  int e;
  virtual void  bar(); // _ZN7ee411613barEv
  ~ee41161(); // tgen
  ee41161(); // tgen
};
//SIG(1 ee41161) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee41161 ::bar(){vfunc_called(this, "_ZN7ee411613barEv");}
ee41161 ::~ee41161(){ note_dtor("ee41161", this);} // tgen
ee41161 ::ee41161(){ note_ctor("ee41161", this);} // tgen

static void Test_ee41161()
{
  extern Class_Descriptor cd_ee41161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41161, buf);
    ee41161 *dp, &lv = *(dp=new (buf) ee41161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee41161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee41161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(16,12), "ee41161");
    check_base_class_offset(lv, (dd1161*), 0, "ee41161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41161.e");
    test_class_info(&lv, &cd_ee41161);
    dp->~ee41161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41161(Test_ee41161, "ee41161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41161C1Ev();
extern void _ZN7ee41161D1Ev();
Name_Map name_map_ee41161[] = {
  NSPAIR(_ZN7ee41161C1Ev),
  NSPAIR(_ZN7ee41161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee41161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41161[];
extern void _ZN7ee411613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee411613barEv,_ZTv0_n16_N7ee411613barEv)();
extern void ABISELECT(_ZThn32_N7ee411613barEv,_ZThn20_N7ee411613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41161[0]),
  (VTBL_ENTRY)&_ZN7ee411613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41161[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee411613barEv,_ZTv0_n16_N7ee411613barEv),
};
extern VTBL_ENTRY _ZTV7ee41161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee41161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee41161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee41161[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee41161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee41161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee41161[] = {
  {&(_ZTV7ee41161[4]),  4,14},
  {&(_tg__ZTV6dd1161__7ee41161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee41161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee41161[4]),  4,6},
  {&(_ZTV7ee41161[8]),  8,14},
  {&(_ZTV7ee41161[12]),  12,14},
  {&(_tg__ZTV5cc161__7ee41161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee41161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41161[];
extern  VTBL_ENTRY _ZTV7ee41161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41161[];
static VTBL_ENTRY alt_thunk_names519[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee411613barEv,_ZTv0_n16_N7ee411613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee411613barEv,_ZThn20_N7ee411613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41161 = {  "ee41161", // class name
  bases_ee41161, 4,
  &(vtc_ee41161[0]), // expected_vtbl_contents
  &(vtt_ee41161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names519,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51161  : virtual dd1161 {
  int e;
  virtual void  bar(); // _ZN7ee511613barEv
  ~ee51161(); // tgen
  ee51161(); // tgen
};
//SIG(1 ee51161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee51161 ::bar(){vfunc_called(this, "_ZN7ee511613barEv");}
ee51161 ::~ee51161(){ note_dtor("ee51161", this);} // tgen
ee51161 ::ee51161(){ note_ctor("ee51161", this);} // tgen

static void Test_ee51161()
{
  extern Class_Descriptor cd_ee51161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51161, buf);
    ee51161 *dp, &lv = *(dp=new (buf) ee51161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee51161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee51161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(32,16), "ee51161");
    check_base_class_offset(lv, (dd1161*), ABISELECT(16,8), "ee51161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51161.e");
    test_class_info(&lv, &cd_ee51161);
    dp->~ee51161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51161(Test_ee51161, "ee51161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51161C1Ev();
extern void _ZN7ee51161D1Ev();
Name_Map name_map_ee51161[] = {
  NSPAIR(_ZN7ee51161C1Ev),
  NSPAIR(_ZN7ee51161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee51161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51161[];
extern void _ZN7ee511613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee511613barEv,_ZTv0_n16_N7ee511613barEv)();
extern void ABISELECT(_ZThn48_N7ee511613barEv,_ZThn24_N7ee511613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51161[0]),
  (VTBL_ENTRY)&_ZN7ee511613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51161[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51161[0]),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee511613barEv,_ZTv0_n16_N7ee511613barEv),
};
extern VTBL_ENTRY _ZTV7ee51161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee51161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee51161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee51161[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee51161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee51161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee51161[] = {
  {&(_ZTV7ee51161[5]),  5,19},
  {&(_ZTV7ee51161[10]),  10,19},
  {&(_ZTV7ee51161[13]),  13,19},
  {&(_ZTV7ee51161[17]),  17,19},
  {&(_tg__ZTV6dd1161__7ee51161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee51161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee51161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee51161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee51161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51161[];
extern  VTBL_ENTRY _ZTV7ee51161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51161[];
static VTBL_ENTRY alt_thunk_names520[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee511613barEv,_ZTv0_n16_N7ee511613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee511613barEv,_ZThn24_N7ee511613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51161 = {  "ee51161", // class name
  bases_ee51161, 4,
  &(vtc_ee51161[0]), // expected_vtbl_contents
  &(vtt_ee51161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51161),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names520,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61161  : dd1161 {
  int e;
  virtual void  foo(); // _ZN7ee611613fooEv
  virtual void  bar(); // _ZN7ee611613barEv
  ~ee61161(); // tgen
  ee61161(); // tgen
};
//SIG(1 ee61161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee61161 ::foo(){vfunc_called(this, "_ZN7ee611613fooEv");}
void  ee61161 ::bar(){vfunc_called(this, "_ZN7ee611613barEv");}
ee61161 ::~ee61161(){ note_dtor("ee61161", this);} // tgen
ee61161 ::ee61161(){ note_ctor("ee61161", this);} // tgen

static void Test_ee61161()
{
  extern Class_Descriptor cd_ee61161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61161, buf);
    ee61161 *dp, &lv = *(dp=new (buf) ee61161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee61161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee61161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(16,12), "ee61161");
    check_base_class_offset(lv, (dd1161*), 0, "ee61161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61161.e");
    test_class_info(&lv, &cd_ee61161);
    dp->~ee61161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61161(Test_ee61161, "ee61161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61161C1Ev();
extern void _ZN7ee61161D1Ev();
Name_Map name_map_ee61161[] = {
  NSPAIR(_ZN7ee61161C1Ev),
  NSPAIR(_ZN7ee61161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee61161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61161[];
extern void _ZN7ee611613fooEv();
extern void _ZN7ee611613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee611613fooEv,_ZTv0_n12_N7ee611613fooEv)();
extern void ABISELECT(_ZThn32_N7ee611613fooEv,_ZThn20_N7ee611613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee611613barEv,_ZTv0_n16_N7ee611613barEv)();
extern void ABISELECT(_ZThn32_N7ee611613barEv,_ZThn20_N7ee611613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61161[0]),
  (VTBL_ENTRY)&_ZN7ee611613fooEv,
  (VTBL_ENTRY)&_ZN7ee611613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee611613fooEv,_ZTv0_n12_N7ee611613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee611613barEv,_ZTv0_n16_N7ee611613barEv),
};
extern VTBL_ENTRY _ZTV7ee61161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee61161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee61161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee61161[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee61161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee61161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee61161[] = {
  {&(_ZTV7ee61161[4]),  4,15},
  {&(_tg__ZTV6dd1161__7ee61161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee61161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee61161[4]),  4,6},
  {&(_ZTV7ee61161[9]),  9,15},
  {&(_ZTV7ee61161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee61161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee61161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61161[];
extern  VTBL_ENTRY _ZTV7ee61161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61161[];
static VTBL_ENTRY alt_thunk_names521[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee611613barEv,_ZTv0_n16_N7ee611613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee611613barEv,_ZThn20_N7ee611613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee611613fooEv,_ZTv0_n12_N7ee611613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee611613fooEv,_ZThn20_N7ee611613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61161 = {  "ee61161", // class name
  bases_ee61161, 4,
  &(vtc_ee61161[0]), // expected_vtbl_contents
  &(vtt_ee61161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names521,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71161  : virtual dd1161 {
  int e;
  virtual void  foo(); // _ZN7ee711613fooEv
  virtual void  bar(); // _ZN7ee711613barEv
  ~ee71161(); // tgen
  ee71161(); // tgen
};
//SIG(1 ee71161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee71161 ::foo(){vfunc_called(this, "_ZN7ee711613fooEv");}
void  ee71161 ::bar(){vfunc_called(this, "_ZN7ee711613barEv");}
ee71161 ::~ee71161(){ note_dtor("ee71161", this);} // tgen
ee71161 ::ee71161(){ note_ctor("ee71161", this);} // tgen

static void Test_ee71161()
{
  extern Class_Descriptor cd_ee71161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71161, buf);
    ee71161 *dp, &lv = *(dp=new (buf) ee71161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee71161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee71161");
    check_base_class_offset(lv, (cc161*)(dd1161*), ABISELECT(32,16), "ee71161");
    check_base_class_offset(lv, (dd1161*), ABISELECT(16,8), "ee71161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71161.e");
    test_class_info(&lv, &cd_ee71161);
    dp->~ee71161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71161(Test_ee71161, "ee71161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71161C1Ev();
extern void _ZN7ee71161D1Ev();
Name_Map name_map_ee71161[] = {
  NSPAIR(_ZN7ee71161C1Ev),
  NSPAIR(_ZN7ee71161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd1161;
extern VTBL_ENTRY _ZTI6dd1161[];
extern  VTBL_ENTRY _ZTV6dd1161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1161[];
static Base_Class bases_ee71161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1161,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71161[];
extern void _ZN7ee711613fooEv();
extern void _ZN7ee711613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee711613fooEv,_ZTv0_n12_N7ee711613fooEv)();
extern void ABISELECT(_ZThn48_N7ee711613fooEv,_ZThn24_N7ee711613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee711613barEv,_ZTv0_n16_N7ee711613barEv)();
extern void ABISELECT(_ZThn48_N7ee711613barEv,_ZThn24_N7ee711613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71161[0]),
  (VTBL_ENTRY)&_ZN7ee711613fooEv,
  (VTBL_ENTRY)&_ZN7ee711613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71161[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71161[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee711613fooEv,_ZTv0_n12_N7ee711613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee711613barEv,_ZTv0_n16_N7ee711613barEv),
};
extern VTBL_ENTRY _ZTV7ee71161[];
static  VTBL_ENTRY _tg__ZTV6dd1161__7ee71161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd1161__7ee71161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1161__7ee71161[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee71161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee71161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee71161[] = {
  {&(_ZTV7ee71161[5]),  5,20},
  {&(_ZTV7ee71161[11]),  11,20},
  {&(_ZTV7ee71161[14]),  14,20},
  {&(_ZTV7ee71161[18]),  18,20},
  {&(_tg__ZTV6dd1161__7ee71161[4]),  4,4},
  {&(_tg__ZTV5cc161__6dd1161__7ee71161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd1161__7ee71161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee71161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee71161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71161[];
extern  VTBL_ENTRY _ZTV7ee71161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71161[];
static VTBL_ENTRY alt_thunk_names522[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee711613barEv,_ZTv0_n16_N7ee711613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee711613barEv,_ZThn24_N7ee711613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee711613fooEv,_ZTv0_n12_N7ee711613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee711613fooEv,_ZThn24_N7ee711613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71161 = {  "ee71161", // class name
  bases_ee71161, 4,
  &(vtc_ee71161[0]), // expected_vtbl_contents
  &(vtt_ee71161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71161),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71161),9, //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  dd2161  : cc161 {
  int d;
  virtual void  foo(); // _ZN6dd21613fooEv
  ~dd2161(); // tgen
  dd2161(); // tgen
};
//SIG(-1 dd2161) C1{ BC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd2161 ::foo(){vfunc_called(this, "_ZN6dd21613fooEv");}
dd2161 ::~dd2161(){ note_dtor("dd2161", this);} // tgen
dd2161 ::dd2161(){ note_ctor("dd2161", this);} // tgen

static void Test_dd2161()
{
  extern Class_Descriptor cd_dd2161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2161, buf);
    dd2161 *dp, &lv = *(dp=new (buf) dd2161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd2161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(16,12), "dd2161");
    check_base_class_offset(lv, (cc161*), 0, "dd2161");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2161.d");
    test_class_info(&lv, &cd_dd2161);
    dp->~dd2161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2161(Test_dd2161, "dd2161", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2161C1Ev();
extern void _ZN6dd2161D1Ev();
Name_Map name_map_dd2161[] = {
  NSPAIR(_ZN6dd2161C1Ev),
  NSPAIR(_ZN6dd2161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd2161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2161[];
extern void _ZN6dd21613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd2161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd2161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd2161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd2161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd2161[] = {
  {&(_ZTV6dd2161[3]),  3,10},
  {&(_tg__ZTV5cc161__6dd2161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd2161[4]),  4,6},
  {&(_ZTV6dd2161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static VTBL_ENTRY alt_thunk_names523[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2161 = {  "dd2161", // class name
  bases_dd2161, 3,
  &(vtc_dd2161[0]), // expected_vtbl_contents
  &(vtt_dd2161[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2161),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names523,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02161  : dd2161 {
  int e;
  ~ee02161(); // tgen
  ee02161(); // tgen
};
//SIG(1 ee02161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee02161 ::~ee02161(){ note_dtor("ee02161", this);} // tgen
ee02161 ::ee02161(){ note_ctor("ee02161", this);} // tgen

static void Test_ee02161()
{
  extern Class_Descriptor cd_ee02161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02161, buf);
    ee02161 *dp, &lv = *(dp=new (buf) ee02161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee02161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(24,16), "ee02161");
    check_base_class_offset(lv, (cc161*)(dd2161*), 0, "ee02161");
    check_base_class_offset(lv, (dd2161*), 0, "ee02161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02161.e");
    test_class_info(&lv, &cd_ee02161);
    dp->~ee02161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02161(Test_ee02161, "ee02161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02161C1Ev();
extern void _ZN7ee02161D1Ev();
Name_Map name_map_ee02161[] = {
  NSPAIR(_ZN7ee02161C1Ev),
  NSPAIR(_ZN7ee02161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee02161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02161[];
extern void _ZN6dd21613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee02161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee02161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee02161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee02161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee02161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee02161[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee02161[] = {
  {&(_ZTV7ee02161[3]),  3,10},
  {&(_tg__ZTV6dd2161__7ee02161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee02161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee02161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee02161[4]),  4,6},
  {&(_ZTV7ee02161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee02161[];
extern  VTBL_ENTRY _ZTV7ee02161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02161[];
static VTBL_ENTRY alt_thunk_names524[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02161 = {  "ee02161", // class name
  bases_ee02161, 4,
  &(vtc_ee02161[0]), // expected_vtbl_contents
  &(vtt_ee02161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02161),6, //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  ee12161  : virtual dd2161 {
  int e;
  ~ee12161(); // tgen
  ee12161(); // tgen
};
//SIG(1 ee12161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee12161 ::~ee12161(){ note_dtor("ee12161", this);} // tgen
ee12161 ::ee12161(){ note_ctor("ee12161", this);} // tgen

static void Test_ee12161()
{
  extern Class_Descriptor cd_ee12161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12161, buf);
    ee12161 *dp, &lv = *(dp=new (buf) ee12161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee12161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(32,20), "ee12161");
    check_base_class_offset(lv, (cc161*)(dd2161*), ABISELECT(16,8), "ee12161");
    check_base_class_offset(lv, (dd2161*), ABISELECT(16,8), "ee12161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12161.e");
    test_class_info(&lv, &cd_ee12161);
    dp->~ee12161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12161(Test_ee12161, "ee12161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12161C1Ev();
extern void _ZN7ee12161D1Ev();
Name_Map name_map_ee12161[] = {
  NSPAIR(_ZN7ee12161C1Ev),
  NSPAIR(_ZN7ee12161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee12161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12161[];
extern void _ZN6dd21613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee12161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12161[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee12161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee12161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee12161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee12161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee12161[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee12161[] = {
  {&(_ZTV7ee12161[4]),  4,15},
  {&(_ZTV7ee12161[8]),  8,15},
  {&(_ZTV7ee12161[13]),  13,15},
  {&(_tg__ZTV6dd2161__7ee12161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee12161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee12161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee12161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12161[];
extern  VTBL_ENTRY _ZTV7ee12161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12161[];
static VTBL_ENTRY alt_thunk_names525[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12161 = {  "ee12161", // class name
  bases_ee12161, 4,
  &(vtc_ee12161[0]), // expected_vtbl_contents
  &(vtt_ee12161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12161),7, //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  ee22161  : dd2161 {
  int e;
  virtual void  foo(); // _ZN7ee221613fooEv
  ~ee22161(); // tgen
  ee22161(); // tgen
};
//SIG(1 ee22161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee22161 ::foo(){vfunc_called(this, "_ZN7ee221613fooEv");}
ee22161 ::~ee22161(){ note_dtor("ee22161", this);} // tgen
ee22161 ::ee22161(){ note_ctor("ee22161", this);} // tgen

static void Test_ee22161()
{
  extern Class_Descriptor cd_ee22161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22161, buf);
    ee22161 *dp, &lv = *(dp=new (buf) ee22161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee22161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(24,16), "ee22161");
    check_base_class_offset(lv, (cc161*)(dd2161*), 0, "ee22161");
    check_base_class_offset(lv, (dd2161*), 0, "ee22161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22161.e");
    test_class_info(&lv, &cd_ee22161);
    dp->~ee22161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22161(Test_ee22161, "ee22161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22161C1Ev();
extern void _ZN7ee22161D1Ev();
Name_Map name_map_ee22161[] = {
  NSPAIR(_ZN7ee22161C1Ev),
  NSPAIR(_ZN7ee22161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee22161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22161[];
extern void _ZN7ee221613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee221613fooEv,_ZTv0_n12_N7ee221613fooEv)();
extern void ABISELECT(_ZThn24_N7ee221613fooEv,_ZThn16_N7ee221613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee22161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22161[0]),
  (VTBL_ENTRY)&_ZN7ee221613fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee221613fooEv,_ZTv0_n12_N7ee221613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee22161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee22161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee22161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee22161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee22161[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee22161[] = {
  {&(_ZTV7ee22161[3]),  3,10},
  {&(_tg__ZTV6dd2161__7ee22161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee22161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee22161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee22161[4]),  4,6},
  {&(_ZTV7ee22161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee22161[];
extern  VTBL_ENTRY _ZTV7ee22161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22161[];
static VTBL_ENTRY alt_thunk_names526[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee221613fooEv,_ZTv0_n12_N7ee221613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee221613fooEv,_ZThn16_N7ee221613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22161 = {  "ee22161", // class name
  bases_ee22161, 4,
  &(vtc_ee22161[0]), // expected_vtbl_contents
  &(vtt_ee22161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names526,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32161  : virtual dd2161 {
  int e;
  virtual void  foo(); // _ZN7ee321613fooEv
  ~ee32161(); // tgen
  ee32161(); // tgen
};
//SIG(1 ee32161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee32161 ::foo(){vfunc_called(this, "_ZN7ee321613fooEv");}
ee32161 ::~ee32161(){ note_dtor("ee32161", this);} // tgen
ee32161 ::ee32161(){ note_ctor("ee32161", this);} // tgen

static void Test_ee32161()
{
  extern Class_Descriptor cd_ee32161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32161, buf);
    ee32161 *dp, &lv = *(dp=new (buf) ee32161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee32161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(32,20), "ee32161");
    check_base_class_offset(lv, (cc161*)(dd2161*), ABISELECT(16,8), "ee32161");
    check_base_class_offset(lv, (dd2161*), ABISELECT(16,8), "ee32161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32161.e");
    test_class_info(&lv, &cd_ee32161);
    dp->~ee32161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32161(Test_ee32161, "ee32161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32161C1Ev();
extern void _ZN7ee32161D1Ev();
Name_Map name_map_ee32161[] = {
  NSPAIR(_ZN7ee32161C1Ev),
  NSPAIR(_ZN7ee32161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee32161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32161[];
extern void _ZN7ee321613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee321613fooEv,_ZTv0_n16_N7ee321613fooEv)();
extern void ABISELECT(_ZThn16_N7ee321613fooEv,_ZThn8_N7ee321613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee321613fooEv,_ZTv0_n12_N7ee321613fooEv)();
extern void ABISELECT(_ZThn32_N7ee321613fooEv,_ZThn20_N7ee321613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee32161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32161[0]),
  (VTBL_ENTRY)&_ZN7ee321613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee321613fooEv,_ZTv0_n16_N7ee321613fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee321613fooEv,_ZTv0_n12_N7ee321613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee32161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee32161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee32161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee32161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee32161[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee32161[] = {
  {&(_ZTV7ee32161[4]),  4,16},
  {&(_ZTV7ee32161[9]),  9,16},
  {&(_ZTV7ee32161[14]),  14,16},
  {&(_tg__ZTV6dd2161__7ee32161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee32161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee32161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee32161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32161[];
extern  VTBL_ENTRY _ZTV7ee32161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32161[];
static VTBL_ENTRY alt_thunk_names527[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee321613fooEv,_ZTv0_n12_N7ee321613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee321613fooEv,_ZThn20_N7ee321613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee321613fooEv,_ZTv0_n16_N7ee321613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee321613fooEv,_ZThn8_N7ee321613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32161 = {  "ee32161", // class name
  bases_ee32161, 4,
  &(vtc_ee32161[0]), // expected_vtbl_contents
  &(vtt_ee32161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32161),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32161),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names527,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42161  : dd2161 {
  int e;
  virtual void  bar(); // _ZN7ee421613barEv
  ~ee42161(); // tgen
  ee42161(); // tgen
};
//SIG(1 ee42161) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee42161 ::bar(){vfunc_called(this, "_ZN7ee421613barEv");}
ee42161 ::~ee42161(){ note_dtor("ee42161", this);} // tgen
ee42161 ::ee42161(){ note_ctor("ee42161", this);} // tgen

static void Test_ee42161()
{
  extern Class_Descriptor cd_ee42161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42161, buf);
    ee42161 *dp, &lv = *(dp=new (buf) ee42161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee42161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(24,16), "ee42161");
    check_base_class_offset(lv, (cc161*)(dd2161*), 0, "ee42161");
    check_base_class_offset(lv, (dd2161*), 0, "ee42161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42161.e");
    test_class_info(&lv, &cd_ee42161);
    dp->~ee42161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42161(Test_ee42161, "ee42161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42161C1Ev();
extern void _ZN7ee42161D1Ev();
Name_Map name_map_ee42161[] = {
  NSPAIR(_ZN7ee42161C1Ev),
  NSPAIR(_ZN7ee42161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee42161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42161[];
extern void _ZN6dd21613fooEv();
extern void _ZN7ee421613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee421613barEv,_ZTv0_n16_N7ee421613barEv)();
extern void ABISELECT(_ZThn24_N7ee421613barEv,_ZThn16_N7ee421613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
  (VTBL_ENTRY)&_ZN7ee421613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee421613barEv,_ZTv0_n16_N7ee421613barEv),
};
extern VTBL_ENTRY _ZTV7ee42161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee42161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee42161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee42161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee42161[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee42161[] = {
  {&(_ZTV7ee42161[3]),  3,11},
  {&(_tg__ZTV6dd2161__7ee42161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee42161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee42161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee42161[4]),  4,6},
  {&(_ZTV7ee42161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42161[];
extern  VTBL_ENTRY _ZTV7ee42161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42161[];
static VTBL_ENTRY alt_thunk_names528[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee421613barEv,_ZTv0_n16_N7ee421613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee421613barEv,_ZThn16_N7ee421613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42161 = {  "ee42161", // class name
  bases_ee42161, 4,
  &(vtc_ee42161[0]), // expected_vtbl_contents
  &(vtt_ee42161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names528,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52161  : virtual dd2161 {
  int e;
  virtual void  bar(); // _ZN7ee521613barEv
  ~ee52161(); // tgen
  ee52161(); // tgen
};
//SIG(1 ee52161) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee52161 ::bar(){vfunc_called(this, "_ZN7ee521613barEv");}
ee52161 ::~ee52161(){ note_dtor("ee52161", this);} // tgen
ee52161 ::ee52161(){ note_ctor("ee52161", this);} // tgen

static void Test_ee52161()
{
  extern Class_Descriptor cd_ee52161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52161, buf);
    ee52161 *dp, &lv = *(dp=new (buf) ee52161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee52161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(32,20), "ee52161");
    check_base_class_offset(lv, (cc161*)(dd2161*), ABISELECT(16,8), "ee52161");
    check_base_class_offset(lv, (dd2161*), ABISELECT(16,8), "ee52161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52161.e");
    test_class_info(&lv, &cd_ee52161);
    dp->~ee52161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52161(Test_ee52161, "ee52161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52161C1Ev();
extern void _ZN7ee52161D1Ev();
Name_Map name_map_ee52161[] = {
  NSPAIR(_ZN7ee52161C1Ev),
  NSPAIR(_ZN7ee52161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee52161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52161[];
extern void _ZN7ee521613barEv();
extern void _ZN6dd21613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee521613barEv,_ZTv0_n16_N7ee521613barEv)();
extern void ABISELECT(_ZThn32_N7ee521613barEv,_ZThn20_N7ee521613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52161[0]),
  (VTBL_ENTRY)&_ZN7ee521613barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee521613barEv,_ZTv0_n16_N7ee521613barEv),
};
extern VTBL_ENTRY _ZTV7ee52161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee52161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee52161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee52161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee52161[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee52161[] = {
  {&(_ZTV7ee52161[4]),  4,16},
  {&(_ZTV7ee52161[9]),  9,16},
  {&(_ZTV7ee52161[14]),  14,16},
  {&(_tg__ZTV6dd2161__7ee52161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee52161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee52161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee52161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52161[];
extern  VTBL_ENTRY _ZTV7ee52161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52161[];
static VTBL_ENTRY alt_thunk_names529[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee521613barEv,_ZTv0_n16_N7ee521613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee521613barEv,_ZThn20_N7ee521613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52161 = {  "ee52161", // class name
  bases_ee52161, 4,
  &(vtc_ee52161[0]), // expected_vtbl_contents
  &(vtt_ee52161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52161),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52161),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names529,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62161  : dd2161 {
  int e;
  virtual void  foo(); // _ZN7ee621613fooEv
  virtual void  bar(); // _ZN7ee621613barEv
  ~ee62161(); // tgen
  ee62161(); // tgen
};
//SIG(1 ee62161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee62161 ::foo(){vfunc_called(this, "_ZN7ee621613fooEv");}
void  ee62161 ::bar(){vfunc_called(this, "_ZN7ee621613barEv");}
ee62161 ::~ee62161(){ note_dtor("ee62161", this);} // tgen
ee62161 ::ee62161(){ note_ctor("ee62161", this);} // tgen

static void Test_ee62161()
{
  extern Class_Descriptor cd_ee62161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62161, buf);
    ee62161 *dp, &lv = *(dp=new (buf) ee62161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee62161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(24,16), "ee62161");
    check_base_class_offset(lv, (cc161*)(dd2161*), 0, "ee62161");
    check_base_class_offset(lv, (dd2161*), 0, "ee62161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62161.e");
    test_class_info(&lv, &cd_ee62161);
    dp->~ee62161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62161(Test_ee62161, "ee62161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62161C1Ev();
extern void _ZN7ee62161D1Ev();
Name_Map name_map_ee62161[] = {
  NSPAIR(_ZN7ee62161C1Ev),
  NSPAIR(_ZN7ee62161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee62161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62161[];
extern void _ZN7ee621613fooEv();
extern void _ZN7ee621613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee621613fooEv,_ZTv0_n12_N7ee621613fooEv)();
extern void ABISELECT(_ZThn24_N7ee621613fooEv,_ZThn16_N7ee621613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee621613barEv,_ZTv0_n16_N7ee621613barEv)();
extern void ABISELECT(_ZThn24_N7ee621613barEv,_ZThn16_N7ee621613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62161[0]),
  (VTBL_ENTRY)&_ZN7ee621613fooEv,
  (VTBL_ENTRY)&_ZN7ee621613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee621613fooEv,_ZTv0_n12_N7ee621613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee621613barEv,_ZTv0_n16_N7ee621613barEv),
};
extern VTBL_ENTRY _ZTV7ee62161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee62161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee62161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee62161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee62161[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee62161[] = {
  {&(_ZTV7ee62161[3]),  3,11},
  {&(_tg__ZTV6dd2161__7ee62161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee62161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee62161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee62161[4]),  4,6},
  {&(_ZTV7ee62161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62161[];
extern  VTBL_ENTRY _ZTV7ee62161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62161[];
static VTBL_ENTRY alt_thunk_names530[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21613fooEv,_ZThn16_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee621613barEv,_ZTv0_n16_N7ee621613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee621613barEv,_ZThn16_N7ee621613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee621613fooEv,_ZTv0_n12_N7ee621613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee621613fooEv,_ZThn16_N7ee621613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62161 = {  "ee62161", // class name
  bases_ee62161, 4,
  &(vtc_ee62161[0]), // expected_vtbl_contents
  &(vtt_ee62161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names530,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72161  : virtual dd2161 {
  int e;
  virtual void  foo(); // _ZN7ee721613fooEv
  virtual void  bar(); // _ZN7ee721613barEv
  ~ee72161(); // tgen
  ee72161(); // tgen
};
//SIG(1 ee72161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee72161 ::foo(){vfunc_called(this, "_ZN7ee721613fooEv");}
void  ee72161 ::bar(){vfunc_called(this, "_ZN7ee721613barEv");}
ee72161 ::~ee72161(){ note_dtor("ee72161", this);} // tgen
ee72161 ::ee72161(){ note_ctor("ee72161", this);} // tgen

static void Test_ee72161()
{
  extern Class_Descriptor cd_ee72161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72161, buf);
    ee72161 *dp, &lv = *(dp=new (buf) ee72161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee72161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd2161*), ABISELECT(32,20), "ee72161");
    check_base_class_offset(lv, (cc161*)(dd2161*), ABISELECT(16,8), "ee72161");
    check_base_class_offset(lv, (dd2161*), ABISELECT(16,8), "ee72161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72161.e");
    test_class_info(&lv, &cd_ee72161);
    dp->~ee72161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72161(Test_ee72161, "ee72161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72161C1Ev();
extern void _ZN7ee72161D1Ev();
Name_Map name_map_ee72161[] = {
  NSPAIR(_ZN7ee72161C1Ev),
  NSPAIR(_ZN7ee72161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd2161;
extern VTBL_ENTRY _ZTI6dd2161[];
extern  VTBL_ENTRY _ZTV6dd2161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2161[];
static Base_Class bases_ee72161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2161,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72161[];
extern void _ZN7ee721613fooEv();
extern void _ZN7ee721613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee721613fooEv,_ZTv0_n16_N7ee721613fooEv)();
extern void ABISELECT(_ZThn16_N7ee721613fooEv,_ZThn8_N7ee721613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee721613fooEv,_ZTv0_n12_N7ee721613fooEv)();
extern void ABISELECT(_ZThn32_N7ee721613fooEv,_ZThn20_N7ee721613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee721613barEv,_ZTv0_n16_N7ee721613barEv)();
extern void ABISELECT(_ZThn32_N7ee721613barEv,_ZThn20_N7ee721613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72161[0]),
  (VTBL_ENTRY)&_ZN7ee721613fooEv,
  (VTBL_ENTRY)&_ZN7ee721613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee721613fooEv,_ZTv0_n16_N7ee721613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee721613fooEv,_ZTv0_n12_N7ee721613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee721613barEv,_ZTv0_n16_N7ee721613barEv),
};
extern VTBL_ENTRY _ZTV7ee72161[];
extern void _ZN6dd21613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2161__7ee72161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&_ZN6dd21613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd2161__7ee72161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd2161__7ee72161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv)();
extern void ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2161__7ee72161[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee72161[] = {
  {&(_ZTV7ee72161[4]),  4,17},
  {&(_ZTV7ee72161[10]),  10,17},
  {&(_ZTV7ee72161[15]),  15,17},
  {&(_tg__ZTV6dd2161__7ee72161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd2161__7ee72161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd2161__7ee72161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2161__7ee72161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72161[];
extern  VTBL_ENTRY _ZTV7ee72161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72161[];
static VTBL_ENTRY alt_thunk_names531[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21613fooEv,_ZTv0_n12_N6dd21613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21613fooEv,_ZThn12_N6dd21613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee721613barEv,_ZTv0_n16_N7ee721613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee721613barEv,_ZThn20_N7ee721613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee721613fooEv,_ZTv0_n12_N7ee721613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee721613fooEv,_ZThn20_N7ee721613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee721613fooEv,_ZTv0_n16_N7ee721613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee721613fooEv,_ZThn8_N7ee721613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72161 = {  "ee72161", // class name
  bases_ee72161, 4,
  &(vtc_ee72161[0]), // expected_vtbl_contents
  &(vtt_ee72161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72161),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72161),7, //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  dd3161  : virtual cc161 {
  int d;
  virtual void  foo(); // _ZN6dd31613fooEv
  ~dd3161(); // tgen
  dd3161(); // tgen
};
//SIG(-1 dd3161) C1{ VBC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd3161 ::foo(){vfunc_called(this, "_ZN6dd31613fooEv");}
dd3161 ::~dd3161(){ note_dtor("dd3161", this);} // tgen
dd3161 ::dd3161(){ note_ctor("dd3161", this);} // tgen

static void Test_dd3161()
{
  extern Class_Descriptor cd_dd3161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3161, buf);
    dd3161 *dp, &lv = *(dp=new (buf) dd3161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd3161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,16), "dd3161");
    check_base_class_offset(lv, (cc161*), ABISELECT(16,8), "dd3161");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3161.d");
    test_class_info(&lv, &cd_dd3161);
    dp->~dd3161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3161(Test_dd3161, "dd3161", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3161C1Ev();
extern void _ZN6dd3161D1Ev();
Name_Map name_map_dd3161[] = {
  NSPAIR(_ZN6dd3161C1Ev),
  NSPAIR(_ZN6dd3161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd3161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd3161[];
extern void _ZN6dd31613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd3161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd3161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd3161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd3161[] = {
  {&(_ZTV6dd3161[4]),  4,14},
  {&(_ZTV6dd3161[8]),  8,14},
  {&(_ZTV6dd3161[12]),  12,14},
  {&(_tg__ZTV5cc161__6dd3161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd3161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static VTBL_ENTRY alt_thunk_names532[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3161 = {  "dd3161", // class name
  bases_dd3161, 3,
  &(vtc_dd3161[0]), // expected_vtbl_contents
  &(vtt_dd3161[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3161),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names532,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03161  : dd3161 {
  int e;
  ~ee03161(); // tgen
  ee03161(); // tgen
};
//SIG(1 ee03161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee03161 ::~ee03161(){ note_dtor("ee03161", this);} // tgen
ee03161 ::ee03161(){ note_ctor("ee03161", this);} // tgen

static void Test_ee03161()
{
  extern Class_Descriptor cd_ee03161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03161, buf);
    ee03161 *dp, &lv = *(dp=new (buf) ee03161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee03161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee03161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(16,12), "ee03161");
    check_base_class_offset(lv, (dd3161*), 0, "ee03161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03161.e");
    test_class_info(&lv, &cd_ee03161);
    dp->~ee03161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03161(Test_ee03161, "ee03161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03161C1Ev();
extern void _ZN7ee03161D1Ev();
Name_Map name_map_ee03161[] = {
  NSPAIR(_ZN7ee03161C1Ev),
  NSPAIR(_ZN7ee03161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee03161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03161[];
extern void _ZN6dd31613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee03161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03161[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee03161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee03161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee03161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee03161[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee03161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee03161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee03161[] = {
  {&(_ZTV7ee03161[4]),  4,14},
  {&(_tg__ZTV6dd3161__7ee03161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee03161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee03161[4]),  4,6},
  {&(_ZTV7ee03161[8]),  8,14},
  {&(_ZTV7ee03161[12]),  12,14},
  {&(_tg__ZTV5cc161__7ee03161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee03161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03161[];
extern  VTBL_ENTRY _ZTV7ee03161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03161[];
static VTBL_ENTRY alt_thunk_names533[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03161 = {  "ee03161", // class name
  bases_ee03161, 4,
  &(vtc_ee03161[0]), // expected_vtbl_contents
  &(vtt_ee03161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03161),8, //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  ee13161  : virtual dd3161 {
  int e;
  ~ee13161(); // tgen
  ee13161(); // tgen
};
//SIG(1 ee13161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee13161 ::~ee13161(){ note_dtor("ee13161", this);} // tgen
ee13161 ::ee13161(){ note_ctor("ee13161", this);} // tgen

static void Test_ee13161()
{
  extern Class_Descriptor cd_ee13161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13161, buf);
    ee13161 *dp, &lv = *(dp=new (buf) ee13161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee13161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee13161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(32,16), "ee13161");
    check_base_class_offset(lv, (dd3161*), ABISELECT(16,8), "ee13161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13161.e");
    test_class_info(&lv, &cd_ee13161);
    dp->~ee13161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13161(Test_ee13161, "ee13161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13161C1Ev();
extern void _ZN7ee13161D1Ev();
Name_Map name_map_ee13161[] = {
  NSPAIR(_ZN7ee13161C1Ev),
  NSPAIR(_ZN7ee13161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee13161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13161[];
extern void _ZN6dd31613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee13161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13161[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13161[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee13161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee13161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee13161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee13161[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee13161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee13161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee13161[] = {
  {&(_ZTV7ee13161[5]),  5,20},
  {&(_ZTV7ee13161[10]),  10,20},
  {&(_ZTV7ee13161[14]),  14,20},
  {&(_ZTV7ee13161[18]),  18,20},
  {&(_tg__ZTV6dd3161__7ee13161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee13161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee13161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee13161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee13161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13161[];
extern  VTBL_ENTRY _ZTV7ee13161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13161[];
static VTBL_ENTRY alt_thunk_names534[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13161 = {  "ee13161", // class name
  bases_ee13161, 4,
  &(vtc_ee13161[0]), // expected_vtbl_contents
  &(vtt_ee13161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13161),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13161),9, //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  ee23161  : dd3161 {
  int e;
  virtual void  foo(); // _ZN7ee231613fooEv
  ~ee23161(); // tgen
  ee23161(); // tgen
};
//SIG(1 ee23161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee23161 ::foo(){vfunc_called(this, "_ZN7ee231613fooEv");}
ee23161 ::~ee23161(){ note_dtor("ee23161", this);} // tgen
ee23161 ::ee23161(){ note_ctor("ee23161", this);} // tgen

static void Test_ee23161()
{
  extern Class_Descriptor cd_ee23161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23161, buf);
    ee23161 *dp, &lv = *(dp=new (buf) ee23161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee23161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee23161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(16,12), "ee23161");
    check_base_class_offset(lv, (dd3161*), 0, "ee23161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23161.e");
    test_class_info(&lv, &cd_ee23161);
    dp->~ee23161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23161(Test_ee23161, "ee23161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23161C1Ev();
extern void _ZN7ee23161D1Ev();
Name_Map name_map_ee23161[] = {
  NSPAIR(_ZN7ee23161C1Ev),
  NSPAIR(_ZN7ee23161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee23161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23161[];
extern void _ZN7ee231613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee231613fooEv,_ZTv0_n12_N7ee231613fooEv)();
extern void ABISELECT(_ZThn32_N7ee231613fooEv,_ZThn20_N7ee231613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee23161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23161[0]),
  (VTBL_ENTRY)&_ZN7ee231613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23161[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee231613fooEv,_ZTv0_n12_N7ee231613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee23161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee23161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee23161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee23161[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee23161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee23161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee23161[] = {
  {&(_ZTV7ee23161[4]),  4,14},
  {&(_tg__ZTV6dd3161__7ee23161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee23161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee23161[4]),  4,6},
  {&(_ZTV7ee23161[8]),  8,14},
  {&(_ZTV7ee23161[12]),  12,14},
  {&(_tg__ZTV5cc161__7ee23161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee23161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23161[];
extern  VTBL_ENTRY _ZTV7ee23161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23161[];
static VTBL_ENTRY alt_thunk_names535[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee231613fooEv,_ZTv0_n12_N7ee231613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee231613fooEv,_ZThn20_N7ee231613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23161 = {  "ee23161", // class name
  bases_ee23161, 4,
  &(vtc_ee23161[0]), // expected_vtbl_contents
  &(vtt_ee23161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names535,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33161  : virtual dd3161 {
  int e;
  virtual void  foo(); // _ZN7ee331613fooEv
  ~ee33161(); // tgen
  ee33161(); // tgen
};
//SIG(1 ee33161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee33161 ::foo(){vfunc_called(this, "_ZN7ee331613fooEv");}
ee33161 ::~ee33161(){ note_dtor("ee33161", this);} // tgen
ee33161 ::ee33161(){ note_ctor("ee33161", this);} // tgen

static void Test_ee33161()
{
  extern Class_Descriptor cd_ee33161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33161, buf);
    ee33161 *dp, &lv = *(dp=new (buf) ee33161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee33161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee33161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(32,16), "ee33161");
    check_base_class_offset(lv, (dd3161*), ABISELECT(16,8), "ee33161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33161.e");
    test_class_info(&lv, &cd_ee33161);
    dp->~ee33161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33161(Test_ee33161, "ee33161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33161C1Ev();
extern void _ZN7ee33161D1Ev();
Name_Map name_map_ee33161[] = {
  NSPAIR(_ZN7ee33161C1Ev),
  NSPAIR(_ZN7ee33161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee33161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33161[];
extern void _ZN7ee331613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee331613fooEv,_ZTv0_n20_N7ee331613fooEv)();
extern void ABISELECT(_ZThn16_N7ee331613fooEv,_ZThn8_N7ee331613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee331613fooEv,_ZTv0_n12_N7ee331613fooEv)();
extern void ABISELECT(_ZThn48_N7ee331613fooEv,_ZThn24_N7ee331613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee33161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33161[0]),
  (VTBL_ENTRY)&_ZN7ee331613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee331613fooEv,_ZTv0_n20_N7ee331613fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33161[0]),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee331613fooEv,_ZTv0_n12_N7ee331613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee33161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee33161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee33161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee33161[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee33161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee33161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee33161[] = {
  {&(_ZTV7ee33161[5]),  5,21},
  {&(_ZTV7ee33161[11]),  11,21},
  {&(_ZTV7ee33161[15]),  15,21},
  {&(_ZTV7ee33161[19]),  19,21},
  {&(_tg__ZTV6dd3161__7ee33161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee33161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee33161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee33161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee33161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33161[];
extern  VTBL_ENTRY _ZTV7ee33161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33161[];
static VTBL_ENTRY alt_thunk_names536[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee331613fooEv,_ZTv0_n12_N7ee331613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee331613fooEv,_ZThn24_N7ee331613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee331613fooEv,_ZTv0_n20_N7ee331613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee331613fooEv,_ZThn8_N7ee331613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33161 = {  "ee33161", // class name
  bases_ee33161, 4,
  &(vtc_ee33161[0]), // expected_vtbl_contents
  &(vtt_ee33161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33161),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names536,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43161  : dd3161 {
  int e;
  virtual void  bar(); // _ZN7ee431613barEv
  ~ee43161(); // tgen
  ee43161(); // tgen
};
//SIG(1 ee43161) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee43161 ::bar(){vfunc_called(this, "_ZN7ee431613barEv");}
ee43161 ::~ee43161(){ note_dtor("ee43161", this);} // tgen
ee43161 ::ee43161(){ note_ctor("ee43161", this);} // tgen

static void Test_ee43161()
{
  extern Class_Descriptor cd_ee43161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43161, buf);
    ee43161 *dp, &lv = *(dp=new (buf) ee43161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee43161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee43161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(16,12), "ee43161");
    check_base_class_offset(lv, (dd3161*), 0, "ee43161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43161.e");
    test_class_info(&lv, &cd_ee43161);
    dp->~ee43161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43161(Test_ee43161, "ee43161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43161C1Ev();
extern void _ZN7ee43161D1Ev();
Name_Map name_map_ee43161[] = {
  NSPAIR(_ZN7ee43161C1Ev),
  NSPAIR(_ZN7ee43161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee43161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43161[];
extern void _ZN6dd31613fooEv();
extern void _ZN7ee431613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee431613barEv,_ZTv0_n16_N7ee431613barEv)();
extern void ABISELECT(_ZThn32_N7ee431613barEv,_ZThn20_N7ee431613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
  (VTBL_ENTRY)&_ZN7ee431613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee431613barEv,_ZTv0_n16_N7ee431613barEv),
};
extern VTBL_ENTRY _ZTV7ee43161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee43161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee43161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee43161[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee43161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee43161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee43161[] = {
  {&(_ZTV7ee43161[4]),  4,15},
  {&(_tg__ZTV6dd3161__7ee43161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee43161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee43161[4]),  4,6},
  {&(_ZTV7ee43161[9]),  9,15},
  {&(_ZTV7ee43161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee43161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee43161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43161[];
extern  VTBL_ENTRY _ZTV7ee43161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43161[];
static VTBL_ENTRY alt_thunk_names537[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee431613barEv,_ZTv0_n16_N7ee431613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee431613barEv,_ZThn20_N7ee431613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43161 = {  "ee43161", // class name
  bases_ee43161, 4,
  &(vtc_ee43161[0]), // expected_vtbl_contents
  &(vtt_ee43161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names537,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53161  : virtual dd3161 {
  int e;
  virtual void  bar(); // _ZN7ee531613barEv
  ~ee53161(); // tgen
  ee53161(); // tgen
};
//SIG(1 ee53161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee53161 ::bar(){vfunc_called(this, "_ZN7ee531613barEv");}
ee53161 ::~ee53161(){ note_dtor("ee53161", this);} // tgen
ee53161 ::ee53161(){ note_ctor("ee53161", this);} // tgen

static void Test_ee53161()
{
  extern Class_Descriptor cd_ee53161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53161, buf);
    ee53161 *dp, &lv = *(dp=new (buf) ee53161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee53161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee53161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(32,16), "ee53161");
    check_base_class_offset(lv, (dd3161*), ABISELECT(16,8), "ee53161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53161.e");
    test_class_info(&lv, &cd_ee53161);
    dp->~ee53161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53161(Test_ee53161, "ee53161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53161C1Ev();
extern void _ZN7ee53161D1Ev();
Name_Map name_map_ee53161[] = {
  NSPAIR(_ZN7ee53161C1Ev),
  NSPAIR(_ZN7ee53161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee53161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53161[];
extern void _ZN7ee531613barEv();
extern void _ZN6dd31613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee531613barEv,_ZTv0_n16_N7ee531613barEv)();
extern void ABISELECT(_ZThn48_N7ee531613barEv,_ZThn24_N7ee531613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53161[0]),
  (VTBL_ENTRY)&_ZN7ee531613barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53161[0]),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee531613barEv,_ZTv0_n16_N7ee531613barEv),
};
extern VTBL_ENTRY _ZTV7ee53161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee53161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee53161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee53161[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee53161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee53161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee53161[] = {
  {&(_ZTV7ee53161[5]),  5,21},
  {&(_ZTV7ee53161[11]),  11,21},
  {&(_ZTV7ee53161[15]),  15,21},
  {&(_ZTV7ee53161[19]),  19,21},
  {&(_tg__ZTV6dd3161__7ee53161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee53161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee53161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee53161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee53161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53161[];
extern  VTBL_ENTRY _ZTV7ee53161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53161[];
static VTBL_ENTRY alt_thunk_names538[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee531613barEv,_ZTv0_n16_N7ee531613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee531613barEv,_ZThn24_N7ee531613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53161 = {  "ee53161", // class name
  bases_ee53161, 4,
  &(vtc_ee53161[0]), // expected_vtbl_contents
  &(vtt_ee53161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53161),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names538,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63161  : dd3161 {
  int e;
  virtual void  foo(); // _ZN7ee631613fooEv
  virtual void  bar(); // _ZN7ee631613barEv
  ~ee63161(); // tgen
  ee63161(); // tgen
};
//SIG(1 ee63161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee63161 ::foo(){vfunc_called(this, "_ZN7ee631613fooEv");}
void  ee63161 ::bar(){vfunc_called(this, "_ZN7ee631613barEv");}
ee63161 ::~ee63161(){ note_dtor("ee63161", this);} // tgen
ee63161 ::ee63161(){ note_ctor("ee63161", this);} // tgen

static void Test_ee63161()
{
  extern Class_Descriptor cd_ee63161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63161, buf);
    ee63161 *dp, &lv = *(dp=new (buf) ee63161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee63161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee63161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(16,12), "ee63161");
    check_base_class_offset(lv, (dd3161*), 0, "ee63161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63161.e");
    test_class_info(&lv, &cd_ee63161);
    dp->~ee63161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63161(Test_ee63161, "ee63161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63161C1Ev();
extern void _ZN7ee63161D1Ev();
Name_Map name_map_ee63161[] = {
  NSPAIR(_ZN7ee63161C1Ev),
  NSPAIR(_ZN7ee63161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee63161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63161[];
extern void _ZN7ee631613fooEv();
extern void _ZN7ee631613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee631613fooEv,_ZTv0_n12_N7ee631613fooEv)();
extern void ABISELECT(_ZThn32_N7ee631613fooEv,_ZThn20_N7ee631613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee631613barEv,_ZTv0_n16_N7ee631613barEv)();
extern void ABISELECT(_ZThn32_N7ee631613barEv,_ZThn20_N7ee631613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63161[0]),
  (VTBL_ENTRY)&_ZN7ee631613fooEv,
  (VTBL_ENTRY)&_ZN7ee631613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee631613fooEv,_ZTv0_n12_N7ee631613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee631613barEv,_ZTv0_n16_N7ee631613barEv),
};
extern VTBL_ENTRY _ZTV7ee63161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee63161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee63161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee63161[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee63161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee63161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee63161[] = {
  {&(_ZTV7ee63161[4]),  4,15},
  {&(_tg__ZTV6dd3161__7ee63161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee63161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee63161[4]),  4,6},
  {&(_ZTV7ee63161[9]),  9,15},
  {&(_ZTV7ee63161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee63161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee63161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63161[];
extern  VTBL_ENTRY _ZTV7ee63161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63161[];
static VTBL_ENTRY alt_thunk_names539[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn20_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee631613barEv,_ZTv0_n16_N7ee631613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee631613barEv,_ZThn20_N7ee631613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee631613fooEv,_ZTv0_n12_N7ee631613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee631613fooEv,_ZThn20_N7ee631613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63161 = {  "ee63161", // class name
  bases_ee63161, 4,
  &(vtc_ee63161[0]), // expected_vtbl_contents
  &(vtt_ee63161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names539,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73161  : virtual dd3161 {
  int e;
  virtual void  foo(); // _ZN7ee731613fooEv
  virtual void  bar(); // _ZN7ee731613barEv
  ~ee73161(); // tgen
  ee73161(); // tgen
};
//SIG(1 ee73161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee73161 ::foo(){vfunc_called(this, "_ZN7ee731613fooEv");}
void  ee73161 ::bar(){vfunc_called(this, "_ZN7ee731613barEv");}
ee73161 ::~ee73161(){ note_dtor("ee73161", this);} // tgen
ee73161 ::ee73161(){ note_ctor("ee73161", this);} // tgen

static void Test_ee73161()
{
  extern Class_Descriptor cd_ee73161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73161, buf);
    ee73161 *dp, &lv = *(dp=new (buf) ee73161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee73161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee73161");
    check_base_class_offset(lv, (cc161*)(dd3161*), ABISELECT(32,16), "ee73161");
    check_base_class_offset(lv, (dd3161*), ABISELECT(16,8), "ee73161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73161.e");
    test_class_info(&lv, &cd_ee73161);
    dp->~ee73161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73161(Test_ee73161, "ee73161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73161C1Ev();
extern void _ZN7ee73161D1Ev();
Name_Map name_map_ee73161[] = {
  NSPAIR(_ZN7ee73161C1Ev),
  NSPAIR(_ZN7ee73161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd3161;
extern VTBL_ENTRY _ZTI6dd3161[];
extern  VTBL_ENTRY _ZTV6dd3161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3161[];
static Base_Class bases_ee73161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3161,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73161[];
extern void _ZN7ee731613fooEv();
extern void _ZN7ee731613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee731613fooEv,_ZTv0_n20_N7ee731613fooEv)();
extern void ABISELECT(_ZThn16_N7ee731613fooEv,_ZThn8_N7ee731613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee731613fooEv,_ZTv0_n12_N7ee731613fooEv)();
extern void ABISELECT(_ZThn48_N7ee731613fooEv,_ZThn24_N7ee731613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee731613barEv,_ZTv0_n16_N7ee731613barEv)();
extern void ABISELECT(_ZThn48_N7ee731613barEv,_ZThn24_N7ee731613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73161[0]),
  (VTBL_ENTRY)&_ZN7ee731613fooEv,
  (VTBL_ENTRY)&_ZN7ee731613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee731613fooEv,_ZTv0_n20_N7ee731613fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73161[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee731613fooEv,_ZTv0_n12_N7ee731613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee731613barEv,_ZTv0_n16_N7ee731613barEv),
};
extern VTBL_ENTRY _ZTV7ee73161[];
extern void _ZN6dd31613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3161__7ee73161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&_ZN6dd31613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd3161__7ee73161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv)();
extern void ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3161__7ee73161[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee73161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee73161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee73161[] = {
  {&(_ZTV7ee73161[5]),  5,22},
  {&(_ZTV7ee73161[12]),  12,22},
  {&(_ZTV7ee73161[16]),  16,22},
  {&(_ZTV7ee73161[20]),  20,22},
  {&(_tg__ZTV6dd3161__7ee73161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd3161__7ee73161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd3161__7ee73161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee73161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee73161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73161[];
extern  VTBL_ENTRY _ZTV7ee73161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73161[];
static VTBL_ENTRY alt_thunk_names540[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31613fooEv,_ZTv0_n12_N6dd31613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31613fooEv,_ZThn16_N6dd31613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee731613barEv,_ZTv0_n16_N7ee731613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee731613barEv,_ZThn24_N7ee731613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee731613fooEv,_ZTv0_n12_N7ee731613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee731613fooEv,_ZThn24_N7ee731613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee731613fooEv,_ZTv0_n20_N7ee731613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee731613fooEv,_ZThn8_N7ee731613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73161 = {  "ee73161", // class name
  bases_ee73161, 4,
  &(vtc_ee73161[0]), // expected_vtbl_contents
  &(vtt_ee73161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73161),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names540,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4161  : cc161 {
  int d;
  virtual void  bar(); // _ZN6dd41613barEv
  ~dd4161(); // tgen
  dd4161(); // tgen
};
//SIG(-1 dd4161) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd4161 ::bar(){vfunc_called(this, "_ZN6dd41613barEv");}
dd4161 ::~dd4161(){ note_dtor("dd4161", this);} // tgen
dd4161 ::dd4161(){ note_ctor("dd4161", this);} // tgen

static void Test_dd4161()
{
  extern Class_Descriptor cd_dd4161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4161, buf);
    dd4161 *dp, &lv = *(dp=new (buf) dd4161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd4161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(16,12), "dd4161");
    check_base_class_offset(lv, (cc161*), 0, "dd4161");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4161.d");
    test_class_info(&lv, &cd_dd4161);
    dp->~dd4161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4161(Test_dd4161, "dd4161", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4161C1Ev();
extern void _ZN6dd4161D1Ev();
Name_Map name_map_dd4161[] = {
  NSPAIR(_ZN6dd4161C1Ev),
  NSPAIR(_ZN6dd4161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd4161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4161[];
extern void _ZN6dd41613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
extern VTBL_ENTRY _ZTV6dd4161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd4161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd4161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd4161[] = {
  {&(_ZTV6dd4161[3]),  3,10},
  {&(_tg__ZTV5cc161__6dd4161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd4161[4]),  4,6},
  {&(_ZTV6dd4161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static VTBL_ENTRY alt_thunk_names541[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4161 = {  "dd4161", // class name
  bases_dd4161, 3,
  &(vtc_dd4161[0]), // expected_vtbl_contents
  &(vtt_dd4161[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4161),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names541,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04161  : dd4161 {
  int e;
  ~ee04161(); // tgen
  ee04161(); // tgen
};
//SIG(1 ee04161) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee04161 ::~ee04161(){ note_dtor("ee04161", this);} // tgen
ee04161 ::ee04161(){ note_ctor("ee04161", this);} // tgen

static void Test_ee04161()
{
  extern Class_Descriptor cd_ee04161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04161, buf);
    ee04161 *dp, &lv = *(dp=new (buf) ee04161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee04161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(24,16), "ee04161");
    check_base_class_offset(lv, (cc161*)(dd4161*), 0, "ee04161");
    check_base_class_offset(lv, (dd4161*), 0, "ee04161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04161.e");
    test_class_info(&lv, &cd_ee04161);
    dp->~ee04161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04161(Test_ee04161, "ee04161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04161C1Ev();
extern void _ZN7ee04161D1Ev();
Name_Map name_map_ee04161[] = {
  NSPAIR(_ZN7ee04161C1Ev),
  NSPAIR(_ZN7ee04161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee04161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04161[];
extern void _ZN6dd41613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
extern VTBL_ENTRY _ZTV7ee04161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee04161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee04161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee04161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee04161[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee04161[] = {
  {&(_ZTV7ee04161[3]),  3,10},
  {&(_tg__ZTV6dd4161__7ee04161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee04161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee04161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee04161[4]),  4,6},
  {&(_ZTV7ee04161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee04161[];
extern  VTBL_ENTRY _ZTV7ee04161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04161[];
static VTBL_ENTRY alt_thunk_names542[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04161 = {  "ee04161", // class name
  bases_ee04161, 4,
  &(vtc_ee04161[0]), // expected_vtbl_contents
  &(vtt_ee04161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names542,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14161  : virtual dd4161 {
  int e;
  ~ee14161(); // tgen
  ee14161(); // tgen
};
//SIG(1 ee14161) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee14161 ::~ee14161(){ note_dtor("ee14161", this);} // tgen
ee14161 ::ee14161(){ note_ctor("ee14161", this);} // tgen

static void Test_ee14161()
{
  extern Class_Descriptor cd_ee14161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14161, buf);
    ee14161 *dp, &lv = *(dp=new (buf) ee14161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee14161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(32,20), "ee14161");
    check_base_class_offset(lv, (cc161*)(dd4161*), ABISELECT(16,8), "ee14161");
    check_base_class_offset(lv, (dd4161*), ABISELECT(16,8), "ee14161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14161.e");
    test_class_info(&lv, &cd_ee14161);
    dp->~ee14161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14161(Test_ee14161, "ee14161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14161C1Ev();
extern void _ZN7ee14161D1Ev();
Name_Map name_map_ee14161[] = {
  NSPAIR(_ZN7ee14161C1Ev),
  NSPAIR(_ZN7ee14161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee14161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14161[];
extern void _ZN6dd41613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14161[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
extern VTBL_ENTRY _ZTV7ee14161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee14161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee14161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee14161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee14161[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee14161[] = {
  {&(_ZTV7ee14161[4]),  4,15},
  {&(_ZTV7ee14161[8]),  8,15},
  {&(_ZTV7ee14161[13]),  13,15},
  {&(_tg__ZTV6dd4161__7ee14161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee14161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee14161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee14161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14161[];
extern  VTBL_ENTRY _ZTV7ee14161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14161[];
static VTBL_ENTRY alt_thunk_names543[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14161 = {  "ee14161", // class name
  bases_ee14161, 4,
  &(vtc_ee14161[0]), // expected_vtbl_contents
  &(vtt_ee14161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14161),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names543,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24161  : dd4161 {
  int e;
  virtual void  foo(); // _ZN7ee241613fooEv
  ~ee24161(); // tgen
  ee24161(); // tgen
};
//SIG(1 ee24161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee24161 ::foo(){vfunc_called(this, "_ZN7ee241613fooEv");}
ee24161 ::~ee24161(){ note_dtor("ee24161", this);} // tgen
ee24161 ::ee24161(){ note_ctor("ee24161", this);} // tgen

static void Test_ee24161()
{
  extern Class_Descriptor cd_ee24161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24161, buf);
    ee24161 *dp, &lv = *(dp=new (buf) ee24161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee24161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(24,16), "ee24161");
    check_base_class_offset(lv, (cc161*)(dd4161*), 0, "ee24161");
    check_base_class_offset(lv, (dd4161*), 0, "ee24161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24161.e");
    test_class_info(&lv, &cd_ee24161);
    dp->~ee24161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24161(Test_ee24161, "ee24161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24161C1Ev();
extern void _ZN7ee24161D1Ev();
Name_Map name_map_ee24161[] = {
  NSPAIR(_ZN7ee24161C1Ev),
  NSPAIR(_ZN7ee24161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee24161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24161[];
extern void _ZN6dd41613barEv();
extern void _ZN7ee241613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee241613fooEv,_ZTv0_n12_N7ee241613fooEv)();
extern void ABISELECT(_ZThn24_N7ee241613fooEv,_ZThn16_N7ee241613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
  (VTBL_ENTRY)&_ZN7ee241613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee241613fooEv,_ZTv0_n12_N7ee241613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
extern VTBL_ENTRY _ZTV7ee24161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee24161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee24161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee24161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee24161[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee24161[] = {
  {&(_ZTV7ee24161[3]),  3,11},
  {&(_tg__ZTV6dd4161__7ee24161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee24161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee24161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee24161[4]),  4,6},
  {&(_ZTV7ee24161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24161[];
extern  VTBL_ENTRY _ZTV7ee24161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24161[];
static VTBL_ENTRY alt_thunk_names544[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee241613fooEv,_ZTv0_n12_N7ee241613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee241613fooEv,_ZThn16_N7ee241613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24161 = {  "ee24161", // class name
  bases_ee24161, 4,
  &(vtc_ee24161[0]), // expected_vtbl_contents
  &(vtt_ee24161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24161),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  ee34161  : virtual dd4161 {
  int e;
  virtual void  foo(); // _ZN7ee341613fooEv
  ~ee34161(); // tgen
  ee34161(); // tgen
};
//SIG(1 ee34161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee34161 ::foo(){vfunc_called(this, "_ZN7ee341613fooEv");}
ee34161 ::~ee34161(){ note_dtor("ee34161", this);} // tgen
ee34161 ::ee34161(){ note_ctor("ee34161", this);} // tgen

static void Test_ee34161()
{
  extern Class_Descriptor cd_ee34161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34161, buf);
    ee34161 *dp, &lv = *(dp=new (buf) ee34161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee34161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(32,20), "ee34161");
    check_base_class_offset(lv, (cc161*)(dd4161*), ABISELECT(16,8), "ee34161");
    check_base_class_offset(lv, (dd4161*), ABISELECT(16,8), "ee34161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34161.e");
    test_class_info(&lv, &cd_ee34161);
    dp->~ee34161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34161(Test_ee34161, "ee34161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34161C1Ev();
extern void _ZN7ee34161D1Ev();
Name_Map name_map_ee34161[] = {
  NSPAIR(_ZN7ee34161C1Ev),
  NSPAIR(_ZN7ee34161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee34161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34161[];
extern void _ZN7ee341613fooEv();
extern void _ZN6dd41613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee341613fooEv,_ZTv0_n12_N7ee341613fooEv)();
extern void ABISELECT(_ZThn32_N7ee341613fooEv,_ZThn20_N7ee341613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34161[0]),
  (VTBL_ENTRY)&_ZN7ee341613fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee341613fooEv,_ZTv0_n12_N7ee341613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
extern VTBL_ENTRY _ZTV7ee34161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee34161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee34161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee34161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee34161[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee34161[] = {
  {&(_ZTV7ee34161[4]),  4,16},
  {&(_ZTV7ee34161[9]),  9,16},
  {&(_ZTV7ee34161[14]),  14,16},
  {&(_tg__ZTV6dd4161__7ee34161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee34161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee34161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee34161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34161[];
extern  VTBL_ENTRY _ZTV7ee34161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34161[];
static VTBL_ENTRY alt_thunk_names545[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee341613fooEv,_ZTv0_n12_N7ee341613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee341613fooEv,_ZThn20_N7ee341613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34161 = {  "ee34161", // class name
  bases_ee34161, 4,
  &(vtc_ee34161[0]), // expected_vtbl_contents
  &(vtt_ee34161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34161),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34161),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  ee44161  : dd4161 {
  int e;
  virtual void  bar(); // _ZN7ee441613barEv
  ~ee44161(); // tgen
  ee44161(); // tgen
};
//SIG(1 ee44161) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee44161 ::bar(){vfunc_called(this, "_ZN7ee441613barEv");}
ee44161 ::~ee44161(){ note_dtor("ee44161", this);} // tgen
ee44161 ::ee44161(){ note_ctor("ee44161", this);} // tgen

static void Test_ee44161()
{
  extern Class_Descriptor cd_ee44161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44161, buf);
    ee44161 *dp, &lv = *(dp=new (buf) ee44161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee44161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(24,16), "ee44161");
    check_base_class_offset(lv, (cc161*)(dd4161*), 0, "ee44161");
    check_base_class_offset(lv, (dd4161*), 0, "ee44161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44161.e");
    test_class_info(&lv, &cd_ee44161);
    dp->~ee44161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44161(Test_ee44161, "ee44161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44161C1Ev();
extern void _ZN7ee44161D1Ev();
Name_Map name_map_ee44161[] = {
  NSPAIR(_ZN7ee44161C1Ev),
  NSPAIR(_ZN7ee44161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee44161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44161[];
extern void _ZN7ee441613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee441613barEv,_ZTv0_n16_N7ee441613barEv)();
extern void ABISELECT(_ZThn24_N7ee441613barEv,_ZThn16_N7ee441613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44161[0]),
  (VTBL_ENTRY)&_ZN7ee441613barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee441613barEv,_ZTv0_n16_N7ee441613barEv),
};
extern VTBL_ENTRY _ZTV7ee44161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee44161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee44161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee44161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee44161[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee44161[] = {
  {&(_ZTV7ee44161[3]),  3,10},
  {&(_tg__ZTV6dd4161__7ee44161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee44161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee44161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee44161[4]),  4,6},
  {&(_ZTV7ee44161[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee44161[];
extern  VTBL_ENTRY _ZTV7ee44161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44161[];
static VTBL_ENTRY alt_thunk_names546[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee441613barEv,_ZTv0_n16_N7ee441613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee441613barEv,_ZThn16_N7ee441613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44161 = {  "ee44161", // class name
  bases_ee44161, 4,
  &(vtc_ee44161[0]), // expected_vtbl_contents
  &(vtt_ee44161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44161),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44161),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  ee54161  : virtual dd4161 {
  int e;
  virtual void  bar(); // _ZN7ee541613barEv
  ~ee54161(); // tgen
  ee54161(); // tgen
};
//SIG(1 ee54161) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee54161 ::bar(){vfunc_called(this, "_ZN7ee541613barEv");}
ee54161 ::~ee54161(){ note_dtor("ee54161", this);} // tgen
ee54161 ::ee54161(){ note_ctor("ee54161", this);} // tgen

static void Test_ee54161()
{
  extern Class_Descriptor cd_ee54161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54161, buf);
    ee54161 *dp, &lv = *(dp=new (buf) ee54161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee54161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(32,20), "ee54161");
    check_base_class_offset(lv, (cc161*)(dd4161*), ABISELECT(16,8), "ee54161");
    check_base_class_offset(lv, (dd4161*), ABISELECT(16,8), "ee54161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54161.e");
    test_class_info(&lv, &cd_ee54161);
    dp->~ee54161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54161(Test_ee54161, "ee54161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54161C1Ev();
extern void _ZN7ee54161D1Ev();
Name_Map name_map_ee54161[] = {
  NSPAIR(_ZN7ee54161C1Ev),
  NSPAIR(_ZN7ee54161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee54161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54161[];
extern void _ZN7ee541613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee541613barEv,_ZTv0_n16_N7ee541613barEv)();
extern void ABISELECT(_ZThn16_N7ee541613barEv,_ZThn8_N7ee541613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee541613barEv,_ZTv0_n16_N7ee541613barEv)();
extern void ABISELECT(_ZThn32_N7ee541613barEv,_ZThn20_N7ee541613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54161[0]),
  (VTBL_ENTRY)&_ZN7ee541613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee541613barEv,_ZTv0_n16_N7ee541613barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee541613barEv,_ZTv0_n16_N7ee541613barEv),
};
extern VTBL_ENTRY _ZTV7ee54161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee54161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee54161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee54161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee54161[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee54161[] = {
  {&(_ZTV7ee54161[4]),  4,16},
  {&(_ZTV7ee54161[9]),  9,16},
  {&(_ZTV7ee54161[14]),  14,16},
  {&(_tg__ZTV6dd4161__7ee54161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee54161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee54161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee54161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54161[];
extern  VTBL_ENTRY _ZTV7ee54161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54161[];
static VTBL_ENTRY alt_thunk_names547[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee541613barEv,_ZTv0_n16_N7ee541613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee541613barEv,_ZThn20_N7ee541613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee541613barEv,_ZThn8_N7ee541613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54161 = {  "ee54161", // class name
  bases_ee54161, 4,
  &(vtc_ee54161[0]), // expected_vtbl_contents
  &(vtt_ee54161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54161),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54161),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  ee64161  : dd4161 {
  int e;
  virtual void  foo(); // _ZN7ee641613fooEv
  virtual void  bar(); // _ZN7ee641613barEv
  ~ee64161(); // tgen
  ee64161(); // tgen
};
//SIG(1 ee64161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee64161 ::foo(){vfunc_called(this, "_ZN7ee641613fooEv");}
void  ee64161 ::bar(){vfunc_called(this, "_ZN7ee641613barEv");}
ee64161 ::~ee64161(){ note_dtor("ee64161", this);} // tgen
ee64161 ::ee64161(){ note_ctor("ee64161", this);} // tgen

static void Test_ee64161()
{
  extern Class_Descriptor cd_ee64161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64161, buf);
    ee64161 *dp, &lv = *(dp=new (buf) ee64161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee64161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(24,16), "ee64161");
    check_base_class_offset(lv, (cc161*)(dd4161*), 0, "ee64161");
    check_base_class_offset(lv, (dd4161*), 0, "ee64161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64161.e");
    test_class_info(&lv, &cd_ee64161);
    dp->~ee64161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64161(Test_ee64161, "ee64161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64161C1Ev();
extern void _ZN7ee64161D1Ev();
Name_Map name_map_ee64161[] = {
  NSPAIR(_ZN7ee64161C1Ev),
  NSPAIR(_ZN7ee64161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee64161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64161[];
extern void _ZN7ee641613barEv();
extern void _ZN7ee641613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee641613fooEv,_ZTv0_n12_N7ee641613fooEv)();
extern void ABISELECT(_ZThn24_N7ee641613fooEv,_ZThn16_N7ee641613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee641613barEv,_ZTv0_n16_N7ee641613barEv)();
extern void ABISELECT(_ZThn24_N7ee641613barEv,_ZThn16_N7ee641613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64161[0]),
  (VTBL_ENTRY)&_ZN7ee641613barEv,
  (VTBL_ENTRY)&_ZN7ee641613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee641613fooEv,_ZTv0_n12_N7ee641613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee641613barEv,_ZTv0_n16_N7ee641613barEv),
};
extern VTBL_ENTRY _ZTV7ee64161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee64161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee64161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee64161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee64161[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee64161[] = {
  {&(_ZTV7ee64161[3]),  3,11},
  {&(_tg__ZTV6dd4161__7ee64161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee64161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee64161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee64161[4]),  4,6},
  {&(_ZTV7ee64161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64161[];
extern  VTBL_ENTRY _ZTV7ee64161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64161[];
static VTBL_ENTRY alt_thunk_names548[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41613barEv,_ZThn16_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee641613barEv,_ZTv0_n16_N7ee641613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee641613barEv,_ZThn16_N7ee641613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee641613fooEv,_ZTv0_n12_N7ee641613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee641613fooEv,_ZThn16_N7ee641613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64161 = {  "ee64161", // class name
  bases_ee64161, 4,
  &(vtc_ee64161[0]), // expected_vtbl_contents
  &(vtt_ee64161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names548,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74161  : virtual dd4161 {
  int e;
  virtual void  foo(); // _ZN7ee741613fooEv
  virtual void  bar(); // _ZN7ee741613barEv
  ~ee74161(); // tgen
  ee74161(); // tgen
};
//SIG(1 ee74161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee74161 ::foo(){vfunc_called(this, "_ZN7ee741613fooEv");}
void  ee74161 ::bar(){vfunc_called(this, "_ZN7ee741613barEv");}
ee74161 ::~ee74161(){ note_dtor("ee74161", this);} // tgen
ee74161 ::ee74161(){ note_ctor("ee74161", this);} // tgen

static void Test_ee74161()
{
  extern Class_Descriptor cd_ee74161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74161, buf);
    ee74161 *dp, &lv = *(dp=new (buf) ee74161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee74161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd4161*), ABISELECT(32,20), "ee74161");
    check_base_class_offset(lv, (cc161*)(dd4161*), ABISELECT(16,8), "ee74161");
    check_base_class_offset(lv, (dd4161*), ABISELECT(16,8), "ee74161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74161.e");
    test_class_info(&lv, &cd_ee74161);
    dp->~ee74161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74161(Test_ee74161, "ee74161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74161C1Ev();
extern void _ZN7ee74161D1Ev();
Name_Map name_map_ee74161[] = {
  NSPAIR(_ZN7ee74161C1Ev),
  NSPAIR(_ZN7ee74161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd4161;
extern VTBL_ENTRY _ZTI6dd4161[];
extern  VTBL_ENTRY _ZTV6dd4161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4161[];
static Base_Class bases_ee74161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4161,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74161[];
extern void _ZN7ee741613fooEv();
extern void _ZN7ee741613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee741613barEv,_ZTv0_n16_N7ee741613barEv)();
extern void ABISELECT(_ZThn16_N7ee741613barEv,_ZThn8_N7ee741613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee741613fooEv,_ZTv0_n12_N7ee741613fooEv)();
extern void ABISELECT(_ZThn32_N7ee741613fooEv,_ZThn20_N7ee741613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee741613barEv,_ZTv0_n16_N7ee741613barEv)();
extern void ABISELECT(_ZThn32_N7ee741613barEv,_ZThn20_N7ee741613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74161[0]),
  (VTBL_ENTRY)&_ZN7ee741613fooEv,
  (VTBL_ENTRY)&_ZN7ee741613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee741613barEv,_ZTv0_n16_N7ee741613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee741613fooEv,_ZTv0_n12_N7ee741613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee741613barEv,_ZTv0_n16_N7ee741613barEv),
};
extern VTBL_ENTRY _ZTV7ee74161[];
extern void _ZN6dd41613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4161__7ee74161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN6dd41613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd4161__7ee74161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd4161__7ee74161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv)();
extern void ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4161__7ee74161[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv),
};
static  VTT_ENTRY vtt_ee74161[] = {
  {&(_ZTV7ee74161[4]),  4,17},
  {&(_ZTV7ee74161[10]),  10,17},
  {&(_ZTV7ee74161[15]),  15,17},
  {&(_tg__ZTV6dd4161__7ee74161[3]),  3,4},
  {&(_tg__ZTV5cc1616dd4161__7ee74161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd4161__7ee74161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4161__7ee74161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74161[];
extern  VTBL_ENTRY _ZTV7ee74161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74161[];
static VTBL_ENTRY alt_thunk_names549[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41613barEv,_ZTv0_n16_N6dd41613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41613barEv,_ZThn12_N6dd41613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee741613fooEv,_ZTv0_n12_N7ee741613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee741613fooEv,_ZThn20_N7ee741613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee741613barEv,_ZTv0_n16_N7ee741613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee741613barEv,_ZThn20_N7ee741613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee741613barEv,_ZThn8_N7ee741613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74161 = {  "ee74161", // class name
  bases_ee74161, 4,
  &(vtc_ee74161[0]), // expected_vtbl_contents
  &(vtt_ee74161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74161),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74161),7, //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  dd5161  : virtual cc161 {
  int d;
  virtual void  bar(); // _ZN6dd51613barEv
  ~dd5161(); // tgen
  dd5161(); // tgen
};
//SIG(-1 dd5161) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd5161 ::bar(){vfunc_called(this, "_ZN6dd51613barEv");}
dd5161 ::~dd5161(){ note_dtor("dd5161", this);} // tgen
dd5161 ::dd5161(){ note_ctor("dd5161", this);} // tgen

static void Test_dd5161()
{
  extern Class_Descriptor cd_dd5161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5161, buf);
    dd5161 *dp, &lv = *(dp=new (buf) dd5161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd5161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,16), "dd5161");
    check_base_class_offset(lv, (cc161*), ABISELECT(16,8), "dd5161");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5161.d");
    test_class_info(&lv, &cd_dd5161);
    dp->~dd5161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5161(Test_dd5161, "dd5161", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5161C1Ev();
extern void _ZN6dd5161D1Ev();
Name_Map name_map_dd5161[] = {
  NSPAIR(_ZN6dd5161C1Ev),
  NSPAIR(_ZN6dd5161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd5161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd5161[];
extern void _ZN6dd51613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
extern VTBL_ENTRY _ZTV6dd5161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd5161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd5161[] = {
  {&(_ZTV6dd5161[4]),  4,14},
  {&(_ZTV6dd5161[8]),  8,14},
  {&(_ZTV6dd5161[12]),  12,14},
  {&(_tg__ZTV5cc161__6dd5161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd5161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static VTBL_ENTRY alt_thunk_names550[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5161 = {  "dd5161", // class name
  bases_dd5161, 3,
  &(vtc_dd5161[0]), // expected_vtbl_contents
  &(vtt_dd5161[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5161),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names550,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05161  : dd5161 {
  int e;
  ~ee05161(); // tgen
  ee05161(); // tgen
};
//SIG(1 ee05161) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee05161 ::~ee05161(){ note_dtor("ee05161", this);} // tgen
ee05161 ::ee05161(){ note_ctor("ee05161", this);} // tgen

static void Test_ee05161()
{
  extern Class_Descriptor cd_ee05161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05161, buf);
    ee05161 *dp, &lv = *(dp=new (buf) ee05161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee05161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee05161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(16,12), "ee05161");
    check_base_class_offset(lv, (dd5161*), 0, "ee05161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05161.e");
    test_class_info(&lv, &cd_ee05161);
    dp->~ee05161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05161(Test_ee05161, "ee05161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05161C1Ev();
extern void _ZN7ee05161D1Ev();
Name_Map name_map_ee05161[] = {
  NSPAIR(_ZN7ee05161C1Ev),
  NSPAIR(_ZN7ee05161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee05161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05161[];
extern void _ZN6dd51613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05161[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
extern VTBL_ENTRY _ZTV7ee05161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee05161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee05161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee05161[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee05161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee05161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee05161[] = {
  {&(_ZTV7ee05161[4]),  4,14},
  {&(_tg__ZTV6dd5161__7ee05161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee05161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee05161[4]),  4,6},
  {&(_ZTV7ee05161[8]),  8,14},
  {&(_ZTV7ee05161[12]),  12,14},
  {&(_tg__ZTV5cc161__7ee05161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee05161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05161[];
extern  VTBL_ENTRY _ZTV7ee05161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05161[];
static VTBL_ENTRY alt_thunk_names551[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05161 = {  "ee05161", // class name
  bases_ee05161, 4,
  &(vtc_ee05161[0]), // expected_vtbl_contents
  &(vtt_ee05161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05161),8, //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  ee15161  : virtual dd5161 {
  int e;
  ~ee15161(); // tgen
  ee15161(); // tgen
};
//SIG(1 ee15161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee15161 ::~ee15161(){ note_dtor("ee15161", this);} // tgen
ee15161 ::ee15161(){ note_ctor("ee15161", this);} // tgen

static void Test_ee15161()
{
  extern Class_Descriptor cd_ee15161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15161, buf);
    ee15161 *dp, &lv = *(dp=new (buf) ee15161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee15161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee15161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(32,16), "ee15161");
    check_base_class_offset(lv, (dd5161*), ABISELECT(16,8), "ee15161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15161.e");
    test_class_info(&lv, &cd_ee15161);
    dp->~ee15161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15161(Test_ee15161, "ee15161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15161C1Ev();
extern void _ZN7ee15161D1Ev();
Name_Map name_map_ee15161[] = {
  NSPAIR(_ZN7ee15161C1Ev),
  NSPAIR(_ZN7ee15161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee15161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15161[];
extern void _ZN6dd51613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15161[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15161[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
extern VTBL_ENTRY _ZTV7ee15161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee15161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee15161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee15161[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee15161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee15161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee15161[] = {
  {&(_ZTV7ee15161[5]),  5,20},
  {&(_ZTV7ee15161[10]),  10,20},
  {&(_ZTV7ee15161[14]),  14,20},
  {&(_ZTV7ee15161[18]),  18,20},
  {&(_tg__ZTV6dd5161__7ee15161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee15161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee15161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee15161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee15161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15161[];
extern  VTBL_ENTRY _ZTV7ee15161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15161[];
static VTBL_ENTRY alt_thunk_names552[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15161 = {  "ee15161", // class name
  bases_ee15161, 4,
  &(vtc_ee15161[0]), // expected_vtbl_contents
  &(vtt_ee15161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15161),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15161),9, //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  ee25161  : dd5161 {
  int e;
  virtual void  foo(); // _ZN7ee251613fooEv
  ~ee25161(); // tgen
  ee25161(); // tgen
};
//SIG(1 ee25161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee25161 ::foo(){vfunc_called(this, "_ZN7ee251613fooEv");}
ee25161 ::~ee25161(){ note_dtor("ee25161", this);} // tgen
ee25161 ::ee25161(){ note_ctor("ee25161", this);} // tgen

static void Test_ee25161()
{
  extern Class_Descriptor cd_ee25161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25161, buf);
    ee25161 *dp, &lv = *(dp=new (buf) ee25161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee25161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee25161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(16,12), "ee25161");
    check_base_class_offset(lv, (dd5161*), 0, "ee25161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25161.e");
    test_class_info(&lv, &cd_ee25161);
    dp->~ee25161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25161(Test_ee25161, "ee25161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25161C1Ev();
extern void _ZN7ee25161D1Ev();
Name_Map name_map_ee25161[] = {
  NSPAIR(_ZN7ee25161C1Ev),
  NSPAIR(_ZN7ee25161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee25161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25161[];
extern void _ZN6dd51613barEv();
extern void _ZN7ee251613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee251613fooEv,_ZTv0_n12_N7ee251613fooEv)();
extern void ABISELECT(_ZThn32_N7ee251613fooEv,_ZThn20_N7ee251613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
  (VTBL_ENTRY)&_ZN7ee251613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee251613fooEv,_ZTv0_n12_N7ee251613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
extern VTBL_ENTRY _ZTV7ee25161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee25161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee25161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee25161[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee25161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee25161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee25161[] = {
  {&(_ZTV7ee25161[4]),  4,15},
  {&(_tg__ZTV6dd5161__7ee25161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee25161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee25161[4]),  4,6},
  {&(_ZTV7ee25161[9]),  9,15},
  {&(_ZTV7ee25161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee25161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee25161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25161[];
extern  VTBL_ENTRY _ZTV7ee25161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25161[];
static VTBL_ENTRY alt_thunk_names553[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee251613fooEv,_ZTv0_n12_N7ee251613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee251613fooEv,_ZThn20_N7ee251613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25161 = {  "ee25161", // class name
  bases_ee25161, 4,
  &(vtc_ee25161[0]), // expected_vtbl_contents
  &(vtt_ee25161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names553,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35161  : virtual dd5161 {
  int e;
  virtual void  foo(); // _ZN7ee351613fooEv
  ~ee35161(); // tgen
  ee35161(); // tgen
};
//SIG(1 ee35161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee35161 ::foo(){vfunc_called(this, "_ZN7ee351613fooEv");}
ee35161 ::~ee35161(){ note_dtor("ee35161", this);} // tgen
ee35161 ::ee35161(){ note_ctor("ee35161", this);} // tgen

static void Test_ee35161()
{
  extern Class_Descriptor cd_ee35161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35161, buf);
    ee35161 *dp, &lv = *(dp=new (buf) ee35161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee35161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee35161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(32,16), "ee35161");
    check_base_class_offset(lv, (dd5161*), ABISELECT(16,8), "ee35161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35161.e");
    test_class_info(&lv, &cd_ee35161);
    dp->~ee35161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35161(Test_ee35161, "ee35161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35161C1Ev();
extern void _ZN7ee35161D1Ev();
Name_Map name_map_ee35161[] = {
  NSPAIR(_ZN7ee35161C1Ev),
  NSPAIR(_ZN7ee35161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee35161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35161[];
extern void _ZN7ee351613fooEv();
extern void _ZN6dd51613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee351613fooEv,_ZTv0_n12_N7ee351613fooEv)();
extern void ABISELECT(_ZThn48_N7ee351613fooEv,_ZThn24_N7ee351613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35161[0]),
  (VTBL_ENTRY)&_ZN7ee351613fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35161[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee351613fooEv,_ZTv0_n12_N7ee351613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
extern VTBL_ENTRY _ZTV7ee35161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee35161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee35161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee35161[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee35161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee35161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee35161[] = {
  {&(_ZTV7ee35161[5]),  5,21},
  {&(_ZTV7ee35161[11]),  11,21},
  {&(_ZTV7ee35161[15]),  15,21},
  {&(_ZTV7ee35161[19]),  19,21},
  {&(_tg__ZTV6dd5161__7ee35161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee35161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee35161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee35161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee35161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35161[];
extern  VTBL_ENTRY _ZTV7ee35161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35161[];
static VTBL_ENTRY alt_thunk_names554[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee351613fooEv,_ZTv0_n12_N7ee351613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee351613fooEv,_ZThn24_N7ee351613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35161 = {  "ee35161", // class name
  bases_ee35161, 4,
  &(vtc_ee35161[0]), // expected_vtbl_contents
  &(vtt_ee35161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35161),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names554,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45161  : dd5161 {
  int e;
  virtual void  bar(); // _ZN7ee451613barEv
  ~ee45161(); // tgen
  ee45161(); // tgen
};
//SIG(1 ee45161) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee45161 ::bar(){vfunc_called(this, "_ZN7ee451613barEv");}
ee45161 ::~ee45161(){ note_dtor("ee45161", this);} // tgen
ee45161 ::ee45161(){ note_ctor("ee45161", this);} // tgen

static void Test_ee45161()
{
  extern Class_Descriptor cd_ee45161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45161, buf);
    ee45161 *dp, &lv = *(dp=new (buf) ee45161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee45161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee45161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(16,12), "ee45161");
    check_base_class_offset(lv, (dd5161*), 0, "ee45161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45161.e");
    test_class_info(&lv, &cd_ee45161);
    dp->~ee45161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45161(Test_ee45161, "ee45161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45161C1Ev();
extern void _ZN7ee45161D1Ev();
Name_Map name_map_ee45161[] = {
  NSPAIR(_ZN7ee45161C1Ev),
  NSPAIR(_ZN7ee45161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee45161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45161[];
extern void _ZN7ee451613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee451613barEv,_ZTv0_n16_N7ee451613barEv)();
extern void ABISELECT(_ZThn32_N7ee451613barEv,_ZThn20_N7ee451613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45161[0]),
  (VTBL_ENTRY)&_ZN7ee451613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45161[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee451613barEv,_ZTv0_n16_N7ee451613barEv),
};
extern VTBL_ENTRY _ZTV7ee45161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee45161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee45161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee45161[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee45161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee45161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee45161[] = {
  {&(_ZTV7ee45161[4]),  4,14},
  {&(_tg__ZTV6dd5161__7ee45161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee45161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee45161[4]),  4,6},
  {&(_ZTV7ee45161[8]),  8,14},
  {&(_ZTV7ee45161[12]),  12,14},
  {&(_tg__ZTV5cc161__7ee45161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee45161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45161[];
extern  VTBL_ENTRY _ZTV7ee45161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45161[];
static VTBL_ENTRY alt_thunk_names555[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee451613barEv,_ZTv0_n16_N7ee451613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee451613barEv,_ZThn20_N7ee451613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45161 = {  "ee45161", // class name
  bases_ee45161, 4,
  &(vtc_ee45161[0]), // expected_vtbl_contents
  &(vtt_ee45161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45161),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names555,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55161  : virtual dd5161 {
  int e;
  virtual void  bar(); // _ZN7ee551613barEv
  ~ee55161(); // tgen
  ee55161(); // tgen
};
//SIG(1 ee55161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee55161 ::bar(){vfunc_called(this, "_ZN7ee551613barEv");}
ee55161 ::~ee55161(){ note_dtor("ee55161", this);} // tgen
ee55161 ::ee55161(){ note_ctor("ee55161", this);} // tgen

static void Test_ee55161()
{
  extern Class_Descriptor cd_ee55161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55161, buf);
    ee55161 *dp, &lv = *(dp=new (buf) ee55161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee55161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee55161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(32,16), "ee55161");
    check_base_class_offset(lv, (dd5161*), ABISELECT(16,8), "ee55161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55161.e");
    test_class_info(&lv, &cd_ee55161);
    dp->~ee55161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55161(Test_ee55161, "ee55161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55161C1Ev();
extern void _ZN7ee55161D1Ev();
Name_Map name_map_ee55161[] = {
  NSPAIR(_ZN7ee55161C1Ev),
  NSPAIR(_ZN7ee55161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee55161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55161[];
extern void _ZN7ee551613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee551613barEv,_ZTv0_n20_N7ee551613barEv)();
extern void ABISELECT(_ZThn16_N7ee551613barEv,_ZThn8_N7ee551613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee551613barEv,_ZTv0_n16_N7ee551613barEv)();
extern void ABISELECT(_ZThn48_N7ee551613barEv,_ZThn24_N7ee551613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55161[0]),
  (VTBL_ENTRY)&_ZN7ee551613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee551613barEv,_ZTv0_n20_N7ee551613barEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55161[0]),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee551613barEv,_ZTv0_n16_N7ee551613barEv),
};
extern VTBL_ENTRY _ZTV7ee55161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee55161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee55161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee55161[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee55161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee55161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee55161[] = {
  {&(_ZTV7ee55161[5]),  5,21},
  {&(_ZTV7ee55161[11]),  11,21},
  {&(_ZTV7ee55161[15]),  15,21},
  {&(_ZTV7ee55161[19]),  19,21},
  {&(_tg__ZTV6dd5161__7ee55161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee55161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee55161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee55161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee55161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55161[];
extern  VTBL_ENTRY _ZTV7ee55161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55161[];
static VTBL_ENTRY alt_thunk_names556[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee551613barEv,_ZTv0_n16_N7ee551613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee551613barEv,_ZThn24_N7ee551613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee551613barEv,_ZTv0_n20_N7ee551613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee551613barEv,_ZThn8_N7ee551613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55161 = {  "ee55161", // class name
  bases_ee55161, 4,
  &(vtc_ee55161[0]), // expected_vtbl_contents
  &(vtt_ee55161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55161),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names556,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65161  : dd5161 {
  int e;
  virtual void  foo(); // _ZN7ee651613fooEv
  virtual void  bar(); // _ZN7ee651613barEv
  ~ee65161(); // tgen
  ee65161(); // tgen
};
//SIG(1 ee65161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee65161 ::foo(){vfunc_called(this, "_ZN7ee651613fooEv");}
void  ee65161 ::bar(){vfunc_called(this, "_ZN7ee651613barEv");}
ee65161 ::~ee65161(){ note_dtor("ee65161", this);} // tgen
ee65161 ::ee65161(){ note_ctor("ee65161", this);} // tgen

static void Test_ee65161()
{
  extern Class_Descriptor cd_ee65161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65161, buf);
    ee65161 *dp, &lv = *(dp=new (buf) ee65161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee65161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee65161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(16,12), "ee65161");
    check_base_class_offset(lv, (dd5161*), 0, "ee65161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65161.e");
    test_class_info(&lv, &cd_ee65161);
    dp->~ee65161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65161(Test_ee65161, "ee65161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65161C1Ev();
extern void _ZN7ee65161D1Ev();
Name_Map name_map_ee65161[] = {
  NSPAIR(_ZN7ee65161C1Ev),
  NSPAIR(_ZN7ee65161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee65161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65161[];
extern void _ZN7ee651613barEv();
extern void _ZN7ee651613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee651613fooEv,_ZTv0_n12_N7ee651613fooEv)();
extern void ABISELECT(_ZThn32_N7ee651613fooEv,_ZThn20_N7ee651613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee651613barEv,_ZTv0_n16_N7ee651613barEv)();
extern void ABISELECT(_ZThn32_N7ee651613barEv,_ZThn20_N7ee651613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65161[0]),
  (VTBL_ENTRY)&_ZN7ee651613barEv,
  (VTBL_ENTRY)&_ZN7ee651613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee651613fooEv,_ZTv0_n12_N7ee651613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee651613barEv,_ZTv0_n16_N7ee651613barEv),
};
extern VTBL_ENTRY _ZTV7ee65161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee65161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee65161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee65161[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee65161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee65161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee65161[] = {
  {&(_ZTV7ee65161[4]),  4,15},
  {&(_tg__ZTV6dd5161__7ee65161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee65161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee65161[4]),  4,6},
  {&(_ZTV7ee65161[9]),  9,15},
  {&(_ZTV7ee65161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee65161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee65161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65161[];
extern  VTBL_ENTRY _ZTV7ee65161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65161[];
static VTBL_ENTRY alt_thunk_names557[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn20_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee651613barEv,_ZTv0_n16_N7ee651613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee651613barEv,_ZThn20_N7ee651613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee651613fooEv,_ZTv0_n12_N7ee651613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee651613fooEv,_ZThn20_N7ee651613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65161 = {  "ee65161", // class name
  bases_ee65161, 4,
  &(vtc_ee65161[0]), // expected_vtbl_contents
  &(vtt_ee65161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names557,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75161  : virtual dd5161 {
  int e;
  virtual void  foo(); // _ZN7ee751613fooEv
  virtual void  bar(); // _ZN7ee751613barEv
  ~ee75161(); // tgen
  ee75161(); // tgen
};
//SIG(1 ee75161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee75161 ::foo(){vfunc_called(this, "_ZN7ee751613fooEv");}
void  ee75161 ::bar(){vfunc_called(this, "_ZN7ee751613barEv");}
ee75161 ::~ee75161(){ note_dtor("ee75161", this);} // tgen
ee75161 ::ee75161(){ note_ctor("ee75161", this);} // tgen

static void Test_ee75161()
{
  extern Class_Descriptor cd_ee75161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75161, buf);
    ee75161 *dp, &lv = *(dp=new (buf) ee75161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee75161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee75161");
    check_base_class_offset(lv, (cc161*)(dd5161*), ABISELECT(32,16), "ee75161");
    check_base_class_offset(lv, (dd5161*), ABISELECT(16,8), "ee75161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75161.e");
    test_class_info(&lv, &cd_ee75161);
    dp->~ee75161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75161(Test_ee75161, "ee75161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75161C1Ev();
extern void _ZN7ee75161D1Ev();
Name_Map name_map_ee75161[] = {
  NSPAIR(_ZN7ee75161C1Ev),
  NSPAIR(_ZN7ee75161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd5161;
extern VTBL_ENTRY _ZTI6dd5161[];
extern  VTBL_ENTRY _ZTV6dd5161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5161[];
static Base_Class bases_ee75161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5161,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75161[];
extern void _ZN7ee751613fooEv();
extern void _ZN7ee751613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee751613barEv,_ZTv0_n20_N7ee751613barEv)();
extern void ABISELECT(_ZThn16_N7ee751613barEv,_ZThn8_N7ee751613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee751613fooEv,_ZTv0_n12_N7ee751613fooEv)();
extern void ABISELECT(_ZThn48_N7ee751613fooEv,_ZThn24_N7ee751613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee751613barEv,_ZTv0_n16_N7ee751613barEv)();
extern void ABISELECT(_ZThn48_N7ee751613barEv,_ZThn24_N7ee751613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75161[0]),
  (VTBL_ENTRY)&_ZN7ee751613fooEv,
  (VTBL_ENTRY)&_ZN7ee751613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee751613barEv,_ZTv0_n20_N7ee751613barEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75161[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee751613fooEv,_ZTv0_n12_N7ee751613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee751613barEv,_ZTv0_n16_N7ee751613barEv),
};
extern VTBL_ENTRY _ZTV7ee75161[];
extern void _ZN6dd51613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5161__7ee75161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN6dd51613barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd5161__7ee75161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv)();
extern void ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5161__7ee75161[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee75161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee75161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee75161[] = {
  {&(_ZTV7ee75161[5]),  5,22},
  {&(_ZTV7ee75161[12]),  12,22},
  {&(_ZTV7ee75161[16]),  16,22},
  {&(_ZTV7ee75161[20]),  20,22},
  {&(_tg__ZTV6dd5161__7ee75161[4]),  4,5},
  {&(_tg__ZTV5cc161__6dd5161__7ee75161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd5161__7ee75161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee75161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee75161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75161[];
extern  VTBL_ENTRY _ZTV7ee75161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75161[];
static VTBL_ENTRY alt_thunk_names558[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51613barEv,_ZTv0_n16_N6dd51613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51613barEv,_ZThn16_N6dd51613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee751613barEv,_ZTv0_n16_N7ee751613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee751613barEv,_ZThn24_N7ee751613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee751613fooEv,_ZTv0_n12_N7ee751613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee751613fooEv,_ZThn24_N7ee751613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee751613barEv,_ZTv0_n20_N7ee751613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee751613barEv,_ZThn8_N7ee751613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75161 = {  "ee75161", // class name
  bases_ee75161, 4,
  &(vtc_ee75161[0]), // expected_vtbl_contents
  &(vtt_ee75161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75161),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names558,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6161  : cc161 {
  int d;
  virtual void  bar(); // _ZN6dd61613barEv
  virtual void  foo(); // _ZN6dd61613fooEv
  ~dd6161(); // tgen
  dd6161(); // tgen
};
//SIG(-1 dd6161) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd6161 ::bar(){vfunc_called(this, "_ZN6dd61613barEv");}
void  dd6161 ::foo(){vfunc_called(this, "_ZN6dd61613fooEv");}
dd6161 ::~dd6161(){ note_dtor("dd6161", this);} // tgen
dd6161 ::dd6161(){ note_ctor("dd6161", this);} // tgen

static void Test_dd6161()
{
  extern Class_Descriptor cd_dd6161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6161, buf);
    dd6161 *dp, &lv = *(dp=new (buf) dd6161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd6161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(16,12), "dd6161");
    check_base_class_offset(lv, (cc161*), 0, "dd6161");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6161.d");
    test_class_info(&lv, &cd_dd6161);
    dp->~dd6161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6161(Test_dd6161, "dd6161", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6161C1Ev();
extern void _ZN6dd6161D1Ev();
Name_Map name_map_dd6161[] = {
  NSPAIR(_ZN6dd6161C1Ev),
  NSPAIR(_ZN6dd6161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd6161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
extern VTBL_ENTRY _ZTV6dd6161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd6161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd6161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd6161[] = {
  {&(_ZTV6dd6161[3]),  3,11},
  {&(_tg__ZTV5cc161__6dd6161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd6161[4]),  4,6},
  {&(_ZTV6dd6161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static VTBL_ENTRY alt_thunk_names559[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6161 = {  "dd6161", // class name
  bases_dd6161, 3,
  &(vtc_dd6161[0]), // expected_vtbl_contents
  &(vtt_dd6161[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6161),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names559,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06161  : dd6161 {
  int e;
  ~ee06161(); // tgen
  ee06161(); // tgen
};
//SIG(1 ee06161) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee06161 ::~ee06161(){ note_dtor("ee06161", this);} // tgen
ee06161 ::ee06161(){ note_ctor("ee06161", this);} // tgen

static void Test_ee06161()
{
  extern Class_Descriptor cd_ee06161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06161, buf);
    ee06161 *dp, &lv = *(dp=new (buf) ee06161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee06161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(24,16), "ee06161");
    check_base_class_offset(lv, (cc161*)(dd6161*), 0, "ee06161");
    check_base_class_offset(lv, (dd6161*), 0, "ee06161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06161.e");
    test_class_info(&lv, &cd_ee06161);
    dp->~ee06161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06161(Test_ee06161, "ee06161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06161C1Ev();
extern void _ZN7ee06161D1Ev();
Name_Map name_map_ee06161[] = {
  NSPAIR(_ZN7ee06161C1Ev),
  NSPAIR(_ZN7ee06161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee06161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
extern VTBL_ENTRY _ZTV7ee06161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee06161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee06161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee06161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee06161[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee06161[] = {
  {&(_ZTV7ee06161[3]),  3,11},
  {&(_tg__ZTV6dd6161__7ee06161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee06161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee06161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee06161[4]),  4,6},
  {&(_ZTV7ee06161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06161[];
extern  VTBL_ENTRY _ZTV7ee06161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06161[];
static VTBL_ENTRY alt_thunk_names560[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06161 = {  "ee06161", // class name
  bases_ee06161, 4,
  &(vtc_ee06161[0]), // expected_vtbl_contents
  &(vtt_ee06161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names560,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16161  : virtual dd6161 {
  int e;
  ~ee16161(); // tgen
  ee16161(); // tgen
};
//SIG(1 ee16161) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee16161 ::~ee16161(){ note_dtor("ee16161", this);} // tgen
ee16161 ::ee16161(){ note_ctor("ee16161", this);} // tgen

static void Test_ee16161()
{
  extern Class_Descriptor cd_ee16161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16161, buf);
    ee16161 *dp, &lv = *(dp=new (buf) ee16161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee16161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(32,20), "ee16161");
    check_base_class_offset(lv, (cc161*)(dd6161*), ABISELECT(16,8), "ee16161");
    check_base_class_offset(lv, (dd6161*), ABISELECT(16,8), "ee16161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16161.e");
    test_class_info(&lv, &cd_ee16161);
    dp->~ee16161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16161(Test_ee16161, "ee16161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16161C1Ev();
extern void _ZN7ee16161D1Ev();
Name_Map name_map_ee16161[] = {
  NSPAIR(_ZN7ee16161C1Ev),
  NSPAIR(_ZN7ee16161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee16161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16161[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
extern VTBL_ENTRY _ZTV7ee16161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee16161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee16161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee16161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee16161[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee16161[] = {
  {&(_ZTV7ee16161[4]),  4,17},
  {&(_ZTV7ee16161[9]),  9,17},
  {&(_ZTV7ee16161[15]),  15,17},
  {&(_tg__ZTV6dd6161__7ee16161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee16161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee16161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee16161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16161[];
extern  VTBL_ENTRY _ZTV7ee16161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16161[];
static VTBL_ENTRY alt_thunk_names561[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16161 = {  "ee16161", // class name
  bases_ee16161, 4,
  &(vtc_ee16161[0]), // expected_vtbl_contents
  &(vtt_ee16161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16161),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16161),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names561,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26161  : dd6161 {
  int e;
  virtual void  foo(); // _ZN7ee261613fooEv
  ~ee26161(); // tgen
  ee26161(); // tgen
};
//SIG(1 ee26161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee26161 ::foo(){vfunc_called(this, "_ZN7ee261613fooEv");}
ee26161 ::~ee26161(){ note_dtor("ee26161", this);} // tgen
ee26161 ::ee26161(){ note_ctor("ee26161", this);} // tgen

static void Test_ee26161()
{
  extern Class_Descriptor cd_ee26161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26161, buf);
    ee26161 *dp, &lv = *(dp=new (buf) ee26161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee26161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(24,16), "ee26161");
    check_base_class_offset(lv, (cc161*)(dd6161*), 0, "ee26161");
    check_base_class_offset(lv, (dd6161*), 0, "ee26161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26161.e");
    test_class_info(&lv, &cd_ee26161);
    dp->~ee26161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26161(Test_ee26161, "ee26161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26161C1Ev();
extern void _ZN7ee26161D1Ev();
Name_Map name_map_ee26161[] = {
  NSPAIR(_ZN7ee26161C1Ev),
  NSPAIR(_ZN7ee26161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee26161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26161[];
extern void _ZN6dd61613barEv();
extern void _ZN7ee261613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee261613fooEv,_ZTv0_n12_N7ee261613fooEv)();
extern void ABISELECT(_ZThn24_N7ee261613fooEv,_ZThn16_N7ee261613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN7ee261613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee261613fooEv,_ZTv0_n12_N7ee261613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
extern VTBL_ENTRY _ZTV7ee26161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee26161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee26161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee26161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee26161[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee26161[] = {
  {&(_ZTV7ee26161[3]),  3,11},
  {&(_tg__ZTV6dd6161__7ee26161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee26161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee26161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee26161[4]),  4,6},
  {&(_ZTV7ee26161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26161[];
extern  VTBL_ENTRY _ZTV7ee26161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26161[];
static VTBL_ENTRY alt_thunk_names562[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee261613fooEv,_ZTv0_n12_N7ee261613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee261613fooEv,_ZThn16_N7ee261613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26161 = {  "ee26161", // class name
  bases_ee26161, 4,
  &(vtc_ee26161[0]), // expected_vtbl_contents
  &(vtt_ee26161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26161),6, //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  ee36161  : virtual dd6161 {
  int e;
  virtual void  foo(); // _ZN7ee361613fooEv
  ~ee36161(); // tgen
  ee36161(); // tgen
};
//SIG(1 ee36161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee36161 ::foo(){vfunc_called(this, "_ZN7ee361613fooEv");}
ee36161 ::~ee36161(){ note_dtor("ee36161", this);} // tgen
ee36161 ::ee36161(){ note_ctor("ee36161", this);} // tgen

static void Test_ee36161()
{
  extern Class_Descriptor cd_ee36161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36161, buf);
    ee36161 *dp, &lv = *(dp=new (buf) ee36161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee36161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(32,20), "ee36161");
    check_base_class_offset(lv, (cc161*)(dd6161*), ABISELECT(16,8), "ee36161");
    check_base_class_offset(lv, (dd6161*), ABISELECT(16,8), "ee36161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36161.e");
    test_class_info(&lv, &cd_ee36161);
    dp->~ee36161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36161(Test_ee36161, "ee36161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36161C1Ev();
extern void _ZN7ee36161D1Ev();
Name_Map name_map_ee36161[] = {
  NSPAIR(_ZN7ee36161C1Ev),
  NSPAIR(_ZN7ee36161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee36161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36161[];
extern void _ZN7ee361613fooEv();
extern void _ZN6dd61613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee361613fooEv,_ZTv0_n20_N7ee361613fooEv)();
extern void ABISELECT(_ZThn16_N7ee361613fooEv,_ZThn8_N7ee361613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee361613fooEv,_ZTv0_n12_N7ee361613fooEv)();
extern void ABISELECT(_ZThn32_N7ee361613fooEv,_ZThn20_N7ee361613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36161[0]),
  (VTBL_ENTRY)&_ZN7ee361613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee361613fooEv,_ZTv0_n20_N7ee361613fooEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee361613fooEv,_ZTv0_n12_N7ee361613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
extern VTBL_ENTRY _ZTV7ee36161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee36161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee36161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee36161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee36161[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee36161[] = {
  {&(_ZTV7ee36161[4]),  4,18},
  {&(_ZTV7ee36161[10]),  10,18},
  {&(_ZTV7ee36161[16]),  16,18},
  {&(_tg__ZTV6dd6161__7ee36161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee36161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee36161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee36161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36161[];
extern  VTBL_ENTRY _ZTV7ee36161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36161[];
static VTBL_ENTRY alt_thunk_names563[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee361613fooEv,_ZTv0_n12_N7ee361613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee361613fooEv,_ZThn20_N7ee361613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee361613fooEv,_ZTv0_n20_N7ee361613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee361613fooEv,_ZThn8_N7ee361613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36161 = {  "ee36161", // class name
  bases_ee36161, 4,
  &(vtc_ee36161[0]), // expected_vtbl_contents
  &(vtt_ee36161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36161),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36161),7, //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  ee46161  : dd6161 {
  int e;
  virtual void  bar(); // _ZN7ee461613barEv
  ~ee46161(); // tgen
  ee46161(); // tgen
};
//SIG(1 ee46161) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee46161 ::bar(){vfunc_called(this, "_ZN7ee461613barEv");}
ee46161 ::~ee46161(){ note_dtor("ee46161", this);} // tgen
ee46161 ::ee46161(){ note_ctor("ee46161", this);} // tgen

static void Test_ee46161()
{
  extern Class_Descriptor cd_ee46161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46161, buf);
    ee46161 *dp, &lv = *(dp=new (buf) ee46161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee46161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(24,16), "ee46161");
    check_base_class_offset(lv, (cc161*)(dd6161*), 0, "ee46161");
    check_base_class_offset(lv, (dd6161*), 0, "ee46161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46161.e");
    test_class_info(&lv, &cd_ee46161);
    dp->~ee46161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46161(Test_ee46161, "ee46161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46161C1Ev();
extern void _ZN7ee46161D1Ev();
Name_Map name_map_ee46161[] = {
  NSPAIR(_ZN7ee46161C1Ev),
  NSPAIR(_ZN7ee46161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee46161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46161[];
extern void _ZN7ee461613barEv();
extern void _ZN6dd61613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee461613barEv,_ZTv0_n16_N7ee461613barEv)();
extern void ABISELECT(_ZThn24_N7ee461613barEv,_ZThn16_N7ee461613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46161[0]),
  (VTBL_ENTRY)&_ZN7ee461613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee461613barEv,_ZTv0_n16_N7ee461613barEv),
};
extern VTBL_ENTRY _ZTV7ee46161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee46161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee46161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee46161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee46161[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee46161[] = {
  {&(_ZTV7ee46161[3]),  3,11},
  {&(_tg__ZTV6dd6161__7ee46161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee46161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee46161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee46161[4]),  4,6},
  {&(_ZTV7ee46161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46161[];
extern  VTBL_ENTRY _ZTV7ee46161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46161[];
static VTBL_ENTRY alt_thunk_names564[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee461613barEv,_ZTv0_n16_N7ee461613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee461613barEv,_ZThn16_N7ee461613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46161 = {  "ee46161", // class name
  bases_ee46161, 4,
  &(vtc_ee46161[0]), // expected_vtbl_contents
  &(vtt_ee46161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46161),6, //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  ee56161  : virtual dd6161 {
  int e;
  virtual void  bar(); // _ZN7ee561613barEv
  ~ee56161(); // tgen
  ee56161(); // tgen
};
//SIG(1 ee56161) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee56161 ::bar(){vfunc_called(this, "_ZN7ee561613barEv");}
ee56161 ::~ee56161(){ note_dtor("ee56161", this);} // tgen
ee56161 ::ee56161(){ note_ctor("ee56161", this);} // tgen

static void Test_ee56161()
{
  extern Class_Descriptor cd_ee56161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56161, buf);
    ee56161 *dp, &lv = *(dp=new (buf) ee56161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee56161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(32,20), "ee56161");
    check_base_class_offset(lv, (cc161*)(dd6161*), ABISELECT(16,8), "ee56161");
    check_base_class_offset(lv, (dd6161*), ABISELECT(16,8), "ee56161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56161.e");
    test_class_info(&lv, &cd_ee56161);
    dp->~ee56161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56161(Test_ee56161, "ee56161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56161C1Ev();
extern void _ZN7ee56161D1Ev();
Name_Map name_map_ee56161[] = {
  NSPAIR(_ZN7ee56161C1Ev),
  NSPAIR(_ZN7ee56161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee56161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56161[];
extern void _ZN7ee561613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee561613barEv,_ZTv0_n16_N7ee561613barEv)();
extern void ABISELECT(_ZThn16_N7ee561613barEv,_ZThn8_N7ee561613barEv)() __attribute__((weak));
extern void _ZN6dd61613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee561613barEv,_ZTv0_n16_N7ee561613barEv)();
extern void ABISELECT(_ZThn32_N7ee561613barEv,_ZThn20_N7ee561613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56161[0]),
  (VTBL_ENTRY)&_ZN7ee561613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee561613barEv,_ZTv0_n16_N7ee561613barEv),
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee561613barEv,_ZTv0_n16_N7ee561613barEv),
};
extern VTBL_ENTRY _ZTV7ee56161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee56161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee56161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee56161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee56161[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee56161[] = {
  {&(_ZTV7ee56161[4]),  4,18},
  {&(_ZTV7ee56161[10]),  10,18},
  {&(_ZTV7ee56161[16]),  16,18},
  {&(_tg__ZTV6dd6161__7ee56161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee56161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee56161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee56161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56161[];
extern  VTBL_ENTRY _ZTV7ee56161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56161[];
static VTBL_ENTRY alt_thunk_names565[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee561613barEv,_ZTv0_n16_N7ee561613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee561613barEv,_ZThn20_N7ee561613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee561613barEv,_ZThn8_N7ee561613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56161 = {  "ee56161", // class name
  bases_ee56161, 4,
  &(vtc_ee56161[0]), // expected_vtbl_contents
  &(vtt_ee56161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56161),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56161),7, //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  ee66161  : dd6161 {
  int e;
  virtual void  foo(); // _ZN7ee661613fooEv
  virtual void  bar(); // _ZN7ee661613barEv
  ~ee66161(); // tgen
  ee66161(); // tgen
};
//SIG(1 ee66161) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66161 ::foo(){vfunc_called(this, "_ZN7ee661613fooEv");}
void  ee66161 ::bar(){vfunc_called(this, "_ZN7ee661613barEv");}
ee66161 ::~ee66161(){ note_dtor("ee66161", this);} // tgen
ee66161 ::ee66161(){ note_ctor("ee66161", this);} // tgen

static void Test_ee66161()
{
  extern Class_Descriptor cd_ee66161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66161, buf);
    ee66161 *dp, &lv = *(dp=new (buf) ee66161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee66161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(24,16), "ee66161");
    check_base_class_offset(lv, (cc161*)(dd6161*), 0, "ee66161");
    check_base_class_offset(lv, (dd6161*), 0, "ee66161");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66161.e");
    test_class_info(&lv, &cd_ee66161);
    dp->~ee66161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66161(Test_ee66161, "ee66161", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66161C1Ev();
extern void _ZN7ee66161D1Ev();
Name_Map name_map_ee66161[] = {
  NSPAIR(_ZN7ee66161C1Ev),
  NSPAIR(_ZN7ee66161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee66161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66161[];
extern void _ZN7ee661613barEv();
extern void _ZN7ee661613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee661613fooEv,_ZTv0_n12_N7ee661613fooEv)();
extern void ABISELECT(_ZThn24_N7ee661613fooEv,_ZThn16_N7ee661613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee661613barEv,_ZTv0_n16_N7ee661613barEv)();
extern void ABISELECT(_ZThn24_N7ee661613barEv,_ZThn16_N7ee661613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66161[0]),
  (VTBL_ENTRY)&_ZN7ee661613barEv,
  (VTBL_ENTRY)&_ZN7ee661613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee661613fooEv,_ZTv0_n12_N7ee661613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee661613barEv,_ZTv0_n16_N7ee661613barEv),
};
extern VTBL_ENTRY _ZTV7ee66161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee66161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee66161[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee66161[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee66161[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee66161[] = {
  {&(_ZTV7ee66161[3]),  3,11},
  {&(_tg__ZTV6dd6161__7ee66161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee66161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee66161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee66161[4]),  4,6},
  {&(_ZTV7ee66161[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66161[];
extern  VTBL_ENTRY _ZTV7ee66161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66161[];
static VTBL_ENTRY alt_thunk_names566[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613barEv,_ZThn16_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61613fooEv,_ZThn16_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee661613barEv,_ZTv0_n16_N7ee661613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee661613barEv,_ZThn16_N7ee661613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee661613fooEv,_ZTv0_n12_N7ee661613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee661613fooEv,_ZThn16_N7ee661613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66161 = {  "ee66161", // class name
  bases_ee66161, 4,
  &(vtc_ee66161[0]), // expected_vtbl_contents
  &(vtt_ee66161[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66161),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66161),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names566,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76161  : virtual dd6161 {
  int e;
  virtual void  foo(); // _ZN7ee761613fooEv
  virtual void  bar(); // _ZN7ee761613barEv
  ~ee76161(); // tgen
  ee76161(); // tgen
};
//SIG(1 ee76161) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76161 ::foo(){vfunc_called(this, "_ZN7ee761613fooEv");}
void  ee76161 ::bar(){vfunc_called(this, "_ZN7ee761613barEv");}
ee76161 ::~ee76161(){ note_dtor("ee76161", this);} // tgen
ee76161 ::ee76161(){ note_ctor("ee76161", this);} // tgen

static void Test_ee76161()
{
  extern Class_Descriptor cd_ee76161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76161, buf);
    ee76161 *dp, &lv = *(dp=new (buf) ee76161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee76161");
    check_base_class_offset(lv, (bb61*)(cc161*)(dd6161*), ABISELECT(32,20), "ee76161");
    check_base_class_offset(lv, (cc161*)(dd6161*), ABISELECT(16,8), "ee76161");
    check_base_class_offset(lv, (dd6161*), ABISELECT(16,8), "ee76161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76161.e");
    test_class_info(&lv, &cd_ee76161);
    dp->~ee76161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76161(Test_ee76161, "ee76161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76161C1Ev();
extern void _ZN7ee76161D1Ev();
Name_Map name_map_ee76161[] = {
  NSPAIR(_ZN7ee76161C1Ev),
  NSPAIR(_ZN7ee76161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd6161;
extern VTBL_ENTRY _ZTI6dd6161[];
extern  VTBL_ENTRY _ZTV6dd6161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6161[];
static Base_Class bases_ee76161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76161[];
extern void _ZN7ee761613fooEv();
extern void _ZN7ee761613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee761613barEv,_ZTv0_n16_N7ee761613barEv)();
extern void ABISELECT(_ZThn16_N7ee761613barEv,_ZThn8_N7ee761613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee761613fooEv,_ZTv0_n20_N7ee761613fooEv)();
extern void ABISELECT(_ZThn16_N7ee761613fooEv,_ZThn8_N7ee761613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee761613fooEv,_ZTv0_n12_N7ee761613fooEv)();
extern void ABISELECT(_ZThn32_N7ee761613fooEv,_ZThn20_N7ee761613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee761613barEv,_ZTv0_n16_N7ee761613barEv)();
extern void ABISELECT(_ZThn32_N7ee761613barEv,_ZThn20_N7ee761613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76161[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76161[0]),
  (VTBL_ENTRY)&_ZN7ee761613fooEv,
  (VTBL_ENTRY)&_ZN7ee761613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee761613barEv,_ZTv0_n16_N7ee761613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee761613fooEv,_ZTv0_n20_N7ee761613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee761613fooEv,_ZTv0_n12_N7ee761613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee761613barEv,_ZTv0_n16_N7ee761613barEv),
};
extern VTBL_ENTRY _ZTV7ee76161[];
extern void _ZN6dd61613barEv();
extern void _ZN6dd61613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6161__7ee76161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&_ZN6dd61613barEv,
  (VTBL_ENTRY)&_ZN6dd61613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1616dd6161__7ee76161[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc1616dd6161__7ee76161[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv)();
extern void ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv)();
extern void ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6161__7ee76161[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv),
};
static  VTT_ENTRY vtt_ee76161[] = {
  {&(_ZTV7ee76161[4]),  4,19},
  {&(_ZTV7ee76161[11]),  11,19},
  {&(_ZTV7ee76161[17]),  17,19},
  {&(_tg__ZTV6dd6161__7ee76161[3]),  3,5},
  {&(_tg__ZTV5cc1616dd6161__7ee76161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc1616dd6161__7ee76161[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6161__7ee76161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76161[];
extern  VTBL_ENTRY _ZTV7ee76161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76161[];
static VTBL_ENTRY alt_thunk_names567[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61613barEv,_ZTv0_n16_N6dd61613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613barEv,_ZThn12_N6dd61613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61613fooEv,_ZTv0_n12_N6dd61613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61613fooEv,_ZThn12_N6dd61613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee761613fooEv,_ZTv0_n12_N7ee761613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee761613fooEv,_ZThn20_N7ee761613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee761613fooEv,_ZTv0_n20_N7ee761613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee761613fooEv,_ZThn8_N7ee761613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee761613barEv,_ZTv0_n16_N7ee761613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee761613barEv,_ZThn20_N7ee761613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee761613barEv,_ZThn8_N7ee761613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76161 = {  "ee76161", // class name
  bases_ee76161, 4,
  &(vtc_ee76161[0]), // expected_vtbl_contents
  &(vtt_ee76161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76161),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76161),7, //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  dd7161  : virtual cc161 {
  int d;
  virtual void  bar(); // _ZN6dd71613barEv
  virtual void  foo(); // _ZN6dd71613fooEv
  ~dd7161(); // tgen
  dd7161(); // tgen
};
//SIG(-1 dd7161) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd7161 ::bar(){vfunc_called(this, "_ZN6dd71613barEv");}
void  dd7161 ::foo(){vfunc_called(this, "_ZN6dd71613fooEv");}
dd7161 ::~dd7161(){ note_dtor("dd7161", this);} // tgen
dd7161 ::dd7161(){ note_ctor("dd7161", this);} // tgen

static void Test_dd7161()
{
  extern Class_Descriptor cd_dd7161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7161, buf);
    dd7161 *dp, &lv = *(dp=new (buf) dd7161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd7161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,16), "dd7161");
    check_base_class_offset(lv, (cc161*), ABISELECT(16,8), "dd7161");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7161.d");
    test_class_info(&lv, &cd_dd7161);
    dp->~dd7161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7161(Test_dd7161, "dd7161", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7161C1Ev();
extern void _ZN6dd7161D1Ev();
Name_Map name_map_dd7161[] = {
  NSPAIR(_ZN6dd7161C1Ev),
  NSPAIR(_ZN6dd7161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
static Base_Class bases_dd7161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc161,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
extern VTBL_ENTRY _ZTV6dd7161[];
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__6dd7161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd7161[] = {
  {&(_ZTV6dd7161[4]),  4,15},
  {&(_ZTV6dd7161[9]),  9,15},
  {&(_ZTV6dd7161[13]),  13,15},
  {&(_tg__ZTV5cc161__6dd7161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__6dd7161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static VTBL_ENTRY alt_thunk_names568[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7161 = {  "dd7161", // class name
  bases_dd7161, 3,
  &(vtc_dd7161[0]), // expected_vtbl_contents
  &(vtt_dd7161[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7161),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names568,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07161  : dd7161 {
  int e;
  ~ee07161(); // tgen
  ee07161(); // tgen
};
//SIG(1 ee07161) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee07161 ::~ee07161(){ note_dtor("ee07161", this);} // tgen
ee07161 ::ee07161(){ note_ctor("ee07161", this);} // tgen

static void Test_ee07161()
{
  extern Class_Descriptor cd_ee07161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07161, buf);
    ee07161 *dp, &lv = *(dp=new (buf) ee07161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee07161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee07161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(16,12), "ee07161");
    check_base_class_offset(lv, (dd7161*), 0, "ee07161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07161.e");
    test_class_info(&lv, &cd_ee07161);
    dp->~ee07161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07161(Test_ee07161, "ee07161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07161C1Ev();
extern void _ZN7ee07161D1Ev();
Name_Map name_map_ee07161[] = {
  NSPAIR(_ZN7ee07161C1Ev),
  NSPAIR(_ZN7ee07161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee07161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
extern VTBL_ENTRY _ZTV7ee07161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee07161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee07161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee07161[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee07161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee07161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee07161[] = {
  {&(_ZTV7ee07161[4]),  4,15},
  {&(_tg__ZTV6dd7161__7ee07161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee07161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee07161[4]),  4,6},
  {&(_ZTV7ee07161[9]),  9,15},
  {&(_ZTV7ee07161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee07161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee07161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07161[];
extern  VTBL_ENTRY _ZTV7ee07161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07161[];
static VTBL_ENTRY alt_thunk_names569[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07161 = {  "ee07161", // class name
  bases_ee07161, 4,
  &(vtc_ee07161[0]), // expected_vtbl_contents
  &(vtt_ee07161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07161),8, //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  ee17161  : virtual dd7161 {
  int e;
  ~ee17161(); // tgen
  ee17161(); // tgen
};
//SIG(1 ee17161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee17161 ::~ee17161(){ note_dtor("ee17161", this);} // tgen
ee17161 ::ee17161(){ note_ctor("ee17161", this);} // tgen

static void Test_ee17161()
{
  extern Class_Descriptor cd_ee17161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17161, buf);
    ee17161 *dp, &lv = *(dp=new (buf) ee17161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee17161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee17161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(32,16), "ee17161");
    check_base_class_offset(lv, (dd7161*), ABISELECT(16,8), "ee17161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17161.e");
    test_class_info(&lv, &cd_ee17161);
    dp->~ee17161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17161(Test_ee17161, "ee17161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17161C1Ev();
extern void _ZN7ee17161D1Ev();
Name_Map name_map_ee17161[] = {
  NSPAIR(_ZN7ee17161C1Ev),
  NSPAIR(_ZN7ee17161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee17161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17161[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17161[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
extern VTBL_ENTRY _ZTV7ee17161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee17161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee17161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee17161[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee17161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee17161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee17161[] = {
  {&(_ZTV7ee17161[5]),  5,22},
  {&(_ZTV7ee17161[11]),  11,22},
  {&(_ZTV7ee17161[16]),  16,22},
  {&(_ZTV7ee17161[20]),  20,22},
  {&(_tg__ZTV6dd7161__7ee17161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee17161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee17161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee17161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee17161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17161[];
extern  VTBL_ENTRY _ZTV7ee17161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17161[];
static VTBL_ENTRY alt_thunk_names570[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17161 = {  "ee17161", // class name
  bases_ee17161, 4,
  &(vtc_ee17161[0]), // expected_vtbl_contents
  &(vtt_ee17161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17161),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17161),9, //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  ee27161  : dd7161 {
  int e;
  virtual void  foo(); // _ZN7ee271613fooEv
  ~ee27161(); // tgen
  ee27161(); // tgen
};
//SIG(1 ee27161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee27161 ::foo(){vfunc_called(this, "_ZN7ee271613fooEv");}
ee27161 ::~ee27161(){ note_dtor("ee27161", this);} // tgen
ee27161 ::ee27161(){ note_ctor("ee27161", this);} // tgen

static void Test_ee27161()
{
  extern Class_Descriptor cd_ee27161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27161, buf);
    ee27161 *dp, &lv = *(dp=new (buf) ee27161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee27161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee27161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(16,12), "ee27161");
    check_base_class_offset(lv, (dd7161*), 0, "ee27161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27161.e");
    test_class_info(&lv, &cd_ee27161);
    dp->~ee27161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27161(Test_ee27161, "ee27161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27161C1Ev();
extern void _ZN7ee27161D1Ev();
Name_Map name_map_ee27161[] = {
  NSPAIR(_ZN7ee27161C1Ev),
  NSPAIR(_ZN7ee27161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee27161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27161[];
extern void _ZN6dd71613barEv();
extern void _ZN7ee271613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee271613fooEv,_ZTv0_n12_N7ee271613fooEv)();
extern void ABISELECT(_ZThn32_N7ee271613fooEv,_ZThn20_N7ee271613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN7ee271613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee271613fooEv,_ZTv0_n12_N7ee271613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
extern VTBL_ENTRY _ZTV7ee27161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee27161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee27161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee27161[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee27161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee27161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee27161[] = {
  {&(_ZTV7ee27161[4]),  4,15},
  {&(_tg__ZTV6dd7161__7ee27161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee27161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee27161[4]),  4,6},
  {&(_ZTV7ee27161[9]),  9,15},
  {&(_ZTV7ee27161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee27161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee27161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27161[];
extern  VTBL_ENTRY _ZTV7ee27161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27161[];
static VTBL_ENTRY alt_thunk_names571[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee271613fooEv,_ZTv0_n12_N7ee271613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee271613fooEv,_ZThn20_N7ee271613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27161 = {  "ee27161", // class name
  bases_ee27161, 4,
  &(vtc_ee27161[0]), // expected_vtbl_contents
  &(vtt_ee27161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names571,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37161  : virtual dd7161 {
  int e;
  virtual void  foo(); // _ZN7ee371613fooEv
  ~ee37161(); // tgen
  ee37161(); // tgen
};
//SIG(1 ee37161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee37161 ::foo(){vfunc_called(this, "_ZN7ee371613fooEv");}
ee37161 ::~ee37161(){ note_dtor("ee37161", this);} // tgen
ee37161 ::ee37161(){ note_ctor("ee37161", this);} // tgen

static void Test_ee37161()
{
  extern Class_Descriptor cd_ee37161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37161, buf);
    ee37161 *dp, &lv = *(dp=new (buf) ee37161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee37161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee37161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(32,16), "ee37161");
    check_base_class_offset(lv, (dd7161*), ABISELECT(16,8), "ee37161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37161.e");
    test_class_info(&lv, &cd_ee37161);
    dp->~ee37161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37161(Test_ee37161, "ee37161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37161C1Ev();
extern void _ZN7ee37161D1Ev();
Name_Map name_map_ee37161[] = {
  NSPAIR(_ZN7ee37161C1Ev),
  NSPAIR(_ZN7ee37161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee37161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37161[];
extern void _ZN7ee371613fooEv();
extern void _ZN6dd71613barEv();
extern void ABISELECT(_ZTv0_n48_N7ee371613fooEv,_ZTv0_n24_N7ee371613fooEv)();
extern void ABISELECT(_ZThn16_N7ee371613fooEv,_ZThn8_N7ee371613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee371613fooEv,_ZTv0_n12_N7ee371613fooEv)();
extern void ABISELECT(_ZThn48_N7ee371613fooEv,_ZThn24_N7ee371613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37161[0]),
  (VTBL_ENTRY)&_ZN7ee371613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee371613fooEv,_ZTv0_n24_N7ee371613fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37161[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee371613fooEv,_ZTv0_n12_N7ee371613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
extern VTBL_ENTRY _ZTV7ee37161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee37161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee37161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee37161[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee37161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee37161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee37161[] = {
  {&(_ZTV7ee37161[5]),  5,23},
  {&(_ZTV7ee37161[12]),  12,23},
  {&(_ZTV7ee37161[17]),  17,23},
  {&(_ZTV7ee37161[21]),  21,23},
  {&(_tg__ZTV6dd7161__7ee37161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee37161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee37161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee37161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee37161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37161[];
extern  VTBL_ENTRY _ZTV7ee37161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37161[];
static VTBL_ENTRY alt_thunk_names572[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee371613fooEv,_ZTv0_n12_N7ee371613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee371613fooEv,_ZThn24_N7ee371613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee371613fooEv,_ZTv0_n24_N7ee371613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee371613fooEv,_ZThn8_N7ee371613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37161 = {  "ee37161", // class name
  bases_ee37161, 4,
  &(vtc_ee37161[0]), // expected_vtbl_contents
  &(vtt_ee37161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37161),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names572,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47161  : dd7161 {
  int e;
  virtual void  bar(); // _ZN7ee471613barEv
  ~ee47161(); // tgen
  ee47161(); // tgen
};
//SIG(1 ee47161) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee47161 ::bar(){vfunc_called(this, "_ZN7ee471613barEv");}
ee47161 ::~ee47161(){ note_dtor("ee47161", this);} // tgen
ee47161 ::ee47161(){ note_ctor("ee47161", this);} // tgen

static void Test_ee47161()
{
  extern Class_Descriptor cd_ee47161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47161, buf);
    ee47161 *dp, &lv = *(dp=new (buf) ee47161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee47161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee47161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(16,12), "ee47161");
    check_base_class_offset(lv, (dd7161*), 0, "ee47161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47161.e");
    test_class_info(&lv, &cd_ee47161);
    dp->~ee47161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47161(Test_ee47161, "ee47161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47161C1Ev();
extern void _ZN7ee47161D1Ev();
Name_Map name_map_ee47161[] = {
  NSPAIR(_ZN7ee47161C1Ev),
  NSPAIR(_ZN7ee47161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee47161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47161[];
extern void _ZN7ee471613barEv();
extern void _ZN6dd71613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee471613barEv,_ZTv0_n16_N7ee471613barEv)();
extern void ABISELECT(_ZThn32_N7ee471613barEv,_ZThn20_N7ee471613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47161[0]),
  (VTBL_ENTRY)&_ZN7ee471613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee471613barEv,_ZTv0_n16_N7ee471613barEv),
};
extern VTBL_ENTRY _ZTV7ee47161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee47161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee47161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee47161[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee47161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee47161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee47161[] = {
  {&(_ZTV7ee47161[4]),  4,15},
  {&(_tg__ZTV6dd7161__7ee47161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee47161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee47161[4]),  4,6},
  {&(_ZTV7ee47161[9]),  9,15},
  {&(_ZTV7ee47161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee47161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee47161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47161[];
extern  VTBL_ENTRY _ZTV7ee47161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47161[];
static VTBL_ENTRY alt_thunk_names573[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee471613barEv,_ZTv0_n16_N7ee471613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee471613barEv,_ZThn20_N7ee471613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47161 = {  "ee47161", // class name
  bases_ee47161, 4,
  &(vtc_ee47161[0]), // expected_vtbl_contents
  &(vtt_ee47161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names573,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57161  : virtual dd7161 {
  int e;
  virtual void  bar(); // _ZN7ee571613barEv
  ~ee57161(); // tgen
  ee57161(); // tgen
};
//SIG(1 ee57161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee57161 ::bar(){vfunc_called(this, "_ZN7ee571613barEv");}
ee57161 ::~ee57161(){ note_dtor("ee57161", this);} // tgen
ee57161 ::ee57161(){ note_ctor("ee57161", this);} // tgen

static void Test_ee57161()
{
  extern Class_Descriptor cd_ee57161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57161, buf);
    ee57161 *dp, &lv = *(dp=new (buf) ee57161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee57161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee57161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(32,16), "ee57161");
    check_base_class_offset(lv, (dd7161*), ABISELECT(16,8), "ee57161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57161.e");
    test_class_info(&lv, &cd_ee57161);
    dp->~ee57161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57161(Test_ee57161, "ee57161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57161C1Ev();
extern void _ZN7ee57161D1Ev();
Name_Map name_map_ee57161[] = {
  NSPAIR(_ZN7ee57161C1Ev),
  NSPAIR(_ZN7ee57161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee57161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc161,    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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57161[];
extern void _ZN7ee571613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee571613barEv,_ZTv0_n20_N7ee571613barEv)();
extern void ABISELECT(_ZThn16_N7ee571613barEv,_ZThn8_N7ee571613barEv)() __attribute__((weak));
extern void _ZN6dd71613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee571613barEv,_ZTv0_n16_N7ee571613barEv)();
extern void ABISELECT(_ZThn48_N7ee571613barEv,_ZThn24_N7ee571613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57161[0]),
  (VTBL_ENTRY)&_ZN7ee571613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee571613barEv,_ZTv0_n20_N7ee571613barEv),
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57161[0]),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee571613barEv,_ZTv0_n16_N7ee571613barEv),
};
extern VTBL_ENTRY _ZTV7ee57161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee57161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee57161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee57161[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee57161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee57161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee57161[] = {
  {&(_ZTV7ee57161[5]),  5,23},
  {&(_ZTV7ee57161[12]),  12,23},
  {&(_ZTV7ee57161[17]),  17,23},
  {&(_ZTV7ee57161[21]),  21,23},
  {&(_tg__ZTV6dd7161__7ee57161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee57161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee57161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee57161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee57161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57161[];
extern  VTBL_ENTRY _ZTV7ee57161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57161[];
static VTBL_ENTRY alt_thunk_names574[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee571613barEv,_ZTv0_n16_N7ee571613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee571613barEv,_ZThn24_N7ee571613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee571613barEv,_ZTv0_n20_N7ee571613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee571613barEv,_ZThn8_N7ee571613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57161 = {  "ee57161", // class name
  bases_ee57161, 4,
  &(vtc_ee57161[0]), // expected_vtbl_contents
  &(vtt_ee57161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57161),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57161),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names574,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67161  : dd7161 {
  int e;
  virtual void  foo(); // _ZN7ee671613fooEv
  virtual void  bar(); // _ZN7ee671613barEv
  ~ee67161(); // tgen
  ee67161(); // tgen
};
//SIG(1 ee67161) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67161 ::foo(){vfunc_called(this, "_ZN7ee671613fooEv");}
void  ee67161 ::bar(){vfunc_called(this, "_ZN7ee671613barEv");}
ee67161 ::~ee67161(){ note_dtor("ee67161", this);} // tgen
ee67161 ::ee67161(){ note_ctor("ee67161", this);} // tgen

static void Test_ee67161()
{
  extern Class_Descriptor cd_ee67161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67161, buf);
    ee67161 *dp, &lv = *(dp=new (buf) ee67161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee67161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(32,20), "ee67161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(16,12), "ee67161");
    check_base_class_offset(lv, (dd7161*), 0, "ee67161");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67161.e");
    test_class_info(&lv, &cd_ee67161);
    dp->~ee67161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67161(Test_ee67161, "ee67161", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67161C1Ev();
extern void _ZN7ee67161D1Ev();
Name_Map name_map_ee67161[] = {
  NSPAIR(_ZN7ee67161C1Ev),
  NSPAIR(_ZN7ee67161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee67161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc161,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67161[];
extern void _ZN7ee671613barEv();
extern void _ZN7ee671613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee671613fooEv,_ZTv0_n12_N7ee671613fooEv)();
extern void ABISELECT(_ZThn32_N7ee671613fooEv,_ZThn20_N7ee671613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee671613barEv,_ZTv0_n16_N7ee671613barEv)();
extern void ABISELECT(_ZThn32_N7ee671613barEv,_ZThn20_N7ee671613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67161[0]),
  (VTBL_ENTRY)&_ZN7ee671613barEv,
  (VTBL_ENTRY)&_ZN7ee671613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67161[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee671613fooEv,_ZTv0_n12_N7ee671613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee671613barEv,_ZTv0_n16_N7ee671613barEv),
};
extern VTBL_ENTRY _ZTV7ee67161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee67161[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee67161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee67161[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee67161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee67161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee67161[] = {
  {&(_ZTV7ee67161[4]),  4,15},
  {&(_tg__ZTV6dd7161__7ee67161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee67161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee67161[4]),  4,6},
  {&(_ZTV7ee67161[9]),  9,15},
  {&(_ZTV7ee67161[13]),  13,15},
  {&(_tg__ZTV5cc161__7ee67161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee67161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67161[];
extern  VTBL_ENTRY _ZTV7ee67161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67161[];
static VTBL_ENTRY alt_thunk_names575[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn20_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn20_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee671613barEv,_ZTv0_n16_N7ee671613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee671613barEv,_ZThn20_N7ee671613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee671613fooEv,_ZTv0_n12_N7ee671613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee671613fooEv,_ZThn20_N7ee671613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67161 = {  "ee67161", // class name
  bases_ee67161, 4,
  &(vtc_ee67161[0]), // expected_vtbl_contents
  &(vtt_ee67161[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67161),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67161),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67161),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names575,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77161  : virtual dd7161 {
  int e;
  virtual void  foo(); // _ZN7ee771613fooEv
  virtual void  bar(); // _ZN7ee771613barEv
  ~ee77161(); // tgen
  ee77161(); // tgen
};
//SIG(1 ee77161) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77161 ::foo(){vfunc_called(this, "_ZN7ee771613fooEv");}
void  ee77161 ::bar(){vfunc_called(this, "_ZN7ee771613barEv");}
ee77161 ::~ee77161(){ note_dtor("ee77161", this);} // tgen
ee77161 ::ee77161(){ note_ctor("ee77161", this);} // tgen

static void Test_ee77161()
{
  extern Class_Descriptor cd_ee77161;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77161, buf);
    ee77161 *dp, &lv = *(dp=new (buf) ee77161());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77161)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77161)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee77161");
    check_base_class_offset(lv, (bb61*)(cc161*), ABISELECT(48,24), "ee77161");
    check_base_class_offset(lv, (cc161*)(dd7161*), ABISELECT(32,16), "ee77161");
    check_base_class_offset(lv, (dd7161*), ABISELECT(16,8), "ee77161");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77161.e");
    test_class_info(&lv, &cd_ee77161);
    dp->~ee77161();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77161(Test_ee77161, "ee77161", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77161C1Ev();
extern void _ZN7ee77161D1Ev();
Name_Map name_map_ee77161[] = {
  NSPAIR(_ZN7ee77161C1Ev),
  NSPAIR(_ZN7ee77161D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc161;
extern VTBL_ENTRY _ZTI5cc161[];
extern  VTBL_ENTRY _ZTV5cc161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc161[];
extern Class_Descriptor cd_dd7161;
extern VTBL_ENTRY _ZTI6dd7161[];
extern  VTBL_ENTRY _ZTV6dd7161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7161[];
static Base_Class bases_ee77161[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc161,    ABISELECT(32,16), //bcp->offset
    15, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7161,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77161[];
extern void _ZN7ee771613fooEv();
extern void _ZN7ee771613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee771613barEv,_ZTv0_n20_N7ee771613barEv)();
extern void ABISELECT(_ZThn16_N7ee771613barEv,_ZThn8_N7ee771613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee771613fooEv,_ZTv0_n24_N7ee771613fooEv)();
extern void ABISELECT(_ZThn16_N7ee771613fooEv,_ZThn8_N7ee771613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee771613fooEv,_ZTv0_n12_N7ee771613fooEv)();
extern void ABISELECT(_ZThn48_N7ee771613fooEv,_ZThn24_N7ee771613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee771613barEv,_ZTv0_n16_N7ee771613barEv)();
extern void ABISELECT(_ZThn48_N7ee771613barEv,_ZThn24_N7ee771613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77161[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77161[0]),
  (VTBL_ENTRY)&_ZN7ee771613fooEv,
  (VTBL_ENTRY)&_ZN7ee771613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee771613barEv,_ZTv0_n20_N7ee771613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee771613fooEv,_ZTv0_n24_N7ee771613fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77161[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee771613fooEv,_ZTv0_n12_N7ee771613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee771613barEv,_ZTv0_n16_N7ee771613barEv),
};
extern VTBL_ENTRY _ZTV7ee77161[];
extern void _ZN6dd71613barEv();
extern void _ZN6dd71613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7161__7ee77161[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&_ZN6dd71613barEv,
  (VTBL_ENTRY)&_ZN6dd71613fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc161__6dd7161__7ee77161[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv)();
extern void ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv)();
extern void ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7161__7ee77161[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7161[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc161__7ee77161[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc161__7ee77161[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc161[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee77161[] = {
  {&(_ZTV7ee77161[5]),  5,24},
  {&(_ZTV7ee77161[13]),  13,24},
  {&(_ZTV7ee77161[18]),  18,24},
  {&(_ZTV7ee77161[22]),  22,24},
  {&(_tg__ZTV6dd7161__7ee77161[4]),  4,6},
  {&(_tg__ZTV5cc161__6dd7161__7ee77161[3]),  3,3},
  {&(_tg__ZTV4bb61__6dd7161__7ee77161[4]),  4,6},
  {&(_tg__ZTV5cc161__7ee77161[3]),  3,3},
  {&(_tg__ZTV4bb61__5cc161__7ee77161[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77161[];
extern  VTBL_ENTRY _ZTV7ee77161[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77161[];
static VTBL_ENTRY alt_thunk_names576[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71613barEv,_ZTv0_n16_N6dd71613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613barEv,_ZThn16_N6dd71613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71613fooEv,_ZTv0_n12_N6dd71613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71613fooEv,_ZThn16_N6dd71613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee771613barEv,_ZTv0_n16_N7ee771613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee771613barEv,_ZThn24_N7ee771613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee771613fooEv,_ZTv0_n12_N7ee771613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee771613fooEv,_ZThn24_N7ee771613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee771613fooEv,_ZTv0_n24_N7ee771613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee771613fooEv,_ZThn8_N7ee771613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee771613barEv,_ZTv0_n20_N7ee771613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee771613barEv,_ZThn8_N7ee771613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77161 = {  "ee77161", // class name
  bases_ee77161, 4,
  &(vtc_ee77161[0]), // expected_vtbl_contents
  &(vtt_ee77161[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77161),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77161),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77161),9, //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  cc261  : bb61 {
  int c;
  virtual void  foo(); // _ZN5cc2613fooEv
  ~cc261(); // tgen
  cc261(); // tgen
};
//SIG(-1 cc261) C1{ BC2{ BC3{ v1 Fi} v2 v1 Fi} v1 Fi}


void  cc261 ::foo(){vfunc_called(this, "_ZN5cc2613fooEv");}
cc261 ::~cc261(){ note_dtor("cc261", this);} // tgen
cc261 ::cc261(){ note_ctor("cc261", this);} // tgen

static void Test_cc261()
{
  extern Class_Descriptor cd_cc261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc261, buf);
    cc261 *dp, &lv = *(dp=new (buf) cc261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc261)");
    check_base_class_offset(lv, (aa1*)(bb61*), 0, "cc261");
    check_base_class_offset(lv, (bb61*), 0, "cc261");
    check_field_offset(lv, c, ABISELECT(16,12), "cc261.c");
    test_class_info(&lv, &cd_cc261);
    dp->~cc261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc261(Test_cc261, "cc261", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc261C1Ev();
extern void _ZN5cc261D1Ev();
Name_Map name_map_cc261[] = {
  NSPAIR(_ZN5cc261C1Ev),
  NSPAIR(_ZN5cc261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI5cc261[];
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_cc261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
Class_Descriptor cd_cc261 = {  "cc261", // class name
  bases_cc261, 2,
  &(vtc_cc261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc261),4, //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  dd0261  : cc261 {
  int d;
  ~dd0261(); // tgen
  dd0261(); // tgen
};
//SIG(-1 dd0261) C1{ BC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} Fi}


dd0261 ::~dd0261(){ note_dtor("dd0261", this);} // tgen
dd0261 ::dd0261(){ note_ctor("dd0261", this);} // tgen

static void Test_dd0261()
{
  extern Class_Descriptor cd_dd0261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0261, buf);
    dd0261 *dp, &lv = *(dp=new (buf) dd0261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), 0, "dd0261");
    check_base_class_offset(lv, (bb61*)(cc261*), 0, "dd0261");
    check_base_class_offset(lv, (cc261*), 0, "dd0261");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0261.d");
    test_class_info(&lv, &cd_dd0261);
    dp->~dd0261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0261(Test_dd0261, "dd0261", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0261C1Ev();
extern void _ZN6dd0261D1Ev();
Name_Map name_map_dd0261[] = {
  NSPAIR(_ZN6dd0261C1Ev),
  NSPAIR(_ZN6dd0261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd0261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0261[];
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd0261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
Class_Descriptor cd_dd0261 = {  "dd0261", // class name
  bases_dd0261, 3,
  &(vtc_dd0261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0261),4, //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  ee00261  : dd0261 {
  int e;
  ~ee00261(); // tgen
  ee00261(); // tgen
};
//SIG(1 ee00261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee00261 ::~ee00261(){ note_dtor("ee00261", this);} // tgen
ee00261 ::ee00261(){ note_ctor("ee00261", this);} // tgen

static void Test_ee00261()
{
  extern Class_Descriptor cd_ee00261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00261, buf);
    ee00261 *dp, &lv = *(dp=new (buf) ee00261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), 0, "ee00261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), 0, "ee00261");
    check_base_class_offset(lv, (cc261*)(dd0261*), 0, "ee00261");
    check_base_class_offset(lv, (dd0261*), 0, "ee00261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00261.e");
    test_class_info(&lv, &cd_ee00261);
    dp->~ee00261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00261(Test_ee00261, "ee00261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00261C1Ev();
extern void _ZN7ee00261D1Ev();
Name_Map name_map_ee00261[] = {
  NSPAIR(_ZN7ee00261C1Ev),
  NSPAIR(_ZN7ee00261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee00261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00261[];
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee00261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee00261[];
extern  VTBL_ENTRY _ZTV7ee00261[];
Class_Descriptor cd_ee00261 = {  "ee00261", // class name
  bases_ee00261, 4,
  &(vtc_ee00261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00261),4, //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  ee10261  : virtual dd0261 {
  int e;
  ~ee10261(); // tgen
  ee10261(); // tgen
};
//SIG(1 ee10261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee10261 ::~ee10261(){ note_dtor("ee10261", this);} // tgen
ee10261 ::ee10261(){ note_ctor("ee10261", this);} // tgen

static void Test_ee10261()
{
  extern Class_Descriptor cd_ee10261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10261, buf);
    ee10261 *dp, &lv = *(dp=new (buf) ee10261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee10261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee10261");
    check_base_class_offset(lv, (cc261*)(dd0261*), ABISELECT(16,8), "ee10261");
    check_base_class_offset(lv, (dd0261*), ABISELECT(16,8), "ee10261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10261.e");
    test_class_info(&lv, &cd_ee10261);
    dp->~ee10261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10261(Test_ee10261, "ee10261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10261C1Ev();
extern void _ZN7ee10261D1Ev();
Name_Map name_map_ee10261[] = {
  NSPAIR(_ZN7ee10261C1Ev),
  NSPAIR(_ZN7ee10261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee10261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10261[];
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee10261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10261[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee10261[];
static  VTT_ENTRY vtt_ee10261[] = {
  {&(_ZTV7ee10261[3]),  3,9},
  {&(_ZTV7ee10261[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10261[];
extern  VTBL_ENTRY _ZTV7ee10261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10261[];
Class_Descriptor cd_ee10261 = {  "ee10261", // class name
  bases_ee10261, 4,
  &(vtc_ee10261[0]), // expected_vtbl_contents
  &(vtt_ee10261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10261),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10261),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  ee20261  : dd0261 {
  int e;
  virtual void  foo(); // _ZN7ee202613fooEv
  ~ee20261(); // tgen
  ee20261(); // tgen
};
//SIG(1 ee20261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee20261 ::foo(){vfunc_called(this, "_ZN7ee202613fooEv");}
ee20261 ::~ee20261(){ note_dtor("ee20261", this);} // tgen
ee20261 ::ee20261(){ note_ctor("ee20261", this);} // tgen

static void Test_ee20261()
{
  extern Class_Descriptor cd_ee20261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20261, buf);
    ee20261 *dp, &lv = *(dp=new (buf) ee20261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), 0, "ee20261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), 0, "ee20261");
    check_base_class_offset(lv, (cc261*)(dd0261*), 0, "ee20261");
    check_base_class_offset(lv, (dd0261*), 0, "ee20261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20261.e");
    test_class_info(&lv, &cd_ee20261);
    dp->~ee20261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20261(Test_ee20261, "ee20261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20261C1Ev();
extern void _ZN7ee20261D1Ev();
Name_Map name_map_ee20261[] = {
  NSPAIR(_ZN7ee20261C1Ev),
  NSPAIR(_ZN7ee20261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee20261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20261[];
extern void _ZN7ee202613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee20261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20261[0]),
  (VTBL_ENTRY)&_ZN7ee202613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee20261[];
extern  VTBL_ENTRY _ZTV7ee20261[];
Class_Descriptor cd_ee20261 = {  "ee20261", // class name
  bases_ee20261, 4,
  &(vtc_ee20261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20261),4, //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  ee30261  : virtual dd0261 {
  int e;
  virtual void  foo(); // _ZN7ee302613fooEv
  ~ee30261(); // tgen
  ee30261(); // tgen
};
//SIG(1 ee30261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee30261 ::foo(){vfunc_called(this, "_ZN7ee302613fooEv");}
ee30261 ::~ee30261(){ note_dtor("ee30261", this);} // tgen
ee30261 ::ee30261(){ note_ctor("ee30261", this);} // tgen

static void Test_ee30261()
{
  extern Class_Descriptor cd_ee30261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30261, buf);
    ee30261 *dp, &lv = *(dp=new (buf) ee30261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee30261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee30261");
    check_base_class_offset(lv, (cc261*)(dd0261*), ABISELECT(16,8), "ee30261");
    check_base_class_offset(lv, (dd0261*), ABISELECT(16,8), "ee30261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30261.e");
    test_class_info(&lv, &cd_ee30261);
    dp->~ee30261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30261(Test_ee30261, "ee30261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30261C1Ev();
extern void _ZN7ee30261D1Ev();
Name_Map name_map_ee30261[] = {
  NSPAIR(_ZN7ee30261C1Ev),
  NSPAIR(_ZN7ee30261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee30261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30261[];
extern void _ZN7ee302613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee302613fooEv,_ZTv0_n12_N7ee302613fooEv)();
extern void ABISELECT(_ZThn16_N7ee302613fooEv,_ZThn8_N7ee302613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee30261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30261[0]),
  (VTBL_ENTRY)&_ZN7ee302613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee302613fooEv,_ZTv0_n12_N7ee302613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee30261[];
static  VTT_ENTRY vtt_ee30261[] = {
  {&(_ZTV7ee30261[3]),  3,10},
  {&(_ZTV7ee30261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30261[];
extern  VTBL_ENTRY _ZTV7ee30261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30261[];
static VTBL_ENTRY alt_thunk_names577[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee302613fooEv,_ZTv0_n12_N7ee302613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee302613fooEv,_ZThn8_N7ee302613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30261 = {  "ee30261", // class name
  bases_ee30261, 4,
  &(vtc_ee30261[0]), // expected_vtbl_contents
  &(vtt_ee30261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30261),2, //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  ee40261  : dd0261 {
  int e;
  virtual void  bar(); // _ZN7ee402613barEv
  ~ee40261(); // tgen
  ee40261(); // tgen
};
//SIG(1 ee40261) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee40261 ::bar(){vfunc_called(this, "_ZN7ee402613barEv");}
ee40261 ::~ee40261(){ note_dtor("ee40261", this);} // tgen
ee40261 ::ee40261(){ note_ctor("ee40261", this);} // tgen

static void Test_ee40261()
{
  extern Class_Descriptor cd_ee40261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40261, buf);
    ee40261 *dp, &lv = *(dp=new (buf) ee40261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), 0, "ee40261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), 0, "ee40261");
    check_base_class_offset(lv, (cc261*)(dd0261*), 0, "ee40261");
    check_base_class_offset(lv, (dd0261*), 0, "ee40261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40261.e");
    test_class_info(&lv, &cd_ee40261);
    dp->~ee40261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40261(Test_ee40261, "ee40261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40261C1Ev();
extern void _ZN7ee40261D1Ev();
Name_Map name_map_ee40261[] = {
  NSPAIR(_ZN7ee40261C1Ev),
  NSPAIR(_ZN7ee40261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee40261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40261[];
extern void _ZN5cc2613fooEv();
extern void _ZN7ee402613barEv();
static  VTBL_ENTRY vtc_ee40261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN7ee402613barEv,
};
extern VTBL_ENTRY _ZTI7ee40261[];
extern  VTBL_ENTRY _ZTV7ee40261[];
Class_Descriptor cd_ee40261 = {  "ee40261", // class name
  bases_ee40261, 4,
  &(vtc_ee40261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40261),4, //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  ee50261  : virtual dd0261 {
  int e;
  virtual void  bar(); // _ZN7ee502613barEv
  ~ee50261(); // tgen
  ee50261(); // tgen
};
//SIG(1 ee50261) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee50261 ::bar(){vfunc_called(this, "_ZN7ee502613barEv");}
ee50261 ::~ee50261(){ note_dtor("ee50261", this);} // tgen
ee50261 ::ee50261(){ note_ctor("ee50261", this);} // tgen

static void Test_ee50261()
{
  extern Class_Descriptor cd_ee50261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50261, buf);
    ee50261 *dp, &lv = *(dp=new (buf) ee50261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee50261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee50261");
    check_base_class_offset(lv, (cc261*)(dd0261*), ABISELECT(16,8), "ee50261");
    check_base_class_offset(lv, (dd0261*), ABISELECT(16,8), "ee50261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50261.e");
    test_class_info(&lv, &cd_ee50261);
    dp->~ee50261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50261(Test_ee50261, "ee50261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50261C1Ev();
extern void _ZN7ee50261D1Ev();
Name_Map name_map_ee50261[] = {
  NSPAIR(_ZN7ee50261C1Ev),
  NSPAIR(_ZN7ee50261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee50261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50261[];
extern void _ZN7ee502613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee502613barEv,_ZTv0_n16_N7ee502613barEv)();
extern void ABISELECT(_ZThn16_N7ee502613barEv,_ZThn8_N7ee502613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50261[0]),
  (VTBL_ENTRY)&_ZN7ee502613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee502613barEv,_ZTv0_n16_N7ee502613barEv),
};
extern VTBL_ENTRY _ZTV7ee50261[];
static  VTT_ENTRY vtt_ee50261[] = {
  {&(_ZTV7ee50261[3]),  3,10},
  {&(_ZTV7ee50261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50261[];
extern  VTBL_ENTRY _ZTV7ee50261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50261[];
static VTBL_ENTRY alt_thunk_names578[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee502613barEv,_ZTv0_n16_N7ee502613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee502613barEv,_ZThn8_N7ee502613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50261 = {  "ee50261", // class name
  bases_ee50261, 4,
  &(vtc_ee50261[0]), // expected_vtbl_contents
  &(vtt_ee50261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50261),2, //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  ee60261  : dd0261 {
  int e;
  virtual void  foo(); // _ZN7ee602613fooEv
  virtual void  bar(); // _ZN7ee602613barEv
  ~ee60261(); // tgen
  ee60261(); // tgen
};
//SIG(1 ee60261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee60261 ::foo(){vfunc_called(this, "_ZN7ee602613fooEv");}
void  ee60261 ::bar(){vfunc_called(this, "_ZN7ee602613barEv");}
ee60261 ::~ee60261(){ note_dtor("ee60261", this);} // tgen
ee60261 ::ee60261(){ note_ctor("ee60261", this);} // tgen

static void Test_ee60261()
{
  extern Class_Descriptor cd_ee60261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60261, buf);
    ee60261 *dp, &lv = *(dp=new (buf) ee60261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), 0, "ee60261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), 0, "ee60261");
    check_base_class_offset(lv, (cc261*)(dd0261*), 0, "ee60261");
    check_base_class_offset(lv, (dd0261*), 0, "ee60261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60261.e");
    test_class_info(&lv, &cd_ee60261);
    dp->~ee60261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60261(Test_ee60261, "ee60261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60261C1Ev();
extern void _ZN7ee60261D1Ev();
Name_Map name_map_ee60261[] = {
  NSPAIR(_ZN7ee60261C1Ev),
  NSPAIR(_ZN7ee60261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee60261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60261[];
extern void _ZN7ee602613fooEv();
extern void _ZN7ee602613barEv();
static  VTBL_ENTRY vtc_ee60261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60261[0]),
  (VTBL_ENTRY)&_ZN7ee602613fooEv,
  (VTBL_ENTRY)&_ZN7ee602613barEv,
};
extern VTBL_ENTRY _ZTI7ee60261[];
extern  VTBL_ENTRY _ZTV7ee60261[];
Class_Descriptor cd_ee60261 = {  "ee60261", // class name
  bases_ee60261, 4,
  &(vtc_ee60261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60261),4, //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  ee70261  : virtual dd0261 {
  int e;
  virtual void  foo(); // _ZN7ee702613fooEv
  virtual void  bar(); // _ZN7ee702613barEv
  ~ee70261(); // tgen
  ee70261(); // tgen
};
//SIG(1 ee70261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee70261 ::foo(){vfunc_called(this, "_ZN7ee702613fooEv");}
void  ee70261 ::bar(){vfunc_called(this, "_ZN7ee702613barEv");}
ee70261 ::~ee70261(){ note_dtor("ee70261", this);} // tgen
ee70261 ::ee70261(){ note_ctor("ee70261", this);} // tgen

static void Test_ee70261()
{
  extern Class_Descriptor cd_ee70261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70261, buf);
    ee70261 *dp, &lv = *(dp=new (buf) ee70261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee70261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd0261*), ABISELECT(16,8), "ee70261");
    check_base_class_offset(lv, (cc261*)(dd0261*), ABISELECT(16,8), "ee70261");
    check_base_class_offset(lv, (dd0261*), ABISELECT(16,8), "ee70261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70261.e");
    test_class_info(&lv, &cd_ee70261);
    dp->~ee70261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70261(Test_ee70261, "ee70261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70261C1Ev();
extern void _ZN7ee70261D1Ev();
Name_Map name_map_ee70261[] = {
  NSPAIR(_ZN7ee70261C1Ev),
  NSPAIR(_ZN7ee70261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd0261;
extern VTBL_ENTRY _ZTI6dd0261[];
extern  VTBL_ENTRY _ZTV6dd0261[];
static Base_Class bases_ee70261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0261,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70261[];
extern void _ZN7ee702613fooEv();
extern void _ZN7ee702613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee702613fooEv,_ZTv0_n12_N7ee702613fooEv)();
extern void ABISELECT(_ZThn16_N7ee702613fooEv,_ZThn8_N7ee702613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee702613barEv,_ZTv0_n16_N7ee702613barEv)();
extern void ABISELECT(_ZThn16_N7ee702613barEv,_ZThn8_N7ee702613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70261[0]),
  (VTBL_ENTRY)&_ZN7ee702613fooEv,
  (VTBL_ENTRY)&_ZN7ee702613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee702613fooEv,_ZTv0_n12_N7ee702613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee702613barEv,_ZTv0_n16_N7ee702613barEv),
};
extern VTBL_ENTRY _ZTV7ee70261[];
static  VTT_ENTRY vtt_ee70261[] = {
  {&(_ZTV7ee70261[3]),  3,11},
  {&(_ZTV7ee70261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70261[];
extern  VTBL_ENTRY _ZTV7ee70261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70261[];
static VTBL_ENTRY alt_thunk_names579[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee702613barEv,_ZTv0_n16_N7ee702613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee702613barEv,_ZThn8_N7ee702613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee702613fooEv,_ZTv0_n12_N7ee702613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee702613fooEv,_ZThn8_N7ee702613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70261 = {  "ee70261", // class name
  bases_ee70261, 4,
  &(vtc_ee70261[0]), // expected_vtbl_contents
  &(vtt_ee70261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70261),2, //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  dd1261  : virtual cc261 {
  int d;
  ~dd1261(); // tgen
  dd1261(); // tgen
};
//SIG(-1 dd1261) C1{ VBC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} Fi}


dd1261 ::~dd1261(){ note_dtor("dd1261", this);} // tgen
dd1261 ::dd1261(){ note_ctor("dd1261", this);} // tgen

static void Test_dd1261()
{
  extern Class_Descriptor cd_dd1261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1261, buf);
    dd1261 *dp, &lv = *(dp=new (buf) dd1261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,8), "dd1261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,8), "dd1261");
    check_base_class_offset(lv, (cc261*), ABISELECT(16,8), "dd1261");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1261.d");
    test_class_info(&lv, &cd_dd1261);
    dp->~dd1261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1261(Test_dd1261, "dd1261", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1261C1Ev();
extern void _ZN6dd1261D1Ev();
Name_Map name_map_dd1261[] = {
  NSPAIR(_ZN6dd1261C1Ev),
  NSPAIR(_ZN6dd1261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd1261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1261[];
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd1261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd1261[];
static  VTT_ENTRY vtt_dd1261[] = {
  {&(_ZTV6dd1261[3]),  3,9},
  {&(_ZTV6dd1261[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
Class_Descriptor cd_dd1261 = {  "dd1261", // class name
  bases_dd1261, 3,
  &(vtc_dd1261[0]), // expected_vtbl_contents
  &(vtt_dd1261[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1261),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1261),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  ee01261  : dd1261 {
  int e;
  ~ee01261(); // tgen
  ee01261(); // tgen
};
//SIG(1 ee01261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee01261 ::~ee01261(){ note_dtor("ee01261", this);} // tgen
ee01261 ::ee01261(){ note_ctor("ee01261", this);} // tgen

static void Test_ee01261()
{
  extern Class_Descriptor cd_ee01261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01261, buf);
    ee01261 *dp, &lv = *(dp=new (buf) ee01261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee01261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee01261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(16,12), "ee01261");
    check_base_class_offset(lv, (dd1261*), 0, "ee01261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01261.e");
    test_class_info(&lv, &cd_ee01261);
    dp->~ee01261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01261(Test_ee01261, "ee01261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01261C1Ev();
extern void _ZN7ee01261D1Ev();
Name_Map name_map_ee01261[] = {
  NSPAIR(_ZN7ee01261C1Ev),
  NSPAIR(_ZN7ee01261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee01261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01261[];
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee01261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01261[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee01261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee01261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee01261[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee01261[] = {
  {&(_ZTV7ee01261[3]),  3,9},
  {&(_tg__ZTV6dd1261__7ee01261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee01261[4]),  4,6},
  {&(_ZTV7ee01261[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01261[];
extern  VTBL_ENTRY _ZTV7ee01261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01261[];
Class_Descriptor cd_ee01261 = {  "ee01261", // class name
  bases_ee01261, 4,
  &(vtc_ee01261[0]), // expected_vtbl_contents
  &(vtt_ee01261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01261),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01261),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  ee11261  : virtual dd1261 {
  int e;
  ~ee11261(); // tgen
  ee11261(); // tgen
};
//SIG(1 ee11261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee11261 ::~ee11261(){ note_dtor("ee11261", this);} // tgen
ee11261 ::ee11261(){ note_ctor("ee11261", this);} // tgen

static void Test_ee11261()
{
  extern Class_Descriptor cd_ee11261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11261, buf);
    ee11261 *dp, &lv = *(dp=new (buf) ee11261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee11261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee11261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(32,16), "ee11261");
    check_base_class_offset(lv, (dd1261*), ABISELECT(16,8), "ee11261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11261.e");
    test_class_info(&lv, &cd_ee11261);
    dp->~ee11261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11261(Test_ee11261, "ee11261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11261C1Ev();
extern void _ZN7ee11261D1Ev();
Name_Map name_map_ee11261[] = {
  NSPAIR(_ZN7ee11261C1Ev),
  NSPAIR(_ZN7ee11261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee11261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11261[];
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee11261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11261[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11261[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee11261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee11261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee11261[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee11261[] = {
  {&(_ZTV7ee11261[4]),  4,13},
  {&(_ZTV7ee11261[7]),  7,13},
  {&(_ZTV7ee11261[11]),  11,13},
  {&(_tg__ZTV6dd1261__7ee11261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee11261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11261[];
extern  VTBL_ENTRY _ZTV7ee11261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11261[];
Class_Descriptor cd_ee11261 = {  "ee11261", // class name
  bases_ee11261, 4,
  &(vtc_ee11261[0]), // expected_vtbl_contents
  &(vtt_ee11261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11261),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11261),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  ee21261  : dd1261 {
  int e;
  virtual void  foo(); // _ZN7ee212613fooEv
  ~ee21261(); // tgen
  ee21261(); // tgen
};
//SIG(1 ee21261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee21261 ::foo(){vfunc_called(this, "_ZN7ee212613fooEv");}
ee21261 ::~ee21261(){ note_dtor("ee21261", this);} // tgen
ee21261 ::ee21261(){ note_ctor("ee21261", this);} // tgen

static void Test_ee21261()
{
  extern Class_Descriptor cd_ee21261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21261, buf);
    ee21261 *dp, &lv = *(dp=new (buf) ee21261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee21261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee21261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(16,12), "ee21261");
    check_base_class_offset(lv, (dd1261*), 0, "ee21261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21261.e");
    test_class_info(&lv, &cd_ee21261);
    dp->~ee21261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21261(Test_ee21261, "ee21261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21261C1Ev();
extern void _ZN7ee21261D1Ev();
Name_Map name_map_ee21261[] = {
  NSPAIR(_ZN7ee21261C1Ev),
  NSPAIR(_ZN7ee21261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee21261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21261[];
extern void _ZN7ee212613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee212613fooEv,_ZTv0_n12_N7ee212613fooEv)();
extern void ABISELECT(_ZThn16_N7ee212613fooEv,_ZThn12_N7ee212613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee21261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21261[0]),
  (VTBL_ENTRY)&_ZN7ee212613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee212613fooEv,_ZTv0_n12_N7ee212613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee21261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee21261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee21261[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee21261[] = {
  {&(_ZTV7ee21261[3]),  3,10},
  {&(_tg__ZTV6dd1261__7ee21261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee21261[4]),  4,6},
  {&(_ZTV7ee21261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21261[];
extern  VTBL_ENTRY _ZTV7ee21261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21261[];
static VTBL_ENTRY alt_thunk_names580[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee212613fooEv,_ZTv0_n12_N7ee212613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee212613fooEv,_ZThn12_N7ee212613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21261 = {  "ee21261", // class name
  bases_ee21261, 4,
  &(vtc_ee21261[0]), // expected_vtbl_contents
  &(vtt_ee21261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names580,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31261  : virtual dd1261 {
  int e;
  virtual void  foo(); // _ZN7ee312613fooEv
  ~ee31261(); // tgen
  ee31261(); // tgen
};
//SIG(1 ee31261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee31261 ::foo(){vfunc_called(this, "_ZN7ee312613fooEv");}
ee31261 ::~ee31261(){ note_dtor("ee31261", this);} // tgen
ee31261 ::ee31261(){ note_ctor("ee31261", this);} // tgen

static void Test_ee31261()
{
  extern Class_Descriptor cd_ee31261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31261, buf);
    ee31261 *dp, &lv = *(dp=new (buf) ee31261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee31261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee31261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(32,16), "ee31261");
    check_base_class_offset(lv, (dd1261*), ABISELECT(16,8), "ee31261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31261.e");
    test_class_info(&lv, &cd_ee31261);
    dp->~ee31261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31261(Test_ee31261, "ee31261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31261C1Ev();
extern void _ZN7ee31261D1Ev();
Name_Map name_map_ee31261[] = {
  NSPAIR(_ZN7ee31261C1Ev),
  NSPAIR(_ZN7ee31261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee31261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31261[];
extern void _ZN7ee312613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee312613fooEv,_ZTv0_n12_N7ee312613fooEv)();
extern void ABISELECT(_ZThn32_N7ee312613fooEv,_ZThn16_N7ee312613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee31261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31261[0]),
  (VTBL_ENTRY)&_ZN7ee312613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31261[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee312613fooEv,_ZTv0_n12_N7ee312613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee31261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee31261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee31261[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee31261[] = {
  {&(_ZTV7ee31261[4]),  4,14},
  {&(_ZTV7ee31261[8]),  8,14},
  {&(_ZTV7ee31261[12]),  12,14},
  {&(_tg__ZTV6dd1261__7ee31261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee31261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31261[];
extern  VTBL_ENTRY _ZTV7ee31261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31261[];
static VTBL_ENTRY alt_thunk_names581[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee312613fooEv,_ZTv0_n12_N7ee312613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee312613fooEv,_ZThn16_N7ee312613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31261 = {  "ee31261", // class name
  bases_ee31261, 4,
  &(vtc_ee31261[0]), // expected_vtbl_contents
  &(vtt_ee31261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31261),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names581,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41261  : dd1261 {
  int e;
  virtual void  bar(); // _ZN7ee412613barEv
  ~ee41261(); // tgen
  ee41261(); // tgen
};
//SIG(1 ee41261) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee41261 ::bar(){vfunc_called(this, "_ZN7ee412613barEv");}
ee41261 ::~ee41261(){ note_dtor("ee41261", this);} // tgen
ee41261 ::ee41261(){ note_ctor("ee41261", this);} // tgen

static void Test_ee41261()
{
  extern Class_Descriptor cd_ee41261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41261, buf);
    ee41261 *dp, &lv = *(dp=new (buf) ee41261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee41261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee41261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(16,12), "ee41261");
    check_base_class_offset(lv, (dd1261*), 0, "ee41261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41261.e");
    test_class_info(&lv, &cd_ee41261);
    dp->~ee41261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41261(Test_ee41261, "ee41261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41261C1Ev();
extern void _ZN7ee41261D1Ev();
Name_Map name_map_ee41261[] = {
  NSPAIR(_ZN7ee41261C1Ev),
  NSPAIR(_ZN7ee41261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee41261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41261[];
extern void _ZN7ee412613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee412613barEv,_ZTv0_n16_N7ee412613barEv)();
extern void ABISELECT(_ZThn16_N7ee412613barEv,_ZThn12_N7ee412613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41261[0]),
  (VTBL_ENTRY)&_ZN7ee412613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee412613barEv,_ZTv0_n16_N7ee412613barEv),
};
extern VTBL_ENTRY _ZTV7ee41261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee41261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee41261[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee41261[] = {
  {&(_ZTV7ee41261[3]),  3,10},
  {&(_tg__ZTV6dd1261__7ee41261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee41261[4]),  4,6},
  {&(_ZTV7ee41261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41261[];
extern  VTBL_ENTRY _ZTV7ee41261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41261[];
static VTBL_ENTRY alt_thunk_names582[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee412613barEv,_ZTv0_n16_N7ee412613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee412613barEv,_ZThn12_N7ee412613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41261 = {  "ee41261", // class name
  bases_ee41261, 4,
  &(vtc_ee41261[0]), // expected_vtbl_contents
  &(vtt_ee41261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names582,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51261  : virtual dd1261 {
  int e;
  virtual void  bar(); // _ZN7ee512613barEv
  ~ee51261(); // tgen
  ee51261(); // tgen
};
//SIG(1 ee51261) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee51261 ::bar(){vfunc_called(this, "_ZN7ee512613barEv");}
ee51261 ::~ee51261(){ note_dtor("ee51261", this);} // tgen
ee51261 ::ee51261(){ note_ctor("ee51261", this);} // tgen

static void Test_ee51261()
{
  extern Class_Descriptor cd_ee51261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51261, buf);
    ee51261 *dp, &lv = *(dp=new (buf) ee51261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee51261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee51261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(32,16), "ee51261");
    check_base_class_offset(lv, (dd1261*), ABISELECT(16,8), "ee51261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51261.e");
    test_class_info(&lv, &cd_ee51261);
    dp->~ee51261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51261(Test_ee51261, "ee51261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51261C1Ev();
extern void _ZN7ee51261D1Ev();
Name_Map name_map_ee51261[] = {
  NSPAIR(_ZN7ee51261C1Ev),
  NSPAIR(_ZN7ee51261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee51261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51261[];
extern void _ZN7ee512613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee512613barEv,_ZTv0_n16_N7ee512613barEv)();
extern void ABISELECT(_ZThn32_N7ee512613barEv,_ZThn16_N7ee512613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51261[0]),
  (VTBL_ENTRY)&_ZN7ee512613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51261[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee512613barEv,_ZTv0_n16_N7ee512613barEv),
};
extern VTBL_ENTRY _ZTV7ee51261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee51261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee51261[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee51261[] = {
  {&(_ZTV7ee51261[4]),  4,14},
  {&(_ZTV7ee51261[8]),  8,14},
  {&(_ZTV7ee51261[12]),  12,14},
  {&(_tg__ZTV6dd1261__7ee51261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee51261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51261[];
extern  VTBL_ENTRY _ZTV7ee51261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51261[];
static VTBL_ENTRY alt_thunk_names583[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee512613barEv,_ZTv0_n16_N7ee512613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee512613barEv,_ZThn16_N7ee512613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51261 = {  "ee51261", // class name
  bases_ee51261, 4,
  &(vtc_ee51261[0]), // expected_vtbl_contents
  &(vtt_ee51261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51261),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names583,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61261  : dd1261 {
  int e;
  virtual void  foo(); // _ZN7ee612613fooEv
  virtual void  bar(); // _ZN7ee612613barEv
  ~ee61261(); // tgen
  ee61261(); // tgen
};
//SIG(1 ee61261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee61261 ::foo(){vfunc_called(this, "_ZN7ee612613fooEv");}
void  ee61261 ::bar(){vfunc_called(this, "_ZN7ee612613barEv");}
ee61261 ::~ee61261(){ note_dtor("ee61261", this);} // tgen
ee61261 ::ee61261(){ note_ctor("ee61261", this);} // tgen

static void Test_ee61261()
{
  extern Class_Descriptor cd_ee61261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61261, buf);
    ee61261 *dp, &lv = *(dp=new (buf) ee61261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee61261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee61261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(16,12), "ee61261");
    check_base_class_offset(lv, (dd1261*), 0, "ee61261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61261.e");
    test_class_info(&lv, &cd_ee61261);
    dp->~ee61261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61261(Test_ee61261, "ee61261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61261C1Ev();
extern void _ZN7ee61261D1Ev();
Name_Map name_map_ee61261[] = {
  NSPAIR(_ZN7ee61261C1Ev),
  NSPAIR(_ZN7ee61261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee61261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61261[];
extern void _ZN7ee612613fooEv();
extern void _ZN7ee612613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee612613fooEv,_ZTv0_n12_N7ee612613fooEv)();
extern void ABISELECT(_ZThn16_N7ee612613fooEv,_ZThn12_N7ee612613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee612613barEv,_ZTv0_n16_N7ee612613barEv)();
extern void ABISELECT(_ZThn16_N7ee612613barEv,_ZThn12_N7ee612613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61261[0]),
  (VTBL_ENTRY)&_ZN7ee612613fooEv,
  (VTBL_ENTRY)&_ZN7ee612613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee612613fooEv,_ZTv0_n12_N7ee612613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee612613barEv,_ZTv0_n16_N7ee612613barEv),
};
extern VTBL_ENTRY _ZTV7ee61261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee61261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee61261[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee61261[] = {
  {&(_ZTV7ee61261[3]),  3,11},
  {&(_tg__ZTV6dd1261__7ee61261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee61261[4]),  4,6},
  {&(_ZTV7ee61261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61261[];
extern  VTBL_ENTRY _ZTV7ee61261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61261[];
static VTBL_ENTRY alt_thunk_names584[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee612613barEv,_ZTv0_n16_N7ee612613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee612613barEv,_ZThn12_N7ee612613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee612613fooEv,_ZTv0_n12_N7ee612613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee612613fooEv,_ZThn12_N7ee612613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61261 = {  "ee61261", // class name
  bases_ee61261, 4,
  &(vtc_ee61261[0]), // expected_vtbl_contents
  &(vtt_ee61261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names584,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71261  : virtual dd1261 {
  int e;
  virtual void  foo(); // _ZN7ee712613fooEv
  virtual void  bar(); // _ZN7ee712613barEv
  ~ee71261(); // tgen
  ee71261(); // tgen
};
//SIG(1 ee71261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee71261 ::foo(){vfunc_called(this, "_ZN7ee712613fooEv");}
void  ee71261 ::bar(){vfunc_called(this, "_ZN7ee712613barEv");}
ee71261 ::~ee71261(){ note_dtor("ee71261", this);} // tgen
ee71261 ::ee71261(){ note_ctor("ee71261", this);} // tgen

static void Test_ee71261()
{
  extern Class_Descriptor cd_ee71261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71261, buf);
    ee71261 *dp, &lv = *(dp=new (buf) ee71261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee71261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee71261");
    check_base_class_offset(lv, (cc261*)(dd1261*), ABISELECT(32,16), "ee71261");
    check_base_class_offset(lv, (dd1261*), ABISELECT(16,8), "ee71261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71261.e");
    test_class_info(&lv, &cd_ee71261);
    dp->~ee71261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71261(Test_ee71261, "ee71261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71261C1Ev();
extern void _ZN7ee71261D1Ev();
Name_Map name_map_ee71261[] = {
  NSPAIR(_ZN7ee71261C1Ev),
  NSPAIR(_ZN7ee71261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd1261;
extern VTBL_ENTRY _ZTI6dd1261[];
extern  VTBL_ENTRY _ZTV6dd1261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1261[];
static Base_Class bases_ee71261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1261,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71261[];
extern void _ZN7ee712613fooEv();
extern void _ZN7ee712613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee712613fooEv,_ZTv0_n12_N7ee712613fooEv)();
extern void ABISELECT(_ZThn32_N7ee712613fooEv,_ZThn16_N7ee712613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee712613barEv,_ZTv0_n16_N7ee712613barEv)();
extern void ABISELECT(_ZThn32_N7ee712613barEv,_ZThn16_N7ee712613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71261[0]),
  (VTBL_ENTRY)&_ZN7ee712613fooEv,
  (VTBL_ENTRY)&_ZN7ee712613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71261[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee712613fooEv,_ZTv0_n12_N7ee712613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee712613barEv,_ZTv0_n16_N7ee712613barEv),
};
extern VTBL_ENTRY _ZTV7ee71261[];
static  VTBL_ENTRY _tg__ZTV6dd1261__7ee71261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
};
extern void _ZN5cc2613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd1261__7ee71261[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee71261[] = {
  {&(_ZTV7ee71261[4]),  4,15},
  {&(_ZTV7ee71261[9]),  9,15},
  {&(_ZTV7ee71261[13]),  13,15},
  {&(_tg__ZTV6dd1261__7ee71261[3]),  3,3},
  {&(_tg__ZTV5cc261__6dd1261__7ee71261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71261[];
extern  VTBL_ENTRY _ZTV7ee71261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71261[];
static VTBL_ENTRY alt_thunk_names585[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee712613barEv,_ZTv0_n16_N7ee712613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee712613barEv,_ZThn16_N7ee712613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee712613fooEv,_ZTv0_n12_N7ee712613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee712613fooEv,_ZThn16_N7ee712613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71261 = {  "ee71261", // class name
  bases_ee71261, 4,
  &(vtc_ee71261[0]), // expected_vtbl_contents
  &(vtt_ee71261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71261),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71261),5, //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  dd2261  : cc261 {
  int d;
  virtual void  foo(); // _ZN6dd22613fooEv
  ~dd2261(); // tgen
  dd2261(); // tgen
};
//SIG(-1 dd2261) C1{ BC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd2261 ::foo(){vfunc_called(this, "_ZN6dd22613fooEv");}
dd2261 ::~dd2261(){ note_dtor("dd2261", this);} // tgen
dd2261 ::dd2261(){ note_ctor("dd2261", this);} // tgen

static void Test_dd2261()
{
  extern Class_Descriptor cd_dd2261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2261, buf);
    dd2261 *dp, &lv = *(dp=new (buf) dd2261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), 0, "dd2261");
    check_base_class_offset(lv, (bb61*)(cc261*), 0, "dd2261");
    check_base_class_offset(lv, (cc261*), 0, "dd2261");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2261.d");
    test_class_info(&lv, &cd_dd2261);
    dp->~dd2261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2261(Test_dd2261, "dd2261", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2261C1Ev();
extern void _ZN6dd2261D1Ev();
Name_Map name_map_dd2261[] = {
  NSPAIR(_ZN6dd2261C1Ev),
  NSPAIR(_ZN6dd2261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd2261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2261[];
extern void _ZN6dd22613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd2261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2261[0]),
  (VTBL_ENTRY)&_ZN6dd22613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
Class_Descriptor cd_dd2261 = {  "dd2261", // class name
  bases_dd2261, 3,
  &(vtc_dd2261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2261),4, //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  ee02261  : dd2261 {
  int e;
  ~ee02261(); // tgen
  ee02261(); // tgen
};
//SIG(1 ee02261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee02261 ::~ee02261(){ note_dtor("ee02261", this);} // tgen
ee02261 ::ee02261(){ note_ctor("ee02261", this);} // tgen

static void Test_ee02261()
{
  extern Class_Descriptor cd_ee02261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02261, buf);
    ee02261 *dp, &lv = *(dp=new (buf) ee02261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), 0, "ee02261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), 0, "ee02261");
    check_base_class_offset(lv, (cc261*)(dd2261*), 0, "ee02261");
    check_base_class_offset(lv, (dd2261*), 0, "ee02261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02261.e");
    test_class_info(&lv, &cd_ee02261);
    dp->~ee02261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02261(Test_ee02261, "ee02261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02261C1Ev();
extern void _ZN7ee02261D1Ev();
Name_Map name_map_ee02261[] = {
  NSPAIR(_ZN7ee02261C1Ev),
  NSPAIR(_ZN7ee02261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee02261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02261[];
extern void _ZN6dd22613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee02261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02261[0]),
  (VTBL_ENTRY)&_ZN6dd22613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee02261[];
extern  VTBL_ENTRY _ZTV7ee02261[];
Class_Descriptor cd_ee02261 = {  "ee02261", // class name
  bases_ee02261, 4,
  &(vtc_ee02261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02261),4, //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  ee12261  : virtual dd2261 {
  int e;
  ~ee12261(); // tgen
  ee12261(); // tgen
};
//SIG(1 ee12261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee12261 ::~ee12261(){ note_dtor("ee12261", this);} // tgen
ee12261 ::ee12261(){ note_ctor("ee12261", this);} // tgen

static void Test_ee12261()
{
  extern Class_Descriptor cd_ee12261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12261, buf);
    ee12261 *dp, &lv = *(dp=new (buf) ee12261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee12261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee12261");
    check_base_class_offset(lv, (cc261*)(dd2261*), ABISELECT(16,8), "ee12261");
    check_base_class_offset(lv, (dd2261*), ABISELECT(16,8), "ee12261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12261.e");
    test_class_info(&lv, &cd_ee12261);
    dp->~ee12261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12261(Test_ee12261, "ee12261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12261C1Ev();
extern void _ZN7ee12261D1Ev();
Name_Map name_map_ee12261[] = {
  NSPAIR(_ZN7ee12261C1Ev),
  NSPAIR(_ZN7ee12261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee12261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12261[];
extern void _ZN6dd22613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee12261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12261[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12261[0]),
  (VTBL_ENTRY)&_ZN6dd22613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee12261[];
static  VTT_ENTRY vtt_ee12261[] = {
  {&(_ZTV7ee12261[3]),  3,9},
  {&(_ZTV7ee12261[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12261[];
extern  VTBL_ENTRY _ZTV7ee12261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12261[];
Class_Descriptor cd_ee12261 = {  "ee12261", // class name
  bases_ee12261, 4,
  &(vtc_ee12261[0]), // expected_vtbl_contents
  &(vtt_ee12261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12261),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12261),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  ee22261  : dd2261 {
  int e;
  virtual void  foo(); // _ZN7ee222613fooEv
  ~ee22261(); // tgen
  ee22261(); // tgen
};
//SIG(1 ee22261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee22261 ::foo(){vfunc_called(this, "_ZN7ee222613fooEv");}
ee22261 ::~ee22261(){ note_dtor("ee22261", this);} // tgen
ee22261 ::ee22261(){ note_ctor("ee22261", this);} // tgen

static void Test_ee22261()
{
  extern Class_Descriptor cd_ee22261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22261, buf);
    ee22261 *dp, &lv = *(dp=new (buf) ee22261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), 0, "ee22261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), 0, "ee22261");
    check_base_class_offset(lv, (cc261*)(dd2261*), 0, "ee22261");
    check_base_class_offset(lv, (dd2261*), 0, "ee22261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22261.e");
    test_class_info(&lv, &cd_ee22261);
    dp->~ee22261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22261(Test_ee22261, "ee22261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22261C1Ev();
extern void _ZN7ee22261D1Ev();
Name_Map name_map_ee22261[] = {
  NSPAIR(_ZN7ee22261C1Ev),
  NSPAIR(_ZN7ee22261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee22261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22261[];
extern void _ZN7ee222613fooEv();
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee22261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22261[0]),
  (VTBL_ENTRY)&_ZN7ee222613fooEv,
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTI7ee22261[];
extern  VTBL_ENTRY _ZTV7ee22261[];
Class_Descriptor cd_ee22261 = {  "ee22261", // class name
  bases_ee22261, 4,
  &(vtc_ee22261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22261),4, //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  ee32261  : virtual dd2261 {
  int e;
  virtual void  foo(); // _ZN7ee322613fooEv
  ~ee32261(); // tgen
  ee32261(); // tgen
};
//SIG(1 ee32261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee32261 ::foo(){vfunc_called(this, "_ZN7ee322613fooEv");}
ee32261 ::~ee32261(){ note_dtor("ee32261", this);} // tgen
ee32261 ::ee32261(){ note_ctor("ee32261", this);} // tgen

static void Test_ee32261()
{
  extern Class_Descriptor cd_ee32261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32261, buf);
    ee32261 *dp, &lv = *(dp=new (buf) ee32261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee32261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee32261");
    check_base_class_offset(lv, (cc261*)(dd2261*), ABISELECT(16,8), "ee32261");
    check_base_class_offset(lv, (dd2261*), ABISELECT(16,8), "ee32261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32261.e");
    test_class_info(&lv, &cd_ee32261);
    dp->~ee32261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32261(Test_ee32261, "ee32261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32261C1Ev();
extern void _ZN7ee32261D1Ev();
Name_Map name_map_ee32261[] = {
  NSPAIR(_ZN7ee32261C1Ev),
  NSPAIR(_ZN7ee32261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee32261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32261[];
extern void _ZN7ee322613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee322613fooEv,_ZTv0_n12_N7ee322613fooEv)();
extern void ABISELECT(_ZThn16_N7ee322613fooEv,_ZThn8_N7ee322613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee32261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32261[0]),
  (VTBL_ENTRY)&_ZN7ee322613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee322613fooEv,_ZTv0_n12_N7ee322613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee32261[];
static  VTT_ENTRY vtt_ee32261[] = {
  {&(_ZTV7ee32261[3]),  3,10},
  {&(_ZTV7ee32261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32261[];
extern  VTBL_ENTRY _ZTV7ee32261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32261[];
static VTBL_ENTRY alt_thunk_names586[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee322613fooEv,_ZTv0_n12_N7ee322613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee322613fooEv,_ZThn8_N7ee322613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32261 = {  "ee32261", // class name
  bases_ee32261, 4,
  &(vtc_ee32261[0]), // expected_vtbl_contents
  &(vtt_ee32261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32261),2, //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  ee42261  : dd2261 {
  int e;
  virtual void  bar(); // _ZN7ee422613barEv
  ~ee42261(); // tgen
  ee42261(); // tgen
};
//SIG(1 ee42261) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee42261 ::bar(){vfunc_called(this, "_ZN7ee422613barEv");}
ee42261 ::~ee42261(){ note_dtor("ee42261", this);} // tgen
ee42261 ::ee42261(){ note_ctor("ee42261", this);} // tgen

static void Test_ee42261()
{
  extern Class_Descriptor cd_ee42261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42261, buf);
    ee42261 *dp, &lv = *(dp=new (buf) ee42261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), 0, "ee42261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), 0, "ee42261");
    check_base_class_offset(lv, (cc261*)(dd2261*), 0, "ee42261");
    check_base_class_offset(lv, (dd2261*), 0, "ee42261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42261.e");
    test_class_info(&lv, &cd_ee42261);
    dp->~ee42261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42261(Test_ee42261, "ee42261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42261C1Ev();
extern void _ZN7ee42261D1Ev();
Name_Map name_map_ee42261[] = {
  NSPAIR(_ZN7ee42261C1Ev),
  NSPAIR(_ZN7ee42261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee42261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42261[];
extern void _ZN6dd22613fooEv();
extern void _ZN7ee422613barEv();
static  VTBL_ENTRY vtc_ee42261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42261[0]),
  (VTBL_ENTRY)&_ZN6dd22613fooEv,
  (VTBL_ENTRY)&_ZN7ee422613barEv,
};
extern VTBL_ENTRY _ZTI7ee42261[];
extern  VTBL_ENTRY _ZTV7ee42261[];
Class_Descriptor cd_ee42261 = {  "ee42261", // class name
  bases_ee42261, 4,
  &(vtc_ee42261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42261),4, //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  ee52261  : virtual dd2261 {
  int e;
  virtual void  bar(); // _ZN7ee522613barEv
  ~ee52261(); // tgen
  ee52261(); // tgen
};
//SIG(1 ee52261) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee52261 ::bar(){vfunc_called(this, "_ZN7ee522613barEv");}
ee52261 ::~ee52261(){ note_dtor("ee52261", this);} // tgen
ee52261 ::ee52261(){ note_ctor("ee52261", this);} // tgen

static void Test_ee52261()
{
  extern Class_Descriptor cd_ee52261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52261, buf);
    ee52261 *dp, &lv = *(dp=new (buf) ee52261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee52261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee52261");
    check_base_class_offset(lv, (cc261*)(dd2261*), ABISELECT(16,8), "ee52261");
    check_base_class_offset(lv, (dd2261*), ABISELECT(16,8), "ee52261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52261.e");
    test_class_info(&lv, &cd_ee52261);
    dp->~ee52261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52261(Test_ee52261, "ee52261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52261C1Ev();
extern void _ZN7ee52261D1Ev();
Name_Map name_map_ee52261[] = {
  NSPAIR(_ZN7ee52261C1Ev),
  NSPAIR(_ZN7ee52261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee52261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52261[];
extern void _ZN7ee522613barEv();
extern void _ZN6dd22613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee522613barEv,_ZTv0_n16_N7ee522613barEv)();
extern void ABISELECT(_ZThn16_N7ee522613barEv,_ZThn8_N7ee522613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52261[0]),
  (VTBL_ENTRY)&_ZN7ee522613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52261[0]),
  (VTBL_ENTRY)&_ZN6dd22613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee522613barEv,_ZTv0_n16_N7ee522613barEv),
};
extern VTBL_ENTRY _ZTV7ee52261[];
static  VTT_ENTRY vtt_ee52261[] = {
  {&(_ZTV7ee52261[3]),  3,10},
  {&(_ZTV7ee52261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52261[];
extern  VTBL_ENTRY _ZTV7ee52261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52261[];
static VTBL_ENTRY alt_thunk_names587[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee522613barEv,_ZTv0_n16_N7ee522613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee522613barEv,_ZThn8_N7ee522613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52261 = {  "ee52261", // class name
  bases_ee52261, 4,
  &(vtc_ee52261[0]), // expected_vtbl_contents
  &(vtt_ee52261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52261),2, //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  ee62261  : dd2261 {
  int e;
  virtual void  foo(); // _ZN7ee622613fooEv
  virtual void  bar(); // _ZN7ee622613barEv
  ~ee62261(); // tgen
  ee62261(); // tgen
};
//SIG(1 ee62261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee62261 ::foo(){vfunc_called(this, "_ZN7ee622613fooEv");}
void  ee62261 ::bar(){vfunc_called(this, "_ZN7ee622613barEv");}
ee62261 ::~ee62261(){ note_dtor("ee62261", this);} // tgen
ee62261 ::ee62261(){ note_ctor("ee62261", this);} // tgen

static void Test_ee62261()
{
  extern Class_Descriptor cd_ee62261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62261, buf);
    ee62261 *dp, &lv = *(dp=new (buf) ee62261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), 0, "ee62261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), 0, "ee62261");
    check_base_class_offset(lv, (cc261*)(dd2261*), 0, "ee62261");
    check_base_class_offset(lv, (dd2261*), 0, "ee62261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62261.e");
    test_class_info(&lv, &cd_ee62261);
    dp->~ee62261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62261(Test_ee62261, "ee62261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62261C1Ev();
extern void _ZN7ee62261D1Ev();
Name_Map name_map_ee62261[] = {
  NSPAIR(_ZN7ee62261C1Ev),
  NSPAIR(_ZN7ee62261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee62261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62261[];
extern void _ZN7ee622613fooEv();
extern void _ZN7ee622613barEv();
static  VTBL_ENTRY vtc_ee62261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62261[0]),
  (VTBL_ENTRY)&_ZN7ee622613fooEv,
  (VTBL_ENTRY)&_ZN7ee622613barEv,
};
extern VTBL_ENTRY _ZTI7ee62261[];
extern  VTBL_ENTRY _ZTV7ee62261[];
Class_Descriptor cd_ee62261 = {  "ee62261", // class name
  bases_ee62261, 4,
  &(vtc_ee62261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62261),4, //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  ee72261  : virtual dd2261 {
  int e;
  virtual void  foo(); // _ZN7ee722613fooEv
  virtual void  bar(); // _ZN7ee722613barEv
  ~ee72261(); // tgen
  ee72261(); // tgen
};
//SIG(1 ee72261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee72261 ::foo(){vfunc_called(this, "_ZN7ee722613fooEv");}
void  ee72261 ::bar(){vfunc_called(this, "_ZN7ee722613barEv");}
ee72261 ::~ee72261(){ note_dtor("ee72261", this);} // tgen
ee72261 ::ee72261(){ note_ctor("ee72261", this);} // tgen

static void Test_ee72261()
{
  extern Class_Descriptor cd_ee72261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72261, buf);
    ee72261 *dp, &lv = *(dp=new (buf) ee72261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee72261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd2261*), ABISELECT(16,8), "ee72261");
    check_base_class_offset(lv, (cc261*)(dd2261*), ABISELECT(16,8), "ee72261");
    check_base_class_offset(lv, (dd2261*), ABISELECT(16,8), "ee72261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72261.e");
    test_class_info(&lv, &cd_ee72261);
    dp->~ee72261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72261(Test_ee72261, "ee72261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72261C1Ev();
extern void _ZN7ee72261D1Ev();
Name_Map name_map_ee72261[] = {
  NSPAIR(_ZN7ee72261C1Ev),
  NSPAIR(_ZN7ee72261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd2261;
extern VTBL_ENTRY _ZTI6dd2261[];
extern  VTBL_ENTRY _ZTV6dd2261[];
static Base_Class bases_ee72261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2261,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72261[];
extern void _ZN7ee722613fooEv();
extern void _ZN7ee722613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee722613fooEv,_ZTv0_n12_N7ee722613fooEv)();
extern void ABISELECT(_ZThn16_N7ee722613fooEv,_ZThn8_N7ee722613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee722613barEv,_ZTv0_n16_N7ee722613barEv)();
extern void ABISELECT(_ZThn16_N7ee722613barEv,_ZThn8_N7ee722613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72261[0]),
  (VTBL_ENTRY)&_ZN7ee722613fooEv,
  (VTBL_ENTRY)&_ZN7ee722613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee722613fooEv,_ZTv0_n12_N7ee722613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee722613barEv,_ZTv0_n16_N7ee722613barEv),
};
extern VTBL_ENTRY _ZTV7ee72261[];
static  VTT_ENTRY vtt_ee72261[] = {
  {&(_ZTV7ee72261[3]),  3,11},
  {&(_ZTV7ee72261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72261[];
extern  VTBL_ENTRY _ZTV7ee72261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72261[];
static VTBL_ENTRY alt_thunk_names588[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee722613barEv,_ZTv0_n16_N7ee722613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee722613barEv,_ZThn8_N7ee722613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee722613fooEv,_ZTv0_n12_N7ee722613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee722613fooEv,_ZThn8_N7ee722613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72261 = {  "ee72261", // class name
  bases_ee72261, 4,
  &(vtc_ee72261[0]), // expected_vtbl_contents
  &(vtt_ee72261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72261),2, //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  dd3261  : virtual cc261 {
  int d;
  virtual void  foo(); // _ZN6dd32613fooEv
  ~dd3261(); // tgen
  dd3261(); // tgen
};
//SIG(-1 dd3261) C1{ VBC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd3261 ::foo(){vfunc_called(this, "_ZN6dd32613fooEv");}
dd3261 ::~dd3261(){ note_dtor("dd3261", this);} // tgen
dd3261 ::dd3261(){ note_ctor("dd3261", this);} // tgen

static void Test_dd3261()
{
  extern Class_Descriptor cd_dd3261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3261, buf);
    dd3261 *dp, &lv = *(dp=new (buf) dd3261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,8), "dd3261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,8), "dd3261");
    check_base_class_offset(lv, (cc261*), ABISELECT(16,8), "dd3261");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3261.d");
    test_class_info(&lv, &cd_dd3261);
    dp->~dd3261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3261(Test_dd3261, "dd3261", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3261C1Ev();
extern void _ZN6dd3261D1Ev();
Name_Map name_map_dd3261[] = {
  NSPAIR(_ZN6dd3261C1Ev),
  NSPAIR(_ZN6dd3261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd3261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3261[];
extern void _ZN6dd32613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd3261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd3261[];
static  VTT_ENTRY vtt_dd3261[] = {
  {&(_ZTV6dd3261[3]),  3,10},
  {&(_ZTV6dd3261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static VTBL_ENTRY alt_thunk_names589[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3261 = {  "dd3261", // class name
  bases_dd3261, 3,
  &(vtc_dd3261[0]), // expected_vtbl_contents
  &(vtt_dd3261[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3261),2, //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  ee03261  : dd3261 {
  int e;
  ~ee03261(); // tgen
  ee03261(); // tgen
};
//SIG(1 ee03261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee03261 ::~ee03261(){ note_dtor("ee03261", this);} // tgen
ee03261 ::ee03261(){ note_ctor("ee03261", this);} // tgen

static void Test_ee03261()
{
  extern Class_Descriptor cd_ee03261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03261, buf);
    ee03261 *dp, &lv = *(dp=new (buf) ee03261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee03261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee03261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(16,12), "ee03261");
    check_base_class_offset(lv, (dd3261*), 0, "ee03261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03261.e");
    test_class_info(&lv, &cd_ee03261);
    dp->~ee03261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03261(Test_ee03261, "ee03261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03261C1Ev();
extern void _ZN7ee03261D1Ev();
Name_Map name_map_ee03261[] = {
  NSPAIR(_ZN7ee03261C1Ev),
  NSPAIR(_ZN7ee03261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee03261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03261[];
extern void _ZN6dd32613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee03261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee03261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee03261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee03261[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee03261[] = {
  {&(_ZTV7ee03261[3]),  3,10},
  {&(_tg__ZTV6dd3261__7ee03261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee03261[4]),  4,6},
  {&(_ZTV7ee03261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03261[];
extern  VTBL_ENTRY _ZTV7ee03261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03261[];
static VTBL_ENTRY alt_thunk_names590[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03261 = {  "ee03261", // class name
  bases_ee03261, 4,
  &(vtc_ee03261[0]), // expected_vtbl_contents
  &(vtt_ee03261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names590,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13261  : virtual dd3261 {
  int e;
  ~ee13261(); // tgen
  ee13261(); // tgen
};
//SIG(1 ee13261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee13261 ::~ee13261(){ note_dtor("ee13261", this);} // tgen
ee13261 ::ee13261(){ note_ctor("ee13261", this);} // tgen

static void Test_ee13261()
{
  extern Class_Descriptor cd_ee13261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13261, buf);
    ee13261 *dp, &lv = *(dp=new (buf) ee13261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee13261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee13261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(32,16), "ee13261");
    check_base_class_offset(lv, (dd3261*), ABISELECT(16,8), "ee13261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13261.e");
    test_class_info(&lv, &cd_ee13261);
    dp->~ee13261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13261(Test_ee13261, "ee13261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13261C1Ev();
extern void _ZN7ee13261D1Ev();
Name_Map name_map_ee13261[] = {
  NSPAIR(_ZN7ee13261C1Ev),
  NSPAIR(_ZN7ee13261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee13261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13261[];
extern void _ZN6dd32613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee13261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13261[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee13261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee13261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee13261[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee13261[] = {
  {&(_ZTV7ee13261[4]),  4,15},
  {&(_ZTV7ee13261[8]),  8,15},
  {&(_ZTV7ee13261[13]),  13,15},
  {&(_tg__ZTV6dd3261__7ee13261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee13261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13261[];
extern  VTBL_ENTRY _ZTV7ee13261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13261[];
static VTBL_ENTRY alt_thunk_names591[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13261 = {  "ee13261", // class name
  bases_ee13261, 4,
  &(vtc_ee13261[0]), // expected_vtbl_contents
  &(vtt_ee13261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13261),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names591,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23261  : dd3261 {
  int e;
  virtual void  foo(); // _ZN7ee232613fooEv
  ~ee23261(); // tgen
  ee23261(); // tgen
};
//SIG(1 ee23261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee23261 ::foo(){vfunc_called(this, "_ZN7ee232613fooEv");}
ee23261 ::~ee23261(){ note_dtor("ee23261", this);} // tgen
ee23261 ::ee23261(){ note_ctor("ee23261", this);} // tgen

static void Test_ee23261()
{
  extern Class_Descriptor cd_ee23261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23261, buf);
    ee23261 *dp, &lv = *(dp=new (buf) ee23261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee23261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee23261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(16,12), "ee23261");
    check_base_class_offset(lv, (dd3261*), 0, "ee23261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23261.e");
    test_class_info(&lv, &cd_ee23261);
    dp->~ee23261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23261(Test_ee23261, "ee23261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23261C1Ev();
extern void _ZN7ee23261D1Ev();
Name_Map name_map_ee23261[] = {
  NSPAIR(_ZN7ee23261C1Ev),
  NSPAIR(_ZN7ee23261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee23261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23261[];
extern void _ZN7ee232613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee232613fooEv,_ZTv0_n12_N7ee232613fooEv)();
extern void ABISELECT(_ZThn16_N7ee232613fooEv,_ZThn12_N7ee232613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee23261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23261[0]),
  (VTBL_ENTRY)&_ZN7ee232613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee232613fooEv,_ZTv0_n12_N7ee232613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee23261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee23261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee23261[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee23261[] = {
  {&(_ZTV7ee23261[3]),  3,10},
  {&(_tg__ZTV6dd3261__7ee23261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee23261[4]),  4,6},
  {&(_ZTV7ee23261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23261[];
extern  VTBL_ENTRY _ZTV7ee23261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23261[];
static VTBL_ENTRY alt_thunk_names592[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee232613fooEv,_ZTv0_n12_N7ee232613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee232613fooEv,_ZThn12_N7ee232613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23261 = {  "ee23261", // class name
  bases_ee23261, 4,
  &(vtc_ee23261[0]), // expected_vtbl_contents
  &(vtt_ee23261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names592,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33261  : virtual dd3261 {
  int e;
  virtual void  foo(); // _ZN7ee332613fooEv
  ~ee33261(); // tgen
  ee33261(); // tgen
};
//SIG(1 ee33261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee33261 ::foo(){vfunc_called(this, "_ZN7ee332613fooEv");}
ee33261 ::~ee33261(){ note_dtor("ee33261", this);} // tgen
ee33261 ::ee33261(){ note_ctor("ee33261", this);} // tgen

static void Test_ee33261()
{
  extern Class_Descriptor cd_ee33261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33261, buf);
    ee33261 *dp, &lv = *(dp=new (buf) ee33261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee33261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee33261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(32,16), "ee33261");
    check_base_class_offset(lv, (dd3261*), ABISELECT(16,8), "ee33261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33261.e");
    test_class_info(&lv, &cd_ee33261);
    dp->~ee33261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33261(Test_ee33261, "ee33261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33261C1Ev();
extern void _ZN7ee33261D1Ev();
Name_Map name_map_ee33261[] = {
  NSPAIR(_ZN7ee33261C1Ev),
  NSPAIR(_ZN7ee33261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee33261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33261[];
extern void _ZN7ee332613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee332613fooEv,_ZTv0_n16_N7ee332613fooEv)();
extern void ABISELECT(_ZThn16_N7ee332613fooEv,_ZThn8_N7ee332613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee332613fooEv,_ZTv0_n12_N7ee332613fooEv)();
extern void ABISELECT(_ZThn32_N7ee332613fooEv,_ZThn16_N7ee332613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee33261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33261[0]),
  (VTBL_ENTRY)&_ZN7ee332613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee332613fooEv,_ZTv0_n16_N7ee332613fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee332613fooEv,_ZTv0_n12_N7ee332613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee33261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee33261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee33261[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee33261[] = {
  {&(_ZTV7ee33261[4]),  4,16},
  {&(_ZTV7ee33261[9]),  9,16},
  {&(_ZTV7ee33261[14]),  14,16},
  {&(_tg__ZTV6dd3261__7ee33261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee33261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33261[];
extern  VTBL_ENTRY _ZTV7ee33261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33261[];
static VTBL_ENTRY alt_thunk_names593[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee332613fooEv,_ZTv0_n12_N7ee332613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee332613fooEv,_ZThn16_N7ee332613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee332613fooEv,_ZTv0_n16_N7ee332613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee332613fooEv,_ZThn8_N7ee332613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33261 = {  "ee33261", // class name
  bases_ee33261, 4,
  &(vtc_ee33261[0]), // expected_vtbl_contents
  &(vtt_ee33261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33261),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names593,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43261  : dd3261 {
  int e;
  virtual void  bar(); // _ZN7ee432613barEv
  ~ee43261(); // tgen
  ee43261(); // tgen
};
//SIG(1 ee43261) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee43261 ::bar(){vfunc_called(this, "_ZN7ee432613barEv");}
ee43261 ::~ee43261(){ note_dtor("ee43261", this);} // tgen
ee43261 ::ee43261(){ note_ctor("ee43261", this);} // tgen

static void Test_ee43261()
{
  extern Class_Descriptor cd_ee43261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43261, buf);
    ee43261 *dp, &lv = *(dp=new (buf) ee43261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee43261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee43261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(16,12), "ee43261");
    check_base_class_offset(lv, (dd3261*), 0, "ee43261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43261.e");
    test_class_info(&lv, &cd_ee43261);
    dp->~ee43261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43261(Test_ee43261, "ee43261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43261C1Ev();
extern void _ZN7ee43261D1Ev();
Name_Map name_map_ee43261[] = {
  NSPAIR(_ZN7ee43261C1Ev),
  NSPAIR(_ZN7ee43261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee43261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43261[];
extern void _ZN6dd32613fooEv();
extern void _ZN7ee432613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee432613barEv,_ZTv0_n16_N7ee432613barEv)();
extern void ABISELECT(_ZThn16_N7ee432613barEv,_ZThn12_N7ee432613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
  (VTBL_ENTRY)&_ZN7ee432613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee432613barEv,_ZTv0_n16_N7ee432613barEv),
};
extern VTBL_ENTRY _ZTV7ee43261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee43261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee43261[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee43261[] = {
  {&(_ZTV7ee43261[3]),  3,11},
  {&(_tg__ZTV6dd3261__7ee43261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee43261[4]),  4,6},
  {&(_ZTV7ee43261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43261[];
extern  VTBL_ENTRY _ZTV7ee43261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43261[];
static VTBL_ENTRY alt_thunk_names594[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee432613barEv,_ZTv0_n16_N7ee432613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee432613barEv,_ZThn12_N7ee432613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43261 = {  "ee43261", // class name
  bases_ee43261, 4,
  &(vtc_ee43261[0]), // expected_vtbl_contents
  &(vtt_ee43261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names594,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53261  : virtual dd3261 {
  int e;
  virtual void  bar(); // _ZN7ee532613barEv
  ~ee53261(); // tgen
  ee53261(); // tgen
};
//SIG(1 ee53261) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee53261 ::bar(){vfunc_called(this, "_ZN7ee532613barEv");}
ee53261 ::~ee53261(){ note_dtor("ee53261", this);} // tgen
ee53261 ::ee53261(){ note_ctor("ee53261", this);} // tgen

static void Test_ee53261()
{
  extern Class_Descriptor cd_ee53261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53261, buf);
    ee53261 *dp, &lv = *(dp=new (buf) ee53261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee53261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee53261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(32,16), "ee53261");
    check_base_class_offset(lv, (dd3261*), ABISELECT(16,8), "ee53261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53261.e");
    test_class_info(&lv, &cd_ee53261);
    dp->~ee53261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53261(Test_ee53261, "ee53261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53261C1Ev();
extern void _ZN7ee53261D1Ev();
Name_Map name_map_ee53261[] = {
  NSPAIR(_ZN7ee53261C1Ev),
  NSPAIR(_ZN7ee53261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee53261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53261[];
extern void _ZN7ee532613barEv();
extern void _ZN6dd32613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee532613barEv,_ZTv0_n16_N7ee532613barEv)();
extern void ABISELECT(_ZThn32_N7ee532613barEv,_ZThn16_N7ee532613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53261[0]),
  (VTBL_ENTRY)&_ZN7ee532613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee532613barEv,_ZTv0_n16_N7ee532613barEv),
};
extern VTBL_ENTRY _ZTV7ee53261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee53261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee53261[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee53261[] = {
  {&(_ZTV7ee53261[4]),  4,16},
  {&(_ZTV7ee53261[9]),  9,16},
  {&(_ZTV7ee53261[14]),  14,16},
  {&(_tg__ZTV6dd3261__7ee53261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee53261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53261[];
extern  VTBL_ENTRY _ZTV7ee53261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53261[];
static VTBL_ENTRY alt_thunk_names595[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee532613barEv,_ZTv0_n16_N7ee532613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee532613barEv,_ZThn16_N7ee532613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53261 = {  "ee53261", // class name
  bases_ee53261, 4,
  &(vtc_ee53261[0]), // expected_vtbl_contents
  &(vtt_ee53261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53261),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names595,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63261  : dd3261 {
  int e;
  virtual void  foo(); // _ZN7ee632613fooEv
  virtual void  bar(); // _ZN7ee632613barEv
  ~ee63261(); // tgen
  ee63261(); // tgen
};
//SIG(1 ee63261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee63261 ::foo(){vfunc_called(this, "_ZN7ee632613fooEv");}
void  ee63261 ::bar(){vfunc_called(this, "_ZN7ee632613barEv");}
ee63261 ::~ee63261(){ note_dtor("ee63261", this);} // tgen
ee63261 ::ee63261(){ note_ctor("ee63261", this);} // tgen

static void Test_ee63261()
{
  extern Class_Descriptor cd_ee63261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63261, buf);
    ee63261 *dp, &lv = *(dp=new (buf) ee63261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee63261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee63261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(16,12), "ee63261");
    check_base_class_offset(lv, (dd3261*), 0, "ee63261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63261.e");
    test_class_info(&lv, &cd_ee63261);
    dp->~ee63261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63261(Test_ee63261, "ee63261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63261C1Ev();
extern void _ZN7ee63261D1Ev();
Name_Map name_map_ee63261[] = {
  NSPAIR(_ZN7ee63261C1Ev),
  NSPAIR(_ZN7ee63261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee63261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63261[];
extern void _ZN7ee632613fooEv();
extern void _ZN7ee632613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee632613fooEv,_ZTv0_n12_N7ee632613fooEv)();
extern void ABISELECT(_ZThn16_N7ee632613fooEv,_ZThn12_N7ee632613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee632613barEv,_ZTv0_n16_N7ee632613barEv)();
extern void ABISELECT(_ZThn16_N7ee632613barEv,_ZThn12_N7ee632613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63261[0]),
  (VTBL_ENTRY)&_ZN7ee632613fooEv,
  (VTBL_ENTRY)&_ZN7ee632613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee632613fooEv,_ZTv0_n12_N7ee632613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee632613barEv,_ZTv0_n16_N7ee632613barEv),
};
extern VTBL_ENTRY _ZTV7ee63261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee63261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee63261[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee63261[] = {
  {&(_ZTV7ee63261[3]),  3,11},
  {&(_tg__ZTV6dd3261__7ee63261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee63261[4]),  4,6},
  {&(_ZTV7ee63261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63261[];
extern  VTBL_ENTRY _ZTV7ee63261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63261[];
static VTBL_ENTRY alt_thunk_names596[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn12_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee632613barEv,_ZTv0_n16_N7ee632613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee632613barEv,_ZThn12_N7ee632613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee632613fooEv,_ZTv0_n12_N7ee632613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee632613fooEv,_ZThn12_N7ee632613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63261 = {  "ee63261", // class name
  bases_ee63261, 4,
  &(vtc_ee63261[0]), // expected_vtbl_contents
  &(vtt_ee63261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names596,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73261  : virtual dd3261 {
  int e;
  virtual void  foo(); // _ZN7ee732613fooEv
  virtual void  bar(); // _ZN7ee732613barEv
  ~ee73261(); // tgen
  ee73261(); // tgen
};
//SIG(1 ee73261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee73261 ::foo(){vfunc_called(this, "_ZN7ee732613fooEv");}
void  ee73261 ::bar(){vfunc_called(this, "_ZN7ee732613barEv");}
ee73261 ::~ee73261(){ note_dtor("ee73261", this);} // tgen
ee73261 ::ee73261(){ note_ctor("ee73261", this);} // tgen

static void Test_ee73261()
{
  extern Class_Descriptor cd_ee73261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73261, buf);
    ee73261 *dp, &lv = *(dp=new (buf) ee73261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee73261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee73261");
    check_base_class_offset(lv, (cc261*)(dd3261*), ABISELECT(32,16), "ee73261");
    check_base_class_offset(lv, (dd3261*), ABISELECT(16,8), "ee73261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73261.e");
    test_class_info(&lv, &cd_ee73261);
    dp->~ee73261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73261(Test_ee73261, "ee73261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73261C1Ev();
extern void _ZN7ee73261D1Ev();
Name_Map name_map_ee73261[] = {
  NSPAIR(_ZN7ee73261C1Ev),
  NSPAIR(_ZN7ee73261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd3261;
extern VTBL_ENTRY _ZTI6dd3261[];
extern  VTBL_ENTRY _ZTV6dd3261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3261[];
static Base_Class bases_ee73261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3261,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73261[];
extern void _ZN7ee732613fooEv();
extern void _ZN7ee732613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee732613fooEv,_ZTv0_n16_N7ee732613fooEv)();
extern void ABISELECT(_ZThn16_N7ee732613fooEv,_ZThn8_N7ee732613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee732613fooEv,_ZTv0_n12_N7ee732613fooEv)();
extern void ABISELECT(_ZThn32_N7ee732613fooEv,_ZThn16_N7ee732613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee732613barEv,_ZTv0_n16_N7ee732613barEv)();
extern void ABISELECT(_ZThn32_N7ee732613barEv,_ZThn16_N7ee732613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73261[0]),
  (VTBL_ENTRY)&_ZN7ee732613fooEv,
  (VTBL_ENTRY)&_ZN7ee732613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee732613fooEv,_ZTv0_n16_N7ee732613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee732613fooEv,_ZTv0_n12_N7ee732613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee732613barEv,_ZTv0_n16_N7ee732613barEv),
};
extern VTBL_ENTRY _ZTV7ee73261[];
extern void _ZN6dd32613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3261__7ee73261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&_ZN6dd32613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv)();
extern void ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV5cc261__6dd3261__7ee73261[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee73261[] = {
  {&(_ZTV7ee73261[4]),  4,17},
  {&(_ZTV7ee73261[10]),  10,17},
  {&(_ZTV7ee73261[15]),  15,17},
  {&(_tg__ZTV6dd3261__7ee73261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd3261__7ee73261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73261[];
extern  VTBL_ENTRY _ZTV7ee73261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73261[];
static VTBL_ENTRY alt_thunk_names597[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32613fooEv,_ZTv0_n12_N6dd32613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32613fooEv,_ZThn8_N6dd32613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee732613barEv,_ZTv0_n16_N7ee732613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee732613barEv,_ZThn16_N7ee732613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee732613fooEv,_ZTv0_n12_N7ee732613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee732613fooEv,_ZThn16_N7ee732613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee732613fooEv,_ZTv0_n16_N7ee732613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee732613fooEv,_ZThn8_N7ee732613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73261 = {  "ee73261", // class name
  bases_ee73261, 4,
  &(vtc_ee73261[0]), // expected_vtbl_contents
  &(vtt_ee73261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73261),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names597,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4261  : cc261 {
  int d;
  virtual void  bar(); // _ZN6dd42613barEv
  ~dd4261(); // tgen
  dd4261(); // tgen
};
//SIG(-1 dd4261) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd4261 ::bar(){vfunc_called(this, "_ZN6dd42613barEv");}
dd4261 ::~dd4261(){ note_dtor("dd4261", this);} // tgen
dd4261 ::dd4261(){ note_ctor("dd4261", this);} // tgen

static void Test_dd4261()
{
  extern Class_Descriptor cd_dd4261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4261, buf);
    dd4261 *dp, &lv = *(dp=new (buf) dd4261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), 0, "dd4261");
    check_base_class_offset(lv, (bb61*)(cc261*), 0, "dd4261");
    check_base_class_offset(lv, (cc261*), 0, "dd4261");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4261.d");
    test_class_info(&lv, &cd_dd4261);
    dp->~dd4261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4261(Test_dd4261, "dd4261", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4261C1Ev();
extern void _ZN6dd4261D1Ev();
Name_Map name_map_dd4261[] = {
  NSPAIR(_ZN6dd4261C1Ev),
  NSPAIR(_ZN6dd4261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd4261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4261[];
extern void _ZN5cc2613fooEv();
extern void _ZN6dd42613barEv();
static  VTBL_ENTRY vtc_dd4261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN6dd42613barEv,
};
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
Class_Descriptor cd_dd4261 = {  "dd4261", // class name
  bases_dd4261, 3,
  &(vtc_dd4261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4261),4, //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  ee04261  : dd4261 {
  int e;
  ~ee04261(); // tgen
  ee04261(); // tgen
};
//SIG(1 ee04261) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee04261 ::~ee04261(){ note_dtor("ee04261", this);} // tgen
ee04261 ::ee04261(){ note_ctor("ee04261", this);} // tgen

static void Test_ee04261()
{
  extern Class_Descriptor cd_ee04261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04261, buf);
    ee04261 *dp, &lv = *(dp=new (buf) ee04261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), 0, "ee04261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), 0, "ee04261");
    check_base_class_offset(lv, (cc261*)(dd4261*), 0, "ee04261");
    check_base_class_offset(lv, (dd4261*), 0, "ee04261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04261.e");
    test_class_info(&lv, &cd_ee04261);
    dp->~ee04261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04261(Test_ee04261, "ee04261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04261C1Ev();
extern void _ZN7ee04261D1Ev();
Name_Map name_map_ee04261[] = {
  NSPAIR(_ZN7ee04261C1Ev),
  NSPAIR(_ZN7ee04261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee04261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04261[];
extern void _ZN5cc2613fooEv();
extern void _ZN6dd42613barEv();
static  VTBL_ENTRY vtc_ee04261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN6dd42613barEv,
};
extern VTBL_ENTRY _ZTI7ee04261[];
extern  VTBL_ENTRY _ZTV7ee04261[];
Class_Descriptor cd_ee04261 = {  "ee04261", // class name
  bases_ee04261, 4,
  &(vtc_ee04261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04261),4, //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  ee14261  : virtual dd4261 {
  int e;
  ~ee14261(); // tgen
  ee14261(); // tgen
};
//SIG(1 ee14261) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee14261 ::~ee14261(){ note_dtor("ee14261", this);} // tgen
ee14261 ::ee14261(){ note_ctor("ee14261", this);} // tgen

static void Test_ee14261()
{
  extern Class_Descriptor cd_ee14261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14261, buf);
    ee14261 *dp, &lv = *(dp=new (buf) ee14261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee14261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee14261");
    check_base_class_offset(lv, (cc261*)(dd4261*), ABISELECT(16,8), "ee14261");
    check_base_class_offset(lv, (dd4261*), ABISELECT(16,8), "ee14261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14261.e");
    test_class_info(&lv, &cd_ee14261);
    dp->~ee14261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14261(Test_ee14261, "ee14261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14261C1Ev();
extern void _ZN7ee14261D1Ev();
Name_Map name_map_ee14261[] = {
  NSPAIR(_ZN7ee14261C1Ev),
  NSPAIR(_ZN7ee14261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee14261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14261[];
extern void _ZN5cc2613fooEv();
extern void _ZN6dd42613barEv();
static  VTBL_ENTRY vtc_ee14261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14261[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN6dd42613barEv,
};
extern VTBL_ENTRY _ZTV7ee14261[];
static  VTT_ENTRY vtt_ee14261[] = {
  {&(_ZTV7ee14261[3]),  3,9},
  {&(_ZTV7ee14261[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14261[];
extern  VTBL_ENTRY _ZTV7ee14261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14261[];
Class_Descriptor cd_ee14261 = {  "ee14261", // class name
  bases_ee14261, 4,
  &(vtc_ee14261[0]), // expected_vtbl_contents
  &(vtt_ee14261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14261),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14261),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  ee24261  : dd4261 {
  int e;
  virtual void  foo(); // _ZN7ee242613fooEv
  ~ee24261(); // tgen
  ee24261(); // tgen
};
//SIG(1 ee24261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee24261 ::foo(){vfunc_called(this, "_ZN7ee242613fooEv");}
ee24261 ::~ee24261(){ note_dtor("ee24261", this);} // tgen
ee24261 ::ee24261(){ note_ctor("ee24261", this);} // tgen

static void Test_ee24261()
{
  extern Class_Descriptor cd_ee24261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24261, buf);
    ee24261 *dp, &lv = *(dp=new (buf) ee24261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), 0, "ee24261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), 0, "ee24261");
    check_base_class_offset(lv, (cc261*)(dd4261*), 0, "ee24261");
    check_base_class_offset(lv, (dd4261*), 0, "ee24261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24261.e");
    test_class_info(&lv, &cd_ee24261);
    dp->~ee24261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24261(Test_ee24261, "ee24261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24261C1Ev();
extern void _ZN7ee24261D1Ev();
Name_Map name_map_ee24261[] = {
  NSPAIR(_ZN7ee24261C1Ev),
  NSPAIR(_ZN7ee24261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee24261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24261[];
extern void _ZN7ee242613fooEv();
extern void _ZN6dd42613barEv();
static  VTBL_ENTRY vtc_ee24261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24261[0]),
  (VTBL_ENTRY)&_ZN7ee242613fooEv,
  (VTBL_ENTRY)&_ZN6dd42613barEv,
};
extern VTBL_ENTRY _ZTI7ee24261[];
extern  VTBL_ENTRY _ZTV7ee24261[];
Class_Descriptor cd_ee24261 = {  "ee24261", // class name
  bases_ee24261, 4,
  &(vtc_ee24261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24261),4, //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  ee34261  : virtual dd4261 {
  int e;
  virtual void  foo(); // _ZN7ee342613fooEv
  ~ee34261(); // tgen
  ee34261(); // tgen
};
//SIG(1 ee34261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee34261 ::foo(){vfunc_called(this, "_ZN7ee342613fooEv");}
ee34261 ::~ee34261(){ note_dtor("ee34261", this);} // tgen
ee34261 ::ee34261(){ note_ctor("ee34261", this);} // tgen

static void Test_ee34261()
{
  extern Class_Descriptor cd_ee34261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34261, buf);
    ee34261 *dp, &lv = *(dp=new (buf) ee34261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee34261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee34261");
    check_base_class_offset(lv, (cc261*)(dd4261*), ABISELECT(16,8), "ee34261");
    check_base_class_offset(lv, (dd4261*), ABISELECT(16,8), "ee34261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34261.e");
    test_class_info(&lv, &cd_ee34261);
    dp->~ee34261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34261(Test_ee34261, "ee34261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34261C1Ev();
extern void _ZN7ee34261D1Ev();
Name_Map name_map_ee34261[] = {
  NSPAIR(_ZN7ee34261C1Ev),
  NSPAIR(_ZN7ee34261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee34261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34261[];
extern void _ZN7ee342613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee342613fooEv,_ZTv0_n12_N7ee342613fooEv)();
extern void ABISELECT(_ZThn16_N7ee342613fooEv,_ZThn8_N7ee342613fooEv)() __attribute__((weak));
extern void _ZN6dd42613barEv();
static  VTBL_ENTRY vtc_ee34261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34261[0]),
  (VTBL_ENTRY)&_ZN7ee342613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee342613fooEv,_ZTv0_n12_N7ee342613fooEv),
  (VTBL_ENTRY)&_ZN6dd42613barEv,
};
extern VTBL_ENTRY _ZTV7ee34261[];
static  VTT_ENTRY vtt_ee34261[] = {
  {&(_ZTV7ee34261[3]),  3,10},
  {&(_ZTV7ee34261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34261[];
extern  VTBL_ENTRY _ZTV7ee34261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34261[];
static VTBL_ENTRY alt_thunk_names598[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee342613fooEv,_ZTv0_n12_N7ee342613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee342613fooEv,_ZThn8_N7ee342613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34261 = {  "ee34261", // class name
  bases_ee34261, 4,
  &(vtc_ee34261[0]), // expected_vtbl_contents
  &(vtt_ee34261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34261),2, //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  ee44261  : dd4261 {
  int e;
  virtual void  bar(); // _ZN7ee442613barEv
  ~ee44261(); // tgen
  ee44261(); // tgen
};
//SIG(1 ee44261) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee44261 ::bar(){vfunc_called(this, "_ZN7ee442613barEv");}
ee44261 ::~ee44261(){ note_dtor("ee44261", this);} // tgen
ee44261 ::ee44261(){ note_ctor("ee44261", this);} // tgen

static void Test_ee44261()
{
  extern Class_Descriptor cd_ee44261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44261, buf);
    ee44261 *dp, &lv = *(dp=new (buf) ee44261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), 0, "ee44261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), 0, "ee44261");
    check_base_class_offset(lv, (cc261*)(dd4261*), 0, "ee44261");
    check_base_class_offset(lv, (dd4261*), 0, "ee44261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44261.e");
    test_class_info(&lv, &cd_ee44261);
    dp->~ee44261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44261(Test_ee44261, "ee44261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44261C1Ev();
extern void _ZN7ee44261D1Ev();
Name_Map name_map_ee44261[] = {
  NSPAIR(_ZN7ee44261C1Ev),
  NSPAIR(_ZN7ee44261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee44261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44261[];
extern void _ZN5cc2613fooEv();
extern void _ZN7ee442613barEv();
static  VTBL_ENTRY vtc_ee44261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&_ZN7ee442613barEv,
};
extern VTBL_ENTRY _ZTI7ee44261[];
extern  VTBL_ENTRY _ZTV7ee44261[];
Class_Descriptor cd_ee44261 = {  "ee44261", // class name
  bases_ee44261, 4,
  &(vtc_ee44261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44261),4, //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  ee54261  : virtual dd4261 {
  int e;
  virtual void  bar(); // _ZN7ee542613barEv
  ~ee54261(); // tgen
  ee54261(); // tgen
};
//SIG(1 ee54261) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee54261 ::bar(){vfunc_called(this, "_ZN7ee542613barEv");}
ee54261 ::~ee54261(){ note_dtor("ee54261", this);} // tgen
ee54261 ::ee54261(){ note_ctor("ee54261", this);} // tgen

static void Test_ee54261()
{
  extern Class_Descriptor cd_ee54261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54261, buf);
    ee54261 *dp, &lv = *(dp=new (buf) ee54261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee54261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee54261");
    check_base_class_offset(lv, (cc261*)(dd4261*), ABISELECT(16,8), "ee54261");
    check_base_class_offset(lv, (dd4261*), ABISELECT(16,8), "ee54261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54261.e");
    test_class_info(&lv, &cd_ee54261);
    dp->~ee54261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54261(Test_ee54261, "ee54261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54261C1Ev();
extern void _ZN7ee54261D1Ev();
Name_Map name_map_ee54261[] = {
  NSPAIR(_ZN7ee54261C1Ev),
  NSPAIR(_ZN7ee54261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee54261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54261[];
extern void _ZN7ee542613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee542613barEv,_ZTv0_n16_N7ee542613barEv)();
extern void ABISELECT(_ZThn16_N7ee542613barEv,_ZThn8_N7ee542613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54261[0]),
  (VTBL_ENTRY)&_ZN7ee542613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee542613barEv,_ZTv0_n16_N7ee542613barEv),
};
extern VTBL_ENTRY _ZTV7ee54261[];
static  VTT_ENTRY vtt_ee54261[] = {
  {&(_ZTV7ee54261[3]),  3,10},
  {&(_ZTV7ee54261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54261[];
extern  VTBL_ENTRY _ZTV7ee54261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54261[];
static VTBL_ENTRY alt_thunk_names599[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee542613barEv,_ZTv0_n16_N7ee542613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee542613barEv,_ZThn8_N7ee542613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54261 = {  "ee54261", // class name
  bases_ee54261, 4,
  &(vtc_ee54261[0]), // expected_vtbl_contents
  &(vtt_ee54261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54261),2, //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  ee64261  : dd4261 {
  int e;
  virtual void  foo(); // _ZN7ee642613fooEv
  virtual void  bar(); // _ZN7ee642613barEv
  ~ee64261(); // tgen
  ee64261(); // tgen
};
//SIG(1 ee64261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee64261 ::foo(){vfunc_called(this, "_ZN7ee642613fooEv");}
void  ee64261 ::bar(){vfunc_called(this, "_ZN7ee642613barEv");}
ee64261 ::~ee64261(){ note_dtor("ee64261", this);} // tgen
ee64261 ::ee64261(){ note_ctor("ee64261", this);} // tgen

static void Test_ee64261()
{
  extern Class_Descriptor cd_ee64261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64261, buf);
    ee64261 *dp, &lv = *(dp=new (buf) ee64261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), 0, "ee64261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), 0, "ee64261");
    check_base_class_offset(lv, (cc261*)(dd4261*), 0, "ee64261");
    check_base_class_offset(lv, (dd4261*), 0, "ee64261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64261.e");
    test_class_info(&lv, &cd_ee64261);
    dp->~ee64261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64261(Test_ee64261, "ee64261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64261C1Ev();
extern void _ZN7ee64261D1Ev();
Name_Map name_map_ee64261[] = {
  NSPAIR(_ZN7ee64261C1Ev),
  NSPAIR(_ZN7ee64261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee64261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64261[];
extern void _ZN7ee642613fooEv();
extern void _ZN7ee642613barEv();
static  VTBL_ENTRY vtc_ee64261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64261[0]),
  (VTBL_ENTRY)&_ZN7ee642613fooEv,
  (VTBL_ENTRY)&_ZN7ee642613barEv,
};
extern VTBL_ENTRY _ZTI7ee64261[];
extern  VTBL_ENTRY _ZTV7ee64261[];
Class_Descriptor cd_ee64261 = {  "ee64261", // class name
  bases_ee64261, 4,
  &(vtc_ee64261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64261),4, //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  ee74261  : virtual dd4261 {
  int e;
  virtual void  foo(); // _ZN7ee742613fooEv
  virtual void  bar(); // _ZN7ee742613barEv
  ~ee74261(); // tgen
  ee74261(); // tgen
};
//SIG(1 ee74261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee74261 ::foo(){vfunc_called(this, "_ZN7ee742613fooEv");}
void  ee74261 ::bar(){vfunc_called(this, "_ZN7ee742613barEv");}
ee74261 ::~ee74261(){ note_dtor("ee74261", this);} // tgen
ee74261 ::ee74261(){ note_ctor("ee74261", this);} // tgen

static void Test_ee74261()
{
  extern Class_Descriptor cd_ee74261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74261, buf);
    ee74261 *dp, &lv = *(dp=new (buf) ee74261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee74261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd4261*), ABISELECT(16,8), "ee74261");
    check_base_class_offset(lv, (cc261*)(dd4261*), ABISELECT(16,8), "ee74261");
    check_base_class_offset(lv, (dd4261*), ABISELECT(16,8), "ee74261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74261.e");
    test_class_info(&lv, &cd_ee74261);
    dp->~ee74261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74261(Test_ee74261, "ee74261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74261C1Ev();
extern void _ZN7ee74261D1Ev();
Name_Map name_map_ee74261[] = {
  NSPAIR(_ZN7ee74261C1Ev),
  NSPAIR(_ZN7ee74261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd4261;
extern VTBL_ENTRY _ZTI6dd4261[];
extern  VTBL_ENTRY _ZTV6dd4261[];
static Base_Class bases_ee74261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4261,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74261[];
extern void _ZN7ee742613fooEv();
extern void _ZN7ee742613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee742613fooEv,_ZTv0_n12_N7ee742613fooEv)();
extern void ABISELECT(_ZThn16_N7ee742613fooEv,_ZThn8_N7ee742613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee742613barEv,_ZTv0_n16_N7ee742613barEv)();
extern void ABISELECT(_ZThn16_N7ee742613barEv,_ZThn8_N7ee742613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74261[0]),
  (VTBL_ENTRY)&_ZN7ee742613fooEv,
  (VTBL_ENTRY)&_ZN7ee742613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee742613fooEv,_ZTv0_n12_N7ee742613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee742613barEv,_ZTv0_n16_N7ee742613barEv),
};
extern VTBL_ENTRY _ZTV7ee74261[];
static  VTT_ENTRY vtt_ee74261[] = {
  {&(_ZTV7ee74261[3]),  3,11},
  {&(_ZTV7ee74261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74261[];
extern  VTBL_ENTRY _ZTV7ee74261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74261[];
static VTBL_ENTRY alt_thunk_names600[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee742613barEv,_ZTv0_n16_N7ee742613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee742613barEv,_ZThn8_N7ee742613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee742613fooEv,_ZTv0_n12_N7ee742613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee742613fooEv,_ZThn8_N7ee742613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74261 = {  "ee74261", // class name
  bases_ee74261, 4,
  &(vtc_ee74261[0]), // expected_vtbl_contents
  &(vtt_ee74261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74261),2, //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  dd5261  : virtual cc261 {
  int d;
  virtual void  bar(); // _ZN6dd52613barEv
  ~dd5261(); // tgen
  dd5261(); // tgen
};
//SIG(-1 dd5261) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd5261 ::bar(){vfunc_called(this, "_ZN6dd52613barEv");}
dd5261 ::~dd5261(){ note_dtor("dd5261", this);} // tgen
dd5261 ::dd5261(){ note_ctor("dd5261", this);} // tgen

static void Test_dd5261()
{
  extern Class_Descriptor cd_dd5261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5261, buf);
    dd5261 *dp, &lv = *(dp=new (buf) dd5261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,8), "dd5261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,8), "dd5261");
    check_base_class_offset(lv, (cc261*), ABISELECT(16,8), "dd5261");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5261.d");
    test_class_info(&lv, &cd_dd5261);
    dp->~dd5261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5261(Test_dd5261, "dd5261", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5261C1Ev();
extern void _ZN6dd5261D1Ev();
Name_Map name_map_dd5261[] = {
  NSPAIR(_ZN6dd5261C1Ev),
  NSPAIR(_ZN6dd5261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd5261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5261[];
extern void _ZN6dd52613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
extern VTBL_ENTRY _ZTV6dd5261[];
static  VTT_ENTRY vtt_dd5261[] = {
  {&(_ZTV6dd5261[3]),  3,10},
  {&(_ZTV6dd5261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static VTBL_ENTRY alt_thunk_names601[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5261 = {  "dd5261", // class name
  bases_dd5261, 3,
  &(vtc_dd5261[0]), // expected_vtbl_contents
  &(vtt_dd5261[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5261),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names601,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05261  : dd5261 {
  int e;
  ~ee05261(); // tgen
  ee05261(); // tgen
};
//SIG(1 ee05261) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee05261 ::~ee05261(){ note_dtor("ee05261", this);} // tgen
ee05261 ::ee05261(){ note_ctor("ee05261", this);} // tgen

static void Test_ee05261()
{
  extern Class_Descriptor cd_ee05261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05261, buf);
    ee05261 *dp, &lv = *(dp=new (buf) ee05261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee05261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee05261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(16,12), "ee05261");
    check_base_class_offset(lv, (dd5261*), 0, "ee05261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05261.e");
    test_class_info(&lv, &cd_ee05261);
    dp->~ee05261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05261(Test_ee05261, "ee05261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05261C1Ev();
extern void _ZN7ee05261D1Ev();
Name_Map name_map_ee05261[] = {
  NSPAIR(_ZN7ee05261C1Ev),
  NSPAIR(_ZN7ee05261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee05261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05261[];
extern void _ZN6dd52613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
extern VTBL_ENTRY _ZTV7ee05261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee05261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee05261[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee05261[] = {
  {&(_ZTV7ee05261[3]),  3,10},
  {&(_tg__ZTV6dd5261__7ee05261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee05261[4]),  4,6},
  {&(_ZTV7ee05261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05261[];
extern  VTBL_ENTRY _ZTV7ee05261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05261[];
static VTBL_ENTRY alt_thunk_names602[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05261 = {  "ee05261", // class name
  bases_ee05261, 4,
  &(vtc_ee05261[0]), // expected_vtbl_contents
  &(vtt_ee05261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names602,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15261  : virtual dd5261 {
  int e;
  ~ee15261(); // tgen
  ee15261(); // tgen
};
//SIG(1 ee15261) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee15261 ::~ee15261(){ note_dtor("ee15261", this);} // tgen
ee15261 ::ee15261(){ note_ctor("ee15261", this);} // tgen

static void Test_ee15261()
{
  extern Class_Descriptor cd_ee15261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15261, buf);
    ee15261 *dp, &lv = *(dp=new (buf) ee15261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee15261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee15261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(32,16), "ee15261");
    check_base_class_offset(lv, (dd5261*), ABISELECT(16,8), "ee15261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15261.e");
    test_class_info(&lv, &cd_ee15261);
    dp->~ee15261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15261(Test_ee15261, "ee15261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15261C1Ev();
extern void _ZN7ee15261D1Ev();
Name_Map name_map_ee15261[] = {
  NSPAIR(_ZN7ee15261C1Ev),
  NSPAIR(_ZN7ee15261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee15261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15261[];
extern void _ZN6dd52613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15261[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
extern VTBL_ENTRY _ZTV7ee15261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee15261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee15261[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee15261[] = {
  {&(_ZTV7ee15261[4]),  4,15},
  {&(_ZTV7ee15261[8]),  8,15},
  {&(_ZTV7ee15261[13]),  13,15},
  {&(_tg__ZTV6dd5261__7ee15261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee15261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15261[];
extern  VTBL_ENTRY _ZTV7ee15261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15261[];
static VTBL_ENTRY alt_thunk_names603[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15261 = {  "ee15261", // class name
  bases_ee15261, 4,
  &(vtc_ee15261[0]), // expected_vtbl_contents
  &(vtt_ee15261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15261),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15261),5, //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  ee25261  : dd5261 {
  int e;
  virtual void  foo(); // _ZN7ee252613fooEv
  ~ee25261(); // tgen
  ee25261(); // tgen
};
//SIG(1 ee25261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee25261 ::foo(){vfunc_called(this, "_ZN7ee252613fooEv");}
ee25261 ::~ee25261(){ note_dtor("ee25261", this);} // tgen
ee25261 ::ee25261(){ note_ctor("ee25261", this);} // tgen

static void Test_ee25261()
{
  extern Class_Descriptor cd_ee25261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25261, buf);
    ee25261 *dp, &lv = *(dp=new (buf) ee25261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee25261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee25261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(16,12), "ee25261");
    check_base_class_offset(lv, (dd5261*), 0, "ee25261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25261.e");
    test_class_info(&lv, &cd_ee25261);
    dp->~ee25261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25261(Test_ee25261, "ee25261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25261C1Ev();
extern void _ZN7ee25261D1Ev();
Name_Map name_map_ee25261[] = {
  NSPAIR(_ZN7ee25261C1Ev),
  NSPAIR(_ZN7ee25261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee25261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25261[];
extern void _ZN6dd52613barEv();
extern void _ZN7ee252613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee252613fooEv,_ZTv0_n12_N7ee252613fooEv)();
extern void ABISELECT(_ZThn16_N7ee252613fooEv,_ZThn12_N7ee252613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
  (VTBL_ENTRY)&_ZN7ee252613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee252613fooEv,_ZTv0_n12_N7ee252613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
extern VTBL_ENTRY _ZTV7ee25261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee25261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee25261[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee25261[] = {
  {&(_ZTV7ee25261[3]),  3,11},
  {&(_tg__ZTV6dd5261__7ee25261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee25261[4]),  4,6},
  {&(_ZTV7ee25261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25261[];
extern  VTBL_ENTRY _ZTV7ee25261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25261[];
static VTBL_ENTRY alt_thunk_names604[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee252613fooEv,_ZTv0_n12_N7ee252613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee252613fooEv,_ZThn12_N7ee252613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25261 = {  "ee25261", // class name
  bases_ee25261, 4,
  &(vtc_ee25261[0]), // expected_vtbl_contents
  &(vtt_ee25261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25261),4, //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  ee35261  : virtual dd5261 {
  int e;
  virtual void  foo(); // _ZN7ee352613fooEv
  ~ee35261(); // tgen
  ee35261(); // tgen
};
//SIG(1 ee35261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee35261 ::foo(){vfunc_called(this, "_ZN7ee352613fooEv");}
ee35261 ::~ee35261(){ note_dtor("ee35261", this);} // tgen
ee35261 ::ee35261(){ note_ctor("ee35261", this);} // tgen

static void Test_ee35261()
{
  extern Class_Descriptor cd_ee35261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35261, buf);
    ee35261 *dp, &lv = *(dp=new (buf) ee35261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee35261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee35261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(32,16), "ee35261");
    check_base_class_offset(lv, (dd5261*), ABISELECT(16,8), "ee35261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35261.e");
    test_class_info(&lv, &cd_ee35261);
    dp->~ee35261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35261(Test_ee35261, "ee35261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35261C1Ev();
extern void _ZN7ee35261D1Ev();
Name_Map name_map_ee35261[] = {
  NSPAIR(_ZN7ee35261C1Ev),
  NSPAIR(_ZN7ee35261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee35261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35261[];
extern void _ZN7ee352613fooEv();
extern void _ZN6dd52613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee352613fooEv,_ZTv0_n12_N7ee352613fooEv)();
extern void ABISELECT(_ZThn32_N7ee352613fooEv,_ZThn16_N7ee352613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35261[0]),
  (VTBL_ENTRY)&_ZN7ee352613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee352613fooEv,_ZTv0_n12_N7ee352613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
extern VTBL_ENTRY _ZTV7ee35261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee35261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee35261[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee35261[] = {
  {&(_ZTV7ee35261[4]),  4,16},
  {&(_ZTV7ee35261[9]),  9,16},
  {&(_ZTV7ee35261[14]),  14,16},
  {&(_tg__ZTV6dd5261__7ee35261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee35261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35261[];
extern  VTBL_ENTRY _ZTV7ee35261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35261[];
static VTBL_ENTRY alt_thunk_names605[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee352613fooEv,_ZTv0_n12_N7ee352613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee352613fooEv,_ZThn16_N7ee352613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35261 = {  "ee35261", // class name
  bases_ee35261, 4,
  &(vtc_ee35261[0]), // expected_vtbl_contents
  &(vtt_ee35261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35261),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35261),5, //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  ee45261  : dd5261 {
  int e;
  virtual void  bar(); // _ZN7ee452613barEv
  ~ee45261(); // tgen
  ee45261(); // tgen
};
//SIG(1 ee45261) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee45261 ::bar(){vfunc_called(this, "_ZN7ee452613barEv");}
ee45261 ::~ee45261(){ note_dtor("ee45261", this);} // tgen
ee45261 ::ee45261(){ note_ctor("ee45261", this);} // tgen

static void Test_ee45261()
{
  extern Class_Descriptor cd_ee45261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45261, buf);
    ee45261 *dp, &lv = *(dp=new (buf) ee45261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee45261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee45261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(16,12), "ee45261");
    check_base_class_offset(lv, (dd5261*), 0, "ee45261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45261.e");
    test_class_info(&lv, &cd_ee45261);
    dp->~ee45261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45261(Test_ee45261, "ee45261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45261C1Ev();
extern void _ZN7ee45261D1Ev();
Name_Map name_map_ee45261[] = {
  NSPAIR(_ZN7ee45261C1Ev),
  NSPAIR(_ZN7ee45261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee45261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45261[];
extern void _ZN7ee452613barEv();
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee452613barEv,_ZTv0_n16_N7ee452613barEv)();
extern void ABISELECT(_ZThn16_N7ee452613barEv,_ZThn12_N7ee452613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45261[0]),
  (VTBL_ENTRY)&_ZN7ee452613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee452613barEv,_ZTv0_n16_N7ee452613barEv),
};
extern VTBL_ENTRY _ZTV7ee45261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee45261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee45261[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee45261[] = {
  {&(_ZTV7ee45261[3]),  3,10},
  {&(_tg__ZTV6dd5261__7ee45261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee45261[4]),  4,6},
  {&(_ZTV7ee45261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45261[];
extern  VTBL_ENTRY _ZTV7ee45261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45261[];
static VTBL_ENTRY alt_thunk_names606[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee452613barEv,_ZTv0_n16_N7ee452613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee452613barEv,_ZThn12_N7ee452613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45261 = {  "ee45261", // class name
  bases_ee45261, 4,
  &(vtc_ee45261[0]), // expected_vtbl_contents
  &(vtt_ee45261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45261),4, //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  ee55261  : virtual dd5261 {
  int e;
  virtual void  bar(); // _ZN7ee552613barEv
  ~ee55261(); // tgen
  ee55261(); // tgen
};
//SIG(1 ee55261) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee55261 ::bar(){vfunc_called(this, "_ZN7ee552613barEv");}
ee55261 ::~ee55261(){ note_dtor("ee55261", this);} // tgen
ee55261 ::ee55261(){ note_ctor("ee55261", this);} // tgen

static void Test_ee55261()
{
  extern Class_Descriptor cd_ee55261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55261, buf);
    ee55261 *dp, &lv = *(dp=new (buf) ee55261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee55261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee55261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(32,16), "ee55261");
    check_base_class_offset(lv, (dd5261*), ABISELECT(16,8), "ee55261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55261.e");
    test_class_info(&lv, &cd_ee55261);
    dp->~ee55261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55261(Test_ee55261, "ee55261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55261C1Ev();
extern void _ZN7ee55261D1Ev();
Name_Map name_map_ee55261[] = {
  NSPAIR(_ZN7ee55261C1Ev),
  NSPAIR(_ZN7ee55261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee55261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55261[];
extern void _ZN7ee552613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee552613barEv,_ZTv0_n16_N7ee552613barEv)();
extern void ABISELECT(_ZThn16_N7ee552613barEv,_ZThn8_N7ee552613barEv)() __attribute__((weak));
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee552613barEv,_ZTv0_n16_N7ee552613barEv)();
extern void ABISELECT(_ZThn32_N7ee552613barEv,_ZThn16_N7ee552613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55261[0]),
  (VTBL_ENTRY)&_ZN7ee552613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee552613barEv,_ZTv0_n16_N7ee552613barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee552613barEv,_ZTv0_n16_N7ee552613barEv),
};
extern VTBL_ENTRY _ZTV7ee55261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee55261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee55261[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee55261[] = {
  {&(_ZTV7ee55261[4]),  4,16},
  {&(_ZTV7ee55261[9]),  9,16},
  {&(_ZTV7ee55261[14]),  14,16},
  {&(_tg__ZTV6dd5261__7ee55261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee55261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55261[];
extern  VTBL_ENTRY _ZTV7ee55261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55261[];
static VTBL_ENTRY alt_thunk_names607[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee552613barEv,_ZTv0_n16_N7ee552613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee552613barEv,_ZThn16_N7ee552613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee552613barEv,_ZThn8_N7ee552613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55261 = {  "ee55261", // class name
  bases_ee55261, 4,
  &(vtc_ee55261[0]), // expected_vtbl_contents
  &(vtt_ee55261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55261),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names607,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65261  : dd5261 {
  int e;
  virtual void  foo(); // _ZN7ee652613fooEv
  virtual void  bar(); // _ZN7ee652613barEv
  ~ee65261(); // tgen
  ee65261(); // tgen
};
//SIG(1 ee65261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee65261 ::foo(){vfunc_called(this, "_ZN7ee652613fooEv");}
void  ee65261 ::bar(){vfunc_called(this, "_ZN7ee652613barEv");}
ee65261 ::~ee65261(){ note_dtor("ee65261", this);} // tgen
ee65261 ::ee65261(){ note_ctor("ee65261", this);} // tgen

static void Test_ee65261()
{
  extern Class_Descriptor cd_ee65261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65261, buf);
    ee65261 *dp, &lv = *(dp=new (buf) ee65261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee65261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee65261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(16,12), "ee65261");
    check_base_class_offset(lv, (dd5261*), 0, "ee65261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65261.e");
    test_class_info(&lv, &cd_ee65261);
    dp->~ee65261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65261(Test_ee65261, "ee65261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65261C1Ev();
extern void _ZN7ee65261D1Ev();
Name_Map name_map_ee65261[] = {
  NSPAIR(_ZN7ee65261C1Ev),
  NSPAIR(_ZN7ee65261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee65261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65261[];
extern void _ZN7ee652613barEv();
extern void _ZN7ee652613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee652613fooEv,_ZTv0_n12_N7ee652613fooEv)();
extern void ABISELECT(_ZThn16_N7ee652613fooEv,_ZThn12_N7ee652613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee652613barEv,_ZTv0_n16_N7ee652613barEv)();
extern void ABISELECT(_ZThn16_N7ee652613barEv,_ZThn12_N7ee652613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65261[0]),
  (VTBL_ENTRY)&_ZN7ee652613barEv,
  (VTBL_ENTRY)&_ZN7ee652613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee652613fooEv,_ZTv0_n12_N7ee652613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee652613barEv,_ZTv0_n16_N7ee652613barEv),
};
extern VTBL_ENTRY _ZTV7ee65261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee65261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee65261[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee65261[] = {
  {&(_ZTV7ee65261[3]),  3,11},
  {&(_tg__ZTV6dd5261__7ee65261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee65261[4]),  4,6},
  {&(_ZTV7ee65261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65261[];
extern  VTBL_ENTRY _ZTV7ee65261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65261[];
static VTBL_ENTRY alt_thunk_names608[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn12_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee652613barEv,_ZTv0_n16_N7ee652613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee652613barEv,_ZThn12_N7ee652613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee652613fooEv,_ZTv0_n12_N7ee652613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee652613fooEv,_ZThn12_N7ee652613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65261 = {  "ee65261", // class name
  bases_ee65261, 4,
  &(vtc_ee65261[0]), // expected_vtbl_contents
  &(vtt_ee65261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names608,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75261  : virtual dd5261 {
  int e;
  virtual void  foo(); // _ZN7ee752613fooEv
  virtual void  bar(); // _ZN7ee752613barEv
  ~ee75261(); // tgen
  ee75261(); // tgen
};
//SIG(1 ee75261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee75261 ::foo(){vfunc_called(this, "_ZN7ee752613fooEv");}
void  ee75261 ::bar(){vfunc_called(this, "_ZN7ee752613barEv");}
ee75261 ::~ee75261(){ note_dtor("ee75261", this);} // tgen
ee75261 ::ee75261(){ note_ctor("ee75261", this);} // tgen

static void Test_ee75261()
{
  extern Class_Descriptor cd_ee75261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75261, buf);
    ee75261 *dp, &lv = *(dp=new (buf) ee75261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee75261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee75261");
    check_base_class_offset(lv, (cc261*)(dd5261*), ABISELECT(32,16), "ee75261");
    check_base_class_offset(lv, (dd5261*), ABISELECT(16,8), "ee75261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75261.e");
    test_class_info(&lv, &cd_ee75261);
    dp->~ee75261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75261(Test_ee75261, "ee75261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75261C1Ev();
extern void _ZN7ee75261D1Ev();
Name_Map name_map_ee75261[] = {
  NSPAIR(_ZN7ee75261C1Ev),
  NSPAIR(_ZN7ee75261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd5261;
extern VTBL_ENTRY _ZTI6dd5261[];
extern  VTBL_ENTRY _ZTV6dd5261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5261[];
static Base_Class bases_ee75261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5261,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75261[];
extern void _ZN7ee752613fooEv();
extern void _ZN7ee752613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee752613barEv,_ZTv0_n16_N7ee752613barEv)();
extern void ABISELECT(_ZThn16_N7ee752613barEv,_ZThn8_N7ee752613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee752613fooEv,_ZTv0_n12_N7ee752613fooEv)();
extern void ABISELECT(_ZThn32_N7ee752613fooEv,_ZThn16_N7ee752613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee752613barEv,_ZTv0_n16_N7ee752613barEv)();
extern void ABISELECT(_ZThn32_N7ee752613barEv,_ZThn16_N7ee752613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75261[0]),
  (VTBL_ENTRY)&_ZN7ee752613fooEv,
  (VTBL_ENTRY)&_ZN7ee752613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee752613barEv,_ZTv0_n16_N7ee752613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee752613fooEv,_ZTv0_n12_N7ee752613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee752613barEv,_ZTv0_n16_N7ee752613barEv),
};
extern VTBL_ENTRY _ZTV7ee75261[];
extern void _ZN6dd52613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5261__7ee75261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN6dd52613barEv,
};
extern void _ZN5cc2613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv)();
extern void ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd5261__7ee75261[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5261[0]),
  (VTBL_ENTRY)&_ZN5cc2613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv),
};
static  VTT_ENTRY vtt_ee75261[] = {
  {&(_ZTV7ee75261[4]),  4,17},
  {&(_ZTV7ee75261[10]),  10,17},
  {&(_ZTV7ee75261[15]),  15,17},
  {&(_tg__ZTV6dd5261__7ee75261[3]),  3,4},
  {&(_tg__ZTV5cc261__6dd5261__7ee75261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75261[];
extern  VTBL_ENTRY _ZTV7ee75261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75261[];
static VTBL_ENTRY alt_thunk_names609[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52613barEv,_ZTv0_n16_N6dd52613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52613barEv,_ZThn8_N6dd52613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee752613fooEv,_ZTv0_n12_N7ee752613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee752613fooEv,_ZThn16_N7ee752613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee752613barEv,_ZTv0_n16_N7ee752613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee752613barEv,_ZThn16_N7ee752613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee752613barEv,_ZThn8_N7ee752613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75261 = {  "ee75261", // class name
  bases_ee75261, 4,
  &(vtc_ee75261[0]), // expected_vtbl_contents
  &(vtt_ee75261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75261),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names609,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6261  : cc261 {
  int d;
  virtual void  bar(); // _ZN6dd62613barEv
  virtual void  foo(); // _ZN6dd62613fooEv
  ~dd6261(); // tgen
  dd6261(); // tgen
};
//SIG(-1 dd6261) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd6261 ::bar(){vfunc_called(this, "_ZN6dd62613barEv");}
void  dd6261 ::foo(){vfunc_called(this, "_ZN6dd62613fooEv");}
dd6261 ::~dd6261(){ note_dtor("dd6261", this);} // tgen
dd6261 ::dd6261(){ note_ctor("dd6261", this);} // tgen

static void Test_dd6261()
{
  extern Class_Descriptor cd_dd6261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6261, buf);
    dd6261 *dp, &lv = *(dp=new (buf) dd6261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), 0, "dd6261");
    check_base_class_offset(lv, (bb61*)(cc261*), 0, "dd6261");
    check_base_class_offset(lv, (cc261*), 0, "dd6261");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6261.d");
    test_class_info(&lv, &cd_dd6261);
    dp->~dd6261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6261(Test_dd6261, "dd6261", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6261C1Ev();
extern void _ZN6dd6261D1Ev();
Name_Map name_map_dd6261[] = {
  NSPAIR(_ZN6dd6261C1Ev),
  NSPAIR(_ZN6dd6261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd6261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6261[];
extern void _ZN6dd62613fooEv();
extern void _ZN6dd62613barEv();
static  VTBL_ENTRY vtc_dd6261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6261[0]),
  (VTBL_ENTRY)&_ZN6dd62613fooEv,
  (VTBL_ENTRY)&_ZN6dd62613barEv,
};
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
Class_Descriptor cd_dd6261 = {  "dd6261", // class name
  bases_dd6261, 3,
  &(vtc_dd6261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6261),4, //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  ee06261  : dd6261 {
  int e;
  ~ee06261(); // tgen
  ee06261(); // tgen
};
//SIG(1 ee06261) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee06261 ::~ee06261(){ note_dtor("ee06261", this);} // tgen
ee06261 ::ee06261(){ note_ctor("ee06261", this);} // tgen

static void Test_ee06261()
{
  extern Class_Descriptor cd_ee06261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06261, buf);
    ee06261 *dp, &lv = *(dp=new (buf) ee06261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), 0, "ee06261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), 0, "ee06261");
    check_base_class_offset(lv, (cc261*)(dd6261*), 0, "ee06261");
    check_base_class_offset(lv, (dd6261*), 0, "ee06261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06261.e");
    test_class_info(&lv, &cd_ee06261);
    dp->~ee06261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06261(Test_ee06261, "ee06261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06261C1Ev();
extern void _ZN7ee06261D1Ev();
Name_Map name_map_ee06261[] = {
  NSPAIR(_ZN7ee06261C1Ev),
  NSPAIR(_ZN7ee06261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee06261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06261[];
extern void _ZN6dd62613fooEv();
extern void _ZN6dd62613barEv();
static  VTBL_ENTRY vtc_ee06261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06261[0]),
  (VTBL_ENTRY)&_ZN6dd62613fooEv,
  (VTBL_ENTRY)&_ZN6dd62613barEv,
};
extern VTBL_ENTRY _ZTI7ee06261[];
extern  VTBL_ENTRY _ZTV7ee06261[];
Class_Descriptor cd_ee06261 = {  "ee06261", // class name
  bases_ee06261, 4,
  &(vtc_ee06261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06261),4, //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  ee16261  : virtual dd6261 {
  int e;
  ~ee16261(); // tgen
  ee16261(); // tgen
};
//SIG(1 ee16261) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee16261 ::~ee16261(){ note_dtor("ee16261", this);} // tgen
ee16261 ::ee16261(){ note_ctor("ee16261", this);} // tgen

static void Test_ee16261()
{
  extern Class_Descriptor cd_ee16261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16261, buf);
    ee16261 *dp, &lv = *(dp=new (buf) ee16261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee16261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee16261");
    check_base_class_offset(lv, (cc261*)(dd6261*), ABISELECT(16,8), "ee16261");
    check_base_class_offset(lv, (dd6261*), ABISELECT(16,8), "ee16261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16261.e");
    test_class_info(&lv, &cd_ee16261);
    dp->~ee16261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16261(Test_ee16261, "ee16261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16261C1Ev();
extern void _ZN7ee16261D1Ev();
Name_Map name_map_ee16261[] = {
  NSPAIR(_ZN7ee16261C1Ev),
  NSPAIR(_ZN7ee16261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee16261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16261[];
extern void _ZN6dd62613fooEv();
extern void _ZN6dd62613barEv();
static  VTBL_ENTRY vtc_ee16261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16261[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16261[0]),
  (VTBL_ENTRY)&_ZN6dd62613fooEv,
  (VTBL_ENTRY)&_ZN6dd62613barEv,
};
extern VTBL_ENTRY _ZTV7ee16261[];
static  VTT_ENTRY vtt_ee16261[] = {
  {&(_ZTV7ee16261[3]),  3,9},
  {&(_ZTV7ee16261[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16261[];
extern  VTBL_ENTRY _ZTV7ee16261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16261[];
Class_Descriptor cd_ee16261 = {  "ee16261", // class name
  bases_ee16261, 4,
  &(vtc_ee16261[0]), // expected_vtbl_contents
  &(vtt_ee16261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16261),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16261),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  ee26261  : dd6261 {
  int e;
  virtual void  foo(); // _ZN7ee262613fooEv
  ~ee26261(); // tgen
  ee26261(); // tgen
};
//SIG(1 ee26261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee26261 ::foo(){vfunc_called(this, "_ZN7ee262613fooEv");}
ee26261 ::~ee26261(){ note_dtor("ee26261", this);} // tgen
ee26261 ::ee26261(){ note_ctor("ee26261", this);} // tgen

static void Test_ee26261()
{
  extern Class_Descriptor cd_ee26261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26261, buf);
    ee26261 *dp, &lv = *(dp=new (buf) ee26261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), 0, "ee26261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), 0, "ee26261");
    check_base_class_offset(lv, (cc261*)(dd6261*), 0, "ee26261");
    check_base_class_offset(lv, (dd6261*), 0, "ee26261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26261.e");
    test_class_info(&lv, &cd_ee26261);
    dp->~ee26261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26261(Test_ee26261, "ee26261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26261C1Ev();
extern void _ZN7ee26261D1Ev();
Name_Map name_map_ee26261[] = {
  NSPAIR(_ZN7ee26261C1Ev),
  NSPAIR(_ZN7ee26261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee26261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26261[];
extern void _ZN7ee262613fooEv();
extern void _ZN6dd62613barEv();
static  VTBL_ENTRY vtc_ee26261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26261[0]),
  (VTBL_ENTRY)&_ZN7ee262613fooEv,
  (VTBL_ENTRY)&_ZN6dd62613barEv,
};
extern VTBL_ENTRY _ZTI7ee26261[];
extern  VTBL_ENTRY _ZTV7ee26261[];
Class_Descriptor cd_ee26261 = {  "ee26261", // class name
  bases_ee26261, 4,
  &(vtc_ee26261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26261),4, //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  ee36261  : virtual dd6261 {
  int e;
  virtual void  foo(); // _ZN7ee362613fooEv
  ~ee36261(); // tgen
  ee36261(); // tgen
};
//SIG(1 ee36261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee36261 ::foo(){vfunc_called(this, "_ZN7ee362613fooEv");}
ee36261 ::~ee36261(){ note_dtor("ee36261", this);} // tgen
ee36261 ::ee36261(){ note_ctor("ee36261", this);} // tgen

static void Test_ee36261()
{
  extern Class_Descriptor cd_ee36261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36261, buf);
    ee36261 *dp, &lv = *(dp=new (buf) ee36261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee36261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee36261");
    check_base_class_offset(lv, (cc261*)(dd6261*), ABISELECT(16,8), "ee36261");
    check_base_class_offset(lv, (dd6261*), ABISELECT(16,8), "ee36261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36261.e");
    test_class_info(&lv, &cd_ee36261);
    dp->~ee36261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36261(Test_ee36261, "ee36261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36261C1Ev();
extern void _ZN7ee36261D1Ev();
Name_Map name_map_ee36261[] = {
  NSPAIR(_ZN7ee36261C1Ev),
  NSPAIR(_ZN7ee36261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee36261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36261[];
extern void _ZN7ee362613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee362613fooEv,_ZTv0_n12_N7ee362613fooEv)();
extern void ABISELECT(_ZThn16_N7ee362613fooEv,_ZThn8_N7ee362613fooEv)() __attribute__((weak));
extern void _ZN6dd62613barEv();
static  VTBL_ENTRY vtc_ee36261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36261[0]),
  (VTBL_ENTRY)&_ZN7ee362613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee362613fooEv,_ZTv0_n12_N7ee362613fooEv),
  (VTBL_ENTRY)&_ZN6dd62613barEv,
};
extern VTBL_ENTRY _ZTV7ee36261[];
static  VTT_ENTRY vtt_ee36261[] = {
  {&(_ZTV7ee36261[3]),  3,10},
  {&(_ZTV7ee36261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36261[];
extern  VTBL_ENTRY _ZTV7ee36261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36261[];
static VTBL_ENTRY alt_thunk_names610[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee362613fooEv,_ZTv0_n12_N7ee362613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee362613fooEv,_ZThn8_N7ee362613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36261 = {  "ee36261", // class name
  bases_ee36261, 4,
  &(vtc_ee36261[0]), // expected_vtbl_contents
  &(vtt_ee36261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36261),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names610,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46261  : dd6261 {
  int e;
  virtual void  bar(); // _ZN7ee462613barEv
  ~ee46261(); // tgen
  ee46261(); // tgen
};
//SIG(1 ee46261) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee46261 ::bar(){vfunc_called(this, "_ZN7ee462613barEv");}
ee46261 ::~ee46261(){ note_dtor("ee46261", this);} // tgen
ee46261 ::ee46261(){ note_ctor("ee46261", this);} // tgen

static void Test_ee46261()
{
  extern Class_Descriptor cd_ee46261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46261, buf);
    ee46261 *dp, &lv = *(dp=new (buf) ee46261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), 0, "ee46261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), 0, "ee46261");
    check_base_class_offset(lv, (cc261*)(dd6261*), 0, "ee46261");
    check_base_class_offset(lv, (dd6261*), 0, "ee46261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46261.e");
    test_class_info(&lv, &cd_ee46261);
    dp->~ee46261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46261(Test_ee46261, "ee46261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46261C1Ev();
extern void _ZN7ee46261D1Ev();
Name_Map name_map_ee46261[] = {
  NSPAIR(_ZN7ee46261C1Ev),
  NSPAIR(_ZN7ee46261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee46261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46261[];
extern void _ZN6dd62613fooEv();
extern void _ZN7ee462613barEv();
static  VTBL_ENTRY vtc_ee46261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46261[0]),
  (VTBL_ENTRY)&_ZN6dd62613fooEv,
  (VTBL_ENTRY)&_ZN7ee462613barEv,
};
extern VTBL_ENTRY _ZTI7ee46261[];
extern  VTBL_ENTRY _ZTV7ee46261[];
Class_Descriptor cd_ee46261 = {  "ee46261", // class name
  bases_ee46261, 4,
  &(vtc_ee46261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46261),4, //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  ee56261  : virtual dd6261 {
  int e;
  virtual void  bar(); // _ZN7ee562613barEv
  ~ee56261(); // tgen
  ee56261(); // tgen
};
//SIG(1 ee56261) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee56261 ::bar(){vfunc_called(this, "_ZN7ee562613barEv");}
ee56261 ::~ee56261(){ note_dtor("ee56261", this);} // tgen
ee56261 ::ee56261(){ note_ctor("ee56261", this);} // tgen

static void Test_ee56261()
{
  extern Class_Descriptor cd_ee56261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56261, buf);
    ee56261 *dp, &lv = *(dp=new (buf) ee56261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee56261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee56261");
    check_base_class_offset(lv, (cc261*)(dd6261*), ABISELECT(16,8), "ee56261");
    check_base_class_offset(lv, (dd6261*), ABISELECT(16,8), "ee56261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56261.e");
    test_class_info(&lv, &cd_ee56261);
    dp->~ee56261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56261(Test_ee56261, "ee56261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56261C1Ev();
extern void _ZN7ee56261D1Ev();
Name_Map name_map_ee56261[] = {
  NSPAIR(_ZN7ee56261C1Ev),
  NSPAIR(_ZN7ee56261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee56261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56261[];
extern void _ZN7ee562613barEv();
extern void _ZN6dd62613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee562613barEv,_ZTv0_n16_N7ee562613barEv)();
extern void ABISELECT(_ZThn16_N7ee562613barEv,_ZThn8_N7ee562613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56261[0]),
  (VTBL_ENTRY)&_ZN7ee562613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56261[0]),
  (VTBL_ENTRY)&_ZN6dd62613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee562613barEv,_ZTv0_n16_N7ee562613barEv),
};
extern VTBL_ENTRY _ZTV7ee56261[];
static  VTT_ENTRY vtt_ee56261[] = {
  {&(_ZTV7ee56261[3]),  3,10},
  {&(_ZTV7ee56261[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56261[];
extern  VTBL_ENTRY _ZTV7ee56261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56261[];
static VTBL_ENTRY alt_thunk_names611[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee562613barEv,_ZTv0_n16_N7ee562613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee562613barEv,_ZThn8_N7ee562613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56261 = {  "ee56261", // class name
  bases_ee56261, 4,
  &(vtc_ee56261[0]), // expected_vtbl_contents
  &(vtt_ee56261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56261),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56261),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names611,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66261  : dd6261 {
  int e;
  virtual void  foo(); // _ZN7ee662613fooEv
  virtual void  bar(); // _ZN7ee662613barEv
  ~ee66261(); // tgen
  ee66261(); // tgen
};
//SIG(1 ee66261) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66261 ::foo(){vfunc_called(this, "_ZN7ee662613fooEv");}
void  ee66261 ::bar(){vfunc_called(this, "_ZN7ee662613barEv");}
ee66261 ::~ee66261(){ note_dtor("ee66261", this);} // tgen
ee66261 ::ee66261(){ note_ctor("ee66261", this);} // tgen

static void Test_ee66261()
{
  extern Class_Descriptor cd_ee66261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66261, buf);
    ee66261 *dp, &lv = *(dp=new (buf) ee66261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), 0, "ee66261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), 0, "ee66261");
    check_base_class_offset(lv, (cc261*)(dd6261*), 0, "ee66261");
    check_base_class_offset(lv, (dd6261*), 0, "ee66261");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66261.e");
    test_class_info(&lv, &cd_ee66261);
    dp->~ee66261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66261(Test_ee66261, "ee66261", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66261C1Ev();
extern void _ZN7ee66261D1Ev();
Name_Map name_map_ee66261[] = {
  NSPAIR(_ZN7ee66261C1Ev),
  NSPAIR(_ZN7ee66261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee66261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66261[];
extern void _ZN7ee662613fooEv();
extern void _ZN7ee662613barEv();
static  VTBL_ENTRY vtc_ee66261[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66261[0]),
  (VTBL_ENTRY)&_ZN7ee662613fooEv,
  (VTBL_ENTRY)&_ZN7ee662613barEv,
};
extern VTBL_ENTRY _ZTI7ee66261[];
extern  VTBL_ENTRY _ZTV7ee66261[];
Class_Descriptor cd_ee66261 = {  "ee66261", // class name
  bases_ee66261, 4,
  &(vtc_ee66261[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66261),4, //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  ee76261  : virtual dd6261 {
  int e;
  virtual void  foo(); // _ZN7ee762613fooEv
  virtual void  bar(); // _ZN7ee762613barEv
  ~ee76261(); // tgen
  ee76261(); // tgen
};
//SIG(1 ee76261) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76261 ::foo(){vfunc_called(this, "_ZN7ee762613fooEv");}
void  ee76261 ::bar(){vfunc_called(this, "_ZN7ee762613barEv");}
ee76261 ::~ee76261(){ note_dtor("ee76261", this);} // tgen
ee76261 ::ee76261(){ note_ctor("ee76261", this);} // tgen

static void Test_ee76261()
{
  extern Class_Descriptor cd_ee76261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76261, buf);
    ee76261 *dp, &lv = *(dp=new (buf) ee76261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee76261");
    check_base_class_offset(lv, (bb61*)(cc261*)(dd6261*), ABISELECT(16,8), "ee76261");
    check_base_class_offset(lv, (cc261*)(dd6261*), ABISELECT(16,8), "ee76261");
    check_base_class_offset(lv, (dd6261*), ABISELECT(16,8), "ee76261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76261.e");
    test_class_info(&lv, &cd_ee76261);
    dp->~ee76261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76261(Test_ee76261, "ee76261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76261C1Ev();
extern void _ZN7ee76261D1Ev();
Name_Map name_map_ee76261[] = {
  NSPAIR(_ZN7ee76261C1Ev),
  NSPAIR(_ZN7ee76261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd6261;
extern VTBL_ENTRY _ZTI6dd6261[];
extern  VTBL_ENTRY _ZTV6dd6261[];
static Base_Class bases_ee76261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6261,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76261[];
extern void _ZN7ee762613fooEv();
extern void _ZN7ee762613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee762613fooEv,_ZTv0_n12_N7ee762613fooEv)();
extern void ABISELECT(_ZThn16_N7ee762613fooEv,_ZThn8_N7ee762613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee762613barEv,_ZTv0_n16_N7ee762613barEv)();
extern void ABISELECT(_ZThn16_N7ee762613barEv,_ZThn8_N7ee762613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76261[0]),
  (VTBL_ENTRY)&_ZN7ee762613fooEv,
  (VTBL_ENTRY)&_ZN7ee762613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee762613fooEv,_ZTv0_n12_N7ee762613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee762613barEv,_ZTv0_n16_N7ee762613barEv),
};
extern VTBL_ENTRY _ZTV7ee76261[];
static  VTT_ENTRY vtt_ee76261[] = {
  {&(_ZTV7ee76261[3]),  3,11},
  {&(_ZTV7ee76261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76261[];
extern  VTBL_ENTRY _ZTV7ee76261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76261[];
static VTBL_ENTRY alt_thunk_names612[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee762613barEv,_ZTv0_n16_N7ee762613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee762613barEv,_ZThn8_N7ee762613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee762613fooEv,_ZTv0_n12_N7ee762613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee762613fooEv,_ZThn8_N7ee762613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76261 = {  "ee76261", // class name
  bases_ee76261, 4,
  &(vtc_ee76261[0]), // expected_vtbl_contents
  &(vtt_ee76261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76261),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names612,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7261  : virtual cc261 {
  int d;
  virtual void  bar(); // _ZN6dd72613barEv
  virtual void  foo(); // _ZN6dd72613fooEv
  ~dd7261(); // tgen
  dd7261(); // tgen
};
//SIG(-1 dd7261) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd7261 ::bar(){vfunc_called(this, "_ZN6dd72613barEv");}
void  dd7261 ::foo(){vfunc_called(this, "_ZN6dd72613fooEv");}
dd7261 ::~dd7261(){ note_dtor("dd7261", this);} // tgen
dd7261 ::dd7261(){ note_ctor("dd7261", this);} // tgen

static void Test_dd7261()
{
  extern Class_Descriptor cd_dd7261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7261, buf);
    dd7261 *dp, &lv = *(dp=new (buf) dd7261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,8), "dd7261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,8), "dd7261");
    check_base_class_offset(lv, (cc261*), ABISELECT(16,8), "dd7261");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7261.d");
    test_class_info(&lv, &cd_dd7261);
    dp->~dd7261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7261(Test_dd7261, "dd7261", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7261C1Ev();
extern void _ZN6dd7261D1Ev();
Name_Map name_map_dd7261[] = {
  NSPAIR(_ZN6dd7261C1Ev),
  NSPAIR(_ZN6dd7261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
static Base_Class bases_dd7261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
extern VTBL_ENTRY _ZTV6dd7261[];
static  VTT_ENTRY vtt_dd7261[] = {
  {&(_ZTV6dd7261[3]),  3,11},
  {&(_ZTV6dd7261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static VTBL_ENTRY alt_thunk_names613[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7261 = {  "dd7261", // class name
  bases_dd7261, 3,
  &(vtc_dd7261[0]), // expected_vtbl_contents
  &(vtt_dd7261[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7261),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names613,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07261  : dd7261 {
  int e;
  ~ee07261(); // tgen
  ee07261(); // tgen
};
//SIG(1 ee07261) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee07261 ::~ee07261(){ note_dtor("ee07261", this);} // tgen
ee07261 ::ee07261(){ note_ctor("ee07261", this);} // tgen

static void Test_ee07261()
{
  extern Class_Descriptor cd_ee07261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07261, buf);
    ee07261 *dp, &lv = *(dp=new (buf) ee07261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee07261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee07261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(16,12), "ee07261");
    check_base_class_offset(lv, (dd7261*), 0, "ee07261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07261.e");
    test_class_info(&lv, &cd_ee07261);
    dp->~ee07261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07261(Test_ee07261, "ee07261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07261C1Ev();
extern void _ZN7ee07261D1Ev();
Name_Map name_map_ee07261[] = {
  NSPAIR(_ZN7ee07261C1Ev),
  NSPAIR(_ZN7ee07261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee07261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
extern VTBL_ENTRY _ZTV7ee07261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee07261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee07261[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee07261[] = {
  {&(_ZTV7ee07261[3]),  3,11},
  {&(_tg__ZTV6dd7261__7ee07261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee07261[4]),  4,6},
  {&(_ZTV7ee07261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07261[];
extern  VTBL_ENTRY _ZTV7ee07261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07261[];
static VTBL_ENTRY alt_thunk_names614[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07261 = {  "ee07261", // class name
  bases_ee07261, 4,
  &(vtc_ee07261[0]), // expected_vtbl_contents
  &(vtt_ee07261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names614,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17261  : virtual dd7261 {
  int e;
  ~ee17261(); // tgen
  ee17261(); // tgen
};
//SIG(1 ee17261) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee17261 ::~ee17261(){ note_dtor("ee17261", this);} // tgen
ee17261 ::ee17261(){ note_ctor("ee17261", this);} // tgen

static void Test_ee17261()
{
  extern Class_Descriptor cd_ee17261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17261, buf);
    ee17261 *dp, &lv = *(dp=new (buf) ee17261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee17261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee17261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(32,16), "ee17261");
    check_base_class_offset(lv, (dd7261*), ABISELECT(16,8), "ee17261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17261.e");
    test_class_info(&lv, &cd_ee17261);
    dp->~ee17261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17261(Test_ee17261, "ee17261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17261C1Ev();
extern void _ZN7ee17261D1Ev();
Name_Map name_map_ee17261[] = {
  NSPAIR(_ZN7ee17261C1Ev),
  NSPAIR(_ZN7ee17261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee17261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17261[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
extern VTBL_ENTRY _ZTV7ee17261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee17261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee17261[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee17261[] = {
  {&(_ZTV7ee17261[4]),  4,17},
  {&(_ZTV7ee17261[9]),  9,17},
  {&(_ZTV7ee17261[15]),  15,17},
  {&(_tg__ZTV6dd7261__7ee17261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee17261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17261[];
extern  VTBL_ENTRY _ZTV7ee17261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17261[];
static VTBL_ENTRY alt_thunk_names615[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17261 = {  "ee17261", // class name
  bases_ee17261, 4,
  &(vtc_ee17261[0]), // expected_vtbl_contents
  &(vtt_ee17261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17261),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names615,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27261  : dd7261 {
  int e;
  virtual void  foo(); // _ZN7ee272613fooEv
  ~ee27261(); // tgen
  ee27261(); // tgen
};
//SIG(1 ee27261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee27261 ::foo(){vfunc_called(this, "_ZN7ee272613fooEv");}
ee27261 ::~ee27261(){ note_dtor("ee27261", this);} // tgen
ee27261 ::ee27261(){ note_ctor("ee27261", this);} // tgen

static void Test_ee27261()
{
  extern Class_Descriptor cd_ee27261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27261, buf);
    ee27261 *dp, &lv = *(dp=new (buf) ee27261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee27261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee27261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(16,12), "ee27261");
    check_base_class_offset(lv, (dd7261*), 0, "ee27261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27261.e");
    test_class_info(&lv, &cd_ee27261);
    dp->~ee27261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27261(Test_ee27261, "ee27261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27261C1Ev();
extern void _ZN7ee27261D1Ev();
Name_Map name_map_ee27261[] = {
  NSPAIR(_ZN7ee27261C1Ev),
  NSPAIR(_ZN7ee27261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee27261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27261[];
extern void _ZN6dd72613barEv();
extern void _ZN7ee272613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee272613fooEv,_ZTv0_n12_N7ee272613fooEv)();
extern void ABISELECT(_ZThn16_N7ee272613fooEv,_ZThn12_N7ee272613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN7ee272613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee272613fooEv,_ZTv0_n12_N7ee272613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
extern VTBL_ENTRY _ZTV7ee27261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee27261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee27261[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee27261[] = {
  {&(_ZTV7ee27261[3]),  3,11},
  {&(_tg__ZTV6dd7261__7ee27261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee27261[4]),  4,6},
  {&(_ZTV7ee27261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27261[];
extern  VTBL_ENTRY _ZTV7ee27261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27261[];
static VTBL_ENTRY alt_thunk_names616[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee272613fooEv,_ZTv0_n12_N7ee272613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee272613fooEv,_ZThn12_N7ee272613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27261 = {  "ee27261", // class name
  bases_ee27261, 4,
  &(vtc_ee27261[0]), // expected_vtbl_contents
  &(vtt_ee27261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27261),4, //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  ee37261  : virtual dd7261 {
  int e;
  virtual void  foo(); // _ZN7ee372613fooEv
  ~ee37261(); // tgen
  ee37261(); // tgen
};
//SIG(1 ee37261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee37261 ::foo(){vfunc_called(this, "_ZN7ee372613fooEv");}
ee37261 ::~ee37261(){ note_dtor("ee37261", this);} // tgen
ee37261 ::ee37261(){ note_ctor("ee37261", this);} // tgen

static void Test_ee37261()
{
  extern Class_Descriptor cd_ee37261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37261, buf);
    ee37261 *dp, &lv = *(dp=new (buf) ee37261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee37261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee37261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(32,16), "ee37261");
    check_base_class_offset(lv, (dd7261*), ABISELECT(16,8), "ee37261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37261.e");
    test_class_info(&lv, &cd_ee37261);
    dp->~ee37261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37261(Test_ee37261, "ee37261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37261C1Ev();
extern void _ZN7ee37261D1Ev();
Name_Map name_map_ee37261[] = {
  NSPAIR(_ZN7ee37261C1Ev),
  NSPAIR(_ZN7ee37261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee37261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37261[];
extern void _ZN7ee372613fooEv();
extern void _ZN6dd72613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee372613fooEv,_ZTv0_n20_N7ee372613fooEv)();
extern void ABISELECT(_ZThn16_N7ee372613fooEv,_ZThn8_N7ee372613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee372613fooEv,_ZTv0_n12_N7ee372613fooEv)();
extern void ABISELECT(_ZThn32_N7ee372613fooEv,_ZThn16_N7ee372613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37261[0]),
  (VTBL_ENTRY)&_ZN7ee372613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee372613fooEv,_ZTv0_n20_N7ee372613fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee372613fooEv,_ZTv0_n12_N7ee372613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
extern VTBL_ENTRY _ZTV7ee37261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee37261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee37261[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee37261[] = {
  {&(_ZTV7ee37261[4]),  4,18},
  {&(_ZTV7ee37261[10]),  10,18},
  {&(_ZTV7ee37261[16]),  16,18},
  {&(_tg__ZTV6dd7261__7ee37261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee37261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37261[];
extern  VTBL_ENTRY _ZTV7ee37261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37261[];
static VTBL_ENTRY alt_thunk_names617[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee372613fooEv,_ZTv0_n12_N7ee372613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee372613fooEv,_ZThn16_N7ee372613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee372613fooEv,_ZTv0_n20_N7ee372613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee372613fooEv,_ZThn8_N7ee372613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37261 = {  "ee37261", // class name
  bases_ee37261, 4,
  &(vtc_ee37261[0]), // expected_vtbl_contents
  &(vtt_ee37261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37261),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37261),5, //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  ee47261  : dd7261 {
  int e;
  virtual void  bar(); // _ZN7ee472613barEv
  ~ee47261(); // tgen
  ee47261(); // tgen
};
//SIG(1 ee47261) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee47261 ::bar(){vfunc_called(this, "_ZN7ee472613barEv");}
ee47261 ::~ee47261(){ note_dtor("ee47261", this);} // tgen
ee47261 ::ee47261(){ note_ctor("ee47261", this);} // tgen

static void Test_ee47261()
{
  extern Class_Descriptor cd_ee47261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47261, buf);
    ee47261 *dp, &lv = *(dp=new (buf) ee47261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee47261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee47261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(16,12), "ee47261");
    check_base_class_offset(lv, (dd7261*), 0, "ee47261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47261.e");
    test_class_info(&lv, &cd_ee47261);
    dp->~ee47261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47261(Test_ee47261, "ee47261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47261C1Ev();
extern void _ZN7ee47261D1Ev();
Name_Map name_map_ee47261[] = {
  NSPAIR(_ZN7ee47261C1Ev),
  NSPAIR(_ZN7ee47261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee47261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47261[];
extern void _ZN7ee472613barEv();
extern void _ZN6dd72613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee472613barEv,_ZTv0_n16_N7ee472613barEv)();
extern void ABISELECT(_ZThn16_N7ee472613barEv,_ZThn12_N7ee472613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47261[0]),
  (VTBL_ENTRY)&_ZN7ee472613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee472613barEv,_ZTv0_n16_N7ee472613barEv),
};
extern VTBL_ENTRY _ZTV7ee47261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee47261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee47261[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee47261[] = {
  {&(_ZTV7ee47261[3]),  3,11},
  {&(_tg__ZTV6dd7261__7ee47261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee47261[4]),  4,6},
  {&(_ZTV7ee47261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47261[];
extern  VTBL_ENTRY _ZTV7ee47261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47261[];
static VTBL_ENTRY alt_thunk_names618[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee472613barEv,_ZTv0_n16_N7ee472613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee472613barEv,_ZThn12_N7ee472613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47261 = {  "ee47261", // class name
  bases_ee47261, 4,
  &(vtc_ee47261[0]), // expected_vtbl_contents
  &(vtt_ee47261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47261),4, //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  ee57261  : virtual dd7261 {
  int e;
  virtual void  bar(); // _ZN7ee572613barEv
  ~ee57261(); // tgen
  ee57261(); // tgen
};
//SIG(1 ee57261) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee57261 ::bar(){vfunc_called(this, "_ZN7ee572613barEv");}
ee57261 ::~ee57261(){ note_dtor("ee57261", this);} // tgen
ee57261 ::ee57261(){ note_ctor("ee57261", this);} // tgen

static void Test_ee57261()
{
  extern Class_Descriptor cd_ee57261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57261, buf);
    ee57261 *dp, &lv = *(dp=new (buf) ee57261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee57261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee57261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(32,16), "ee57261");
    check_base_class_offset(lv, (dd7261*), ABISELECT(16,8), "ee57261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57261.e");
    test_class_info(&lv, &cd_ee57261);
    dp->~ee57261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57261(Test_ee57261, "ee57261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57261C1Ev();
extern void _ZN7ee57261D1Ev();
Name_Map name_map_ee57261[] = {
  NSPAIR(_ZN7ee57261C1Ev),
  NSPAIR(_ZN7ee57261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee57261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57261[];
extern void _ZN7ee572613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee572613barEv,_ZTv0_n16_N7ee572613barEv)();
extern void ABISELECT(_ZThn16_N7ee572613barEv,_ZThn8_N7ee572613barEv)() __attribute__((weak));
extern void _ZN6dd72613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee572613barEv,_ZTv0_n16_N7ee572613barEv)();
extern void ABISELECT(_ZThn32_N7ee572613barEv,_ZThn16_N7ee572613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57261[0]),
  (VTBL_ENTRY)&_ZN7ee572613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee572613barEv,_ZTv0_n16_N7ee572613barEv),
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee572613barEv,_ZTv0_n16_N7ee572613barEv),
};
extern VTBL_ENTRY _ZTV7ee57261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee57261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee57261[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee57261[] = {
  {&(_ZTV7ee57261[4]),  4,18},
  {&(_ZTV7ee57261[10]),  10,18},
  {&(_ZTV7ee57261[16]),  16,18},
  {&(_tg__ZTV6dd7261__7ee57261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee57261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57261[];
extern  VTBL_ENTRY _ZTV7ee57261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57261[];
static VTBL_ENTRY alt_thunk_names619[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee572613barEv,_ZTv0_n16_N7ee572613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee572613barEv,_ZThn16_N7ee572613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee572613barEv,_ZThn8_N7ee572613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57261 = {  "ee57261", // class name
  bases_ee57261, 4,
  &(vtc_ee57261[0]), // expected_vtbl_contents
  &(vtt_ee57261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57261),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57261),5, //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  ee67261  : dd7261 {
  int e;
  virtual void  foo(); // _ZN7ee672613fooEv
  virtual void  bar(); // _ZN7ee672613barEv
  ~ee67261(); // tgen
  ee67261(); // tgen
};
//SIG(1 ee67261) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67261 ::foo(){vfunc_called(this, "_ZN7ee672613fooEv");}
void  ee67261 ::bar(){vfunc_called(this, "_ZN7ee672613barEv");}
ee67261 ::~ee67261(){ note_dtor("ee67261", this);} // tgen
ee67261 ::ee67261(){ note_ctor("ee67261", this);} // tgen

static void Test_ee67261()
{
  extern Class_Descriptor cd_ee67261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67261, buf);
    ee67261 *dp, &lv = *(dp=new (buf) ee67261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(16,12), "ee67261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(16,12), "ee67261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(16,12), "ee67261");
    check_base_class_offset(lv, (dd7261*), 0, "ee67261");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67261.e");
    test_class_info(&lv, &cd_ee67261);
    dp->~ee67261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67261(Test_ee67261, "ee67261", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67261C1Ev();
extern void _ZN7ee67261D1Ev();
Name_Map name_map_ee67261[] = {
  NSPAIR(_ZN7ee67261C1Ev),
  NSPAIR(_ZN7ee67261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee67261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc261,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67261[];
extern void _ZN7ee672613barEv();
extern void _ZN7ee672613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee672613fooEv,_ZTv0_n12_N7ee672613fooEv)();
extern void ABISELECT(_ZThn16_N7ee672613fooEv,_ZThn12_N7ee672613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee672613barEv,_ZTv0_n16_N7ee672613barEv)();
extern void ABISELECT(_ZThn16_N7ee672613barEv,_ZThn12_N7ee672613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67261[0]),
  (VTBL_ENTRY)&_ZN7ee672613barEv,
  (VTBL_ENTRY)&_ZN7ee672613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee672613fooEv,_ZTv0_n12_N7ee672613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee672613barEv,_ZTv0_n16_N7ee672613barEv),
};
extern VTBL_ENTRY _ZTV7ee67261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee67261[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee67261[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee67261[] = {
  {&(_ZTV7ee67261[3]),  3,11},
  {&(_tg__ZTV6dd7261__7ee67261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee67261[4]),  4,6},
  {&(_ZTV7ee67261[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67261[];
extern  VTBL_ENTRY _ZTV7ee67261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67261[];
static VTBL_ENTRY alt_thunk_names620[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn12_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn12_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee672613barEv,_ZTv0_n16_N7ee672613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee672613barEv,_ZThn12_N7ee672613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee672613fooEv,_ZTv0_n12_N7ee672613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee672613fooEv,_ZThn12_N7ee672613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67261 = {  "ee67261", // class name
  bases_ee67261, 4,
  &(vtc_ee67261[0]), // expected_vtbl_contents
  &(vtt_ee67261[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67261),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67261),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67261),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names620,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77261  : virtual dd7261 {
  int e;
  virtual void  foo(); // _ZN7ee772613fooEv
  virtual void  bar(); // _ZN7ee772613barEv
  ~ee77261(); // tgen
  ee77261(); // tgen
};
//SIG(1 ee77261) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77261 ::foo(){vfunc_called(this, "_ZN7ee772613fooEv");}
void  ee77261 ::bar(){vfunc_called(this, "_ZN7ee772613barEv");}
ee77261 ::~ee77261(){ note_dtor("ee77261", this);} // tgen
ee77261 ::ee77261(){ note_ctor("ee77261", this);} // tgen

static void Test_ee77261()
{
  extern Class_Descriptor cd_ee77261;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77261, buf);
    ee77261 *dp, &lv = *(dp=new (buf) ee77261());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77261)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77261)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc261*), ABISELECT(32,16), "ee77261");
    check_base_class_offset(lv, (bb61*)(cc261*), ABISELECT(32,16), "ee77261");
    check_base_class_offset(lv, (cc261*)(dd7261*), ABISELECT(32,16), "ee77261");
    check_base_class_offset(lv, (dd7261*), ABISELECT(16,8), "ee77261");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77261.e");
    test_class_info(&lv, &cd_ee77261);
    dp->~ee77261();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77261(Test_ee77261, "ee77261", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77261C1Ev();
extern void _ZN7ee77261D1Ev();
Name_Map name_map_ee77261[] = {
  NSPAIR(_ZN7ee77261C1Ev),
  NSPAIR(_ZN7ee77261D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc261;
extern VTBL_ENTRY _ZTI5cc261[];
extern  VTBL_ENTRY _ZTV5cc261[];
extern Class_Descriptor cd_dd7261;
extern VTBL_ENTRY _ZTI6dd7261[];
extern  VTBL_ENTRY _ZTV6dd7261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7261[];
static Base_Class bases_ee77261[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc261,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7261,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77261[];
extern void _ZN7ee772613fooEv();
extern void _ZN7ee772613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee772613barEv,_ZTv0_n16_N7ee772613barEv)();
extern void ABISELECT(_ZThn16_N7ee772613barEv,_ZThn8_N7ee772613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee772613fooEv,_ZTv0_n20_N7ee772613fooEv)();
extern void ABISELECT(_ZThn16_N7ee772613fooEv,_ZThn8_N7ee772613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee772613fooEv,_ZTv0_n12_N7ee772613fooEv)();
extern void ABISELECT(_ZThn32_N7ee772613fooEv,_ZThn16_N7ee772613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee772613barEv,_ZTv0_n16_N7ee772613barEv)();
extern void ABISELECT(_ZThn32_N7ee772613barEv,_ZThn16_N7ee772613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77261[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77261[0]),
  (VTBL_ENTRY)&_ZN7ee772613fooEv,
  (VTBL_ENTRY)&_ZN7ee772613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee772613barEv,_ZTv0_n16_N7ee772613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee772613fooEv,_ZTv0_n20_N7ee772613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee772613fooEv,_ZTv0_n12_N7ee772613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee772613barEv,_ZTv0_n16_N7ee772613barEv),
};
extern VTBL_ENTRY _ZTV7ee77261[];
extern void _ZN6dd72613barEv();
extern void _ZN6dd72613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7261__7ee77261[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&_ZN6dd72613barEv,
  (VTBL_ENTRY)&_ZN6dd72613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv)();
extern void ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv)();
extern void ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc261__6dd7261__7ee77261[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7261[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv),
};
static  VTT_ENTRY vtt_ee77261[] = {
  {&(_ZTV7ee77261[4]),  4,19},
  {&(_ZTV7ee77261[11]),  11,19},
  {&(_ZTV7ee77261[17]),  17,19},
  {&(_tg__ZTV6dd7261__7ee77261[3]),  3,5},
  {&(_tg__ZTV5cc261__6dd7261__7ee77261[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77261[];
extern  VTBL_ENTRY _ZTV7ee77261[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77261[];
static VTBL_ENTRY alt_thunk_names621[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72613barEv,_ZTv0_n16_N6dd72613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613barEv,_ZThn8_N6dd72613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72613fooEv,_ZTv0_n12_N6dd72613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72613fooEv,_ZThn8_N6dd72613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee772613fooEv,_ZTv0_n12_N7ee772613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee772613fooEv,_ZThn16_N7ee772613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee772613fooEv,_ZTv0_n20_N7ee772613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee772613fooEv,_ZThn8_N7ee772613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee772613barEv,_ZTv0_n16_N7ee772613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee772613barEv,_ZThn16_N7ee772613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee772613barEv,_ZThn8_N7ee772613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77261 = {  "ee77261", // class name
  bases_ee77261, 4,
  &(vtc_ee77261[0]), // expected_vtbl_contents
  &(vtt_ee77261[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77261),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77261),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77261),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names621,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc361  : virtual bb61 {
  int c;
  virtual void  foo(); // _ZN5cc3613fooEv
  ~cc361(); // tgen
  cc361(); // tgen
};
//SIG(-1 cc361) C1{ VBC2{ BC3{ v1 Fi} v2 v1 Fi} v1 Fi}


void  cc361 ::foo(){vfunc_called(this, "_ZN5cc3613fooEv");}
cc361 ::~cc361(){ note_dtor("cc361", this);} // tgen
cc361 ::cc361(){ note_ctor("cc361", this);} // tgen

static void Test_cc361()
{
  extern Class_Descriptor cd_cc361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc361, buf);
    cc361 *dp, &lv = *(dp=new (buf) cc361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,8), "cc361");
    check_base_class_offset(lv, (bb61*), ABISELECT(16,8), "cc361");
    check_field_offset(lv, c, ABISELECT(8,4), "cc361.c");
    test_class_info(&lv, &cd_cc361);
    dp->~cc361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc361(Test_cc361, "cc361", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc361C1Ev();
extern void _ZN5cc361D1Ev();
Name_Map name_map_cc361[] = {
  NSPAIR(_ZN5cc361C1Ev),
  NSPAIR(_ZN5cc361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI5cc361[];
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_cc361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV5cc361[];
static  VTT_ENTRY vtt_cc361[] = {
  {&(_ZTV5cc361[3]),  3,10},
  {&(_ZTV5cc361[8]),  8,10},
};
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static VTBL_ENTRY alt_thunk_names622[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc361 = {  "cc361", // class name
  bases_cc361, 2,
  &(vtc_cc361[0]), // expected_vtbl_contents
  &(vtt_cc361[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc361),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc361),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names622,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0361  : cc361 {
  int d;
  ~dd0361(); // tgen
  dd0361(); // tgen
};
//SIG(-1 dd0361) C1{ BC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} Fi}


dd0361 ::~dd0361(){ note_dtor("dd0361", this);} // tgen
dd0361 ::dd0361(){ note_ctor("dd0361", this);} // tgen

static void Test_dd0361()
{
  extern Class_Descriptor cd_dd0361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0361, buf);
    dd0361 *dp, &lv = *(dp=new (buf) dd0361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd0361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(16,12), "dd0361");
    check_base_class_offset(lv, (cc361*), 0, "dd0361");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0361.d");
    test_class_info(&lv, &cd_dd0361);
    dp->~dd0361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0361(Test_dd0361, "dd0361", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0361C1Ev();
extern void _ZN6dd0361D1Ev();
Name_Map name_map_dd0361[] = {
  NSPAIR(_ZN6dd0361C1Ev),
  NSPAIR(_ZN6dd0361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd0361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0361[];
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd0361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd0361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd0361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd0361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd0361[] = {
  {&(_ZTV6dd0361[3]),  3,10},
  {&(_tg__ZTV5cc361__6dd0361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd0361[4]),  4,6},
  {&(_ZTV6dd0361[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static VTBL_ENTRY alt_thunk_names623[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0361 = {  "dd0361", // class name
  bases_dd0361, 3,
  &(vtc_dd0361[0]), // expected_vtbl_contents
  &(vtt_dd0361[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0361),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0361),4, //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  ee00361  : dd0361 {
  int e;
  ~ee00361(); // tgen
  ee00361(); // tgen
};
//SIG(1 ee00361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee00361 ::~ee00361(){ note_dtor("ee00361", this);} // tgen
ee00361 ::ee00361(){ note_ctor("ee00361", this);} // tgen

static void Test_ee00361()
{
  extern Class_Descriptor cd_ee00361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00361, buf);
    ee00361 *dp, &lv = *(dp=new (buf) ee00361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee00361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(24,16), "ee00361");
    check_base_class_offset(lv, (cc361*)(dd0361*), 0, "ee00361");
    check_base_class_offset(lv, (dd0361*), 0, "ee00361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00361.e");
    test_class_info(&lv, &cd_ee00361);
    dp->~ee00361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00361(Test_ee00361, "ee00361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00361C1Ev();
extern void _ZN7ee00361D1Ev();
Name_Map name_map_ee00361[] = {
  NSPAIR(_ZN7ee00361C1Ev),
  NSPAIR(_ZN7ee00361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee00361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00361[];
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee00361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee00361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee00361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee00361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee00361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee00361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee00361[] = {
  {&(_ZTV7ee00361[3]),  3,10},
  {&(_tg__ZTV6dd0361__7ee00361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee00361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee00361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee00361[4]),  4,6},
  {&(_ZTV7ee00361[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee00361[];
extern  VTBL_ENTRY _ZTV7ee00361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00361[];
static VTBL_ENTRY alt_thunk_names624[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00361 = {  "ee00361", // class name
  bases_ee00361, 4,
  &(vtc_ee00361[0]), // expected_vtbl_contents
  &(vtt_ee00361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00361),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names624,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10361  : virtual dd0361 {
  int e;
  ~ee10361(); // tgen
  ee10361(); // tgen
};
//SIG(1 ee10361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee10361 ::~ee10361(){ note_dtor("ee10361", this);} // tgen
ee10361 ::ee10361(){ note_ctor("ee10361", this);} // tgen

static void Test_ee10361()
{
  extern Class_Descriptor cd_ee10361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10361, buf);
    ee10361 *dp, &lv = *(dp=new (buf) ee10361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee10361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(32,20), "ee10361");
    check_base_class_offset(lv, (cc361*)(dd0361*), ABISELECT(16,8), "ee10361");
    check_base_class_offset(lv, (dd0361*), ABISELECT(16,8), "ee10361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10361.e");
    test_class_info(&lv, &cd_ee10361);
    dp->~ee10361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10361(Test_ee10361, "ee10361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10361C1Ev();
extern void _ZN7ee10361D1Ev();
Name_Map name_map_ee10361[] = {
  NSPAIR(_ZN7ee10361C1Ev),
  NSPAIR(_ZN7ee10361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee10361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10361[];
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee10361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10361[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee10361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee10361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee10361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee10361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee10361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee10361[] = {
  {&(_ZTV7ee10361[4]),  4,15},
  {&(_ZTV7ee10361[8]),  8,15},
  {&(_ZTV7ee10361[13]),  13,15},
  {&(_tg__ZTV6dd0361__7ee10361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee10361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee10361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee10361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10361[];
extern  VTBL_ENTRY _ZTV7ee10361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10361[];
static VTBL_ENTRY alt_thunk_names625[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10361 = {  "ee10361", // class name
  bases_ee10361, 4,
  &(vtc_ee10361[0]), // expected_vtbl_contents
  &(vtt_ee10361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10361),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names625,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20361  : dd0361 {
  int e;
  virtual void  foo(); // _ZN7ee203613fooEv
  ~ee20361(); // tgen
  ee20361(); // tgen
};
//SIG(1 ee20361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee20361 ::foo(){vfunc_called(this, "_ZN7ee203613fooEv");}
ee20361 ::~ee20361(){ note_dtor("ee20361", this);} // tgen
ee20361 ::ee20361(){ note_ctor("ee20361", this);} // tgen

static void Test_ee20361()
{
  extern Class_Descriptor cd_ee20361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20361, buf);
    ee20361 *dp, &lv = *(dp=new (buf) ee20361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee20361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(24,16), "ee20361");
    check_base_class_offset(lv, (cc361*)(dd0361*), 0, "ee20361");
    check_base_class_offset(lv, (dd0361*), 0, "ee20361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20361.e");
    test_class_info(&lv, &cd_ee20361);
    dp->~ee20361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20361(Test_ee20361, "ee20361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20361C1Ev();
extern void _ZN7ee20361D1Ev();
Name_Map name_map_ee20361[] = {
  NSPAIR(_ZN7ee20361C1Ev),
  NSPAIR(_ZN7ee20361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee20361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20361[];
extern void _ZN7ee203613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee203613fooEv,_ZTv0_n12_N7ee203613fooEv)();
extern void ABISELECT(_ZThn24_N7ee203613fooEv,_ZThn16_N7ee203613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee20361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20361[0]),
  (VTBL_ENTRY)&_ZN7ee203613fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee203613fooEv,_ZTv0_n12_N7ee203613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee20361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee20361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee20361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee20361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee20361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee20361[] = {
  {&(_ZTV7ee20361[3]),  3,10},
  {&(_tg__ZTV6dd0361__7ee20361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee20361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee20361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee20361[4]),  4,6},
  {&(_ZTV7ee20361[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee20361[];
extern  VTBL_ENTRY _ZTV7ee20361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20361[];
static VTBL_ENTRY alt_thunk_names626[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee203613fooEv,_ZTv0_n12_N7ee203613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee203613fooEv,_ZThn16_N7ee203613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20361 = {  "ee20361", // class name
  bases_ee20361, 4,
  &(vtc_ee20361[0]), // expected_vtbl_contents
  &(vtt_ee20361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20361),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names626,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30361  : virtual dd0361 {
  int e;
  virtual void  foo(); // _ZN7ee303613fooEv
  ~ee30361(); // tgen
  ee30361(); // tgen
};
//SIG(1 ee30361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee30361 ::foo(){vfunc_called(this, "_ZN7ee303613fooEv");}
ee30361 ::~ee30361(){ note_dtor("ee30361", this);} // tgen
ee30361 ::ee30361(){ note_ctor("ee30361", this);} // tgen

static void Test_ee30361()
{
  extern Class_Descriptor cd_ee30361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30361, buf);
    ee30361 *dp, &lv = *(dp=new (buf) ee30361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee30361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(32,20), "ee30361");
    check_base_class_offset(lv, (cc361*)(dd0361*), ABISELECT(16,8), "ee30361");
    check_base_class_offset(lv, (dd0361*), ABISELECT(16,8), "ee30361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30361.e");
    test_class_info(&lv, &cd_ee30361);
    dp->~ee30361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30361(Test_ee30361, "ee30361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30361C1Ev();
extern void _ZN7ee30361D1Ev();
Name_Map name_map_ee30361[] = {
  NSPAIR(_ZN7ee30361C1Ev),
  NSPAIR(_ZN7ee30361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee30361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30361[];
extern void _ZN7ee303613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee303613fooEv,_ZTv0_n16_N7ee303613fooEv)();
extern void ABISELECT(_ZThn16_N7ee303613fooEv,_ZThn8_N7ee303613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee303613fooEv,_ZTv0_n12_N7ee303613fooEv)();
extern void ABISELECT(_ZThn32_N7ee303613fooEv,_ZThn20_N7ee303613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee30361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30361[0]),
  (VTBL_ENTRY)&_ZN7ee303613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee303613fooEv,_ZTv0_n16_N7ee303613fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee303613fooEv,_ZTv0_n12_N7ee303613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee30361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee30361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee30361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee30361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee30361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee30361[] = {
  {&(_ZTV7ee30361[4]),  4,16},
  {&(_ZTV7ee30361[9]),  9,16},
  {&(_ZTV7ee30361[14]),  14,16},
  {&(_tg__ZTV6dd0361__7ee30361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee30361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee30361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee30361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30361[];
extern  VTBL_ENTRY _ZTV7ee30361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30361[];
static VTBL_ENTRY alt_thunk_names627[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee303613fooEv,_ZTv0_n12_N7ee303613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee303613fooEv,_ZThn20_N7ee303613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee303613fooEv,_ZTv0_n16_N7ee303613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee303613fooEv,_ZThn8_N7ee303613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30361 = {  "ee30361", // class name
  bases_ee30361, 4,
  &(vtc_ee30361[0]), // expected_vtbl_contents
  &(vtt_ee30361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names627,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40361  : dd0361 {
  int e;
  virtual void  bar(); // _ZN7ee403613barEv
  ~ee40361(); // tgen
  ee40361(); // tgen
};
//SIG(1 ee40361) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee40361 ::bar(){vfunc_called(this, "_ZN7ee403613barEv");}
ee40361 ::~ee40361(){ note_dtor("ee40361", this);} // tgen
ee40361 ::ee40361(){ note_ctor("ee40361", this);} // tgen

static void Test_ee40361()
{
  extern Class_Descriptor cd_ee40361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40361, buf);
    ee40361 *dp, &lv = *(dp=new (buf) ee40361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee40361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(24,16), "ee40361");
    check_base_class_offset(lv, (cc361*)(dd0361*), 0, "ee40361");
    check_base_class_offset(lv, (dd0361*), 0, "ee40361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40361.e");
    test_class_info(&lv, &cd_ee40361);
    dp->~ee40361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40361(Test_ee40361, "ee40361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40361C1Ev();
extern void _ZN7ee40361D1Ev();
Name_Map name_map_ee40361[] = {
  NSPAIR(_ZN7ee40361C1Ev),
  NSPAIR(_ZN7ee40361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee40361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40361[];
extern void _ZN5cc3613fooEv();
extern void _ZN7ee403613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee403613barEv,_ZTv0_n16_N7ee403613barEv)();
extern void ABISELECT(_ZThn24_N7ee403613barEv,_ZThn16_N7ee403613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN7ee403613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee403613barEv,_ZTv0_n16_N7ee403613barEv),
};
extern VTBL_ENTRY _ZTV7ee40361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee40361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee40361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee40361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee40361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee40361[] = {
  {&(_ZTV7ee40361[3]),  3,11},
  {&(_tg__ZTV6dd0361__7ee40361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee40361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee40361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee40361[4]),  4,6},
  {&(_ZTV7ee40361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee40361[];
extern  VTBL_ENTRY _ZTV7ee40361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40361[];
static VTBL_ENTRY alt_thunk_names628[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee403613barEv,_ZTv0_n16_N7ee403613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee403613barEv,_ZThn16_N7ee403613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40361 = {  "ee40361", // class name
  bases_ee40361, 4,
  &(vtc_ee40361[0]), // expected_vtbl_contents
  &(vtt_ee40361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names628,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50361  : virtual dd0361 {
  int e;
  virtual void  bar(); // _ZN7ee503613barEv
  ~ee50361(); // tgen
  ee50361(); // tgen
};
//SIG(1 ee50361) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee50361 ::bar(){vfunc_called(this, "_ZN7ee503613barEv");}
ee50361 ::~ee50361(){ note_dtor("ee50361", this);} // tgen
ee50361 ::ee50361(){ note_ctor("ee50361", this);} // tgen

static void Test_ee50361()
{
  extern Class_Descriptor cd_ee50361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50361, buf);
    ee50361 *dp, &lv = *(dp=new (buf) ee50361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee50361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(32,20), "ee50361");
    check_base_class_offset(lv, (cc361*)(dd0361*), ABISELECT(16,8), "ee50361");
    check_base_class_offset(lv, (dd0361*), ABISELECT(16,8), "ee50361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50361.e");
    test_class_info(&lv, &cd_ee50361);
    dp->~ee50361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50361(Test_ee50361, "ee50361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50361C1Ev();
extern void _ZN7ee50361D1Ev();
Name_Map name_map_ee50361[] = {
  NSPAIR(_ZN7ee50361C1Ev),
  NSPAIR(_ZN7ee50361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee50361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50361[];
extern void _ZN7ee503613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee503613barEv,_ZTv0_n16_N7ee503613barEv)();
extern void ABISELECT(_ZThn32_N7ee503613barEv,_ZThn20_N7ee503613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50361[0]),
  (VTBL_ENTRY)&_ZN7ee503613barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee503613barEv,_ZTv0_n16_N7ee503613barEv),
};
extern VTBL_ENTRY _ZTV7ee50361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee50361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee50361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee50361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee50361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee50361[] = {
  {&(_ZTV7ee50361[4]),  4,16},
  {&(_ZTV7ee50361[9]),  9,16},
  {&(_ZTV7ee50361[14]),  14,16},
  {&(_tg__ZTV6dd0361__7ee50361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee50361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee50361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee50361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50361[];
extern  VTBL_ENTRY _ZTV7ee50361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50361[];
static VTBL_ENTRY alt_thunk_names629[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee503613barEv,_ZTv0_n16_N7ee503613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee503613barEv,_ZThn20_N7ee503613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50361 = {  "ee50361", // class name
  bases_ee50361, 4,
  &(vtc_ee50361[0]), // expected_vtbl_contents
  &(vtt_ee50361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names629,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60361  : dd0361 {
  int e;
  virtual void  foo(); // _ZN7ee603613fooEv
  virtual void  bar(); // _ZN7ee603613barEv
  ~ee60361(); // tgen
  ee60361(); // tgen
};
//SIG(1 ee60361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee60361 ::foo(){vfunc_called(this, "_ZN7ee603613fooEv");}
void  ee60361 ::bar(){vfunc_called(this, "_ZN7ee603613barEv");}
ee60361 ::~ee60361(){ note_dtor("ee60361", this);} // tgen
ee60361 ::ee60361(){ note_ctor("ee60361", this);} // tgen

static void Test_ee60361()
{
  extern Class_Descriptor cd_ee60361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60361, buf);
    ee60361 *dp, &lv = *(dp=new (buf) ee60361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee60361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(24,16), "ee60361");
    check_base_class_offset(lv, (cc361*)(dd0361*), 0, "ee60361");
    check_base_class_offset(lv, (dd0361*), 0, "ee60361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60361.e");
    test_class_info(&lv, &cd_ee60361);
    dp->~ee60361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60361(Test_ee60361, "ee60361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60361C1Ev();
extern void _ZN7ee60361D1Ev();
Name_Map name_map_ee60361[] = {
  NSPAIR(_ZN7ee60361C1Ev),
  NSPAIR(_ZN7ee60361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee60361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60361[];
extern void _ZN7ee603613fooEv();
extern void _ZN7ee603613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee603613fooEv,_ZTv0_n12_N7ee603613fooEv)();
extern void ABISELECT(_ZThn24_N7ee603613fooEv,_ZThn16_N7ee603613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee603613barEv,_ZTv0_n16_N7ee603613barEv)();
extern void ABISELECT(_ZThn24_N7ee603613barEv,_ZThn16_N7ee603613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60361[0]),
  (VTBL_ENTRY)&_ZN7ee603613fooEv,
  (VTBL_ENTRY)&_ZN7ee603613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee603613fooEv,_ZTv0_n12_N7ee603613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee603613barEv,_ZTv0_n16_N7ee603613barEv),
};
extern VTBL_ENTRY _ZTV7ee60361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee60361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee60361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee60361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee60361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee60361[] = {
  {&(_ZTV7ee60361[3]),  3,11},
  {&(_tg__ZTV6dd0361__7ee60361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee60361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee60361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee60361[4]),  4,6},
  {&(_ZTV7ee60361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60361[];
extern  VTBL_ENTRY _ZTV7ee60361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60361[];
static VTBL_ENTRY alt_thunk_names630[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee603613barEv,_ZTv0_n16_N7ee603613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee603613barEv,_ZThn16_N7ee603613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee603613fooEv,_ZTv0_n12_N7ee603613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee603613fooEv,_ZThn16_N7ee603613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60361 = {  "ee60361", // class name
  bases_ee60361, 4,
  &(vtc_ee60361[0]), // expected_vtbl_contents
  &(vtt_ee60361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60361),6, //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  ee70361  : virtual dd0361 {
  int e;
  virtual void  foo(); // _ZN7ee703613fooEv
  virtual void  bar(); // _ZN7ee703613barEv
  ~ee70361(); // tgen
  ee70361(); // tgen
};
//SIG(1 ee70361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee70361 ::foo(){vfunc_called(this, "_ZN7ee703613fooEv");}
void  ee70361 ::bar(){vfunc_called(this, "_ZN7ee703613barEv");}
ee70361 ::~ee70361(){ note_dtor("ee70361", this);} // tgen
ee70361 ::ee70361(){ note_ctor("ee70361", this);} // tgen

static void Test_ee70361()
{
  extern Class_Descriptor cd_ee70361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70361, buf);
    ee70361 *dp, &lv = *(dp=new (buf) ee70361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee70361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd0361*), ABISELECT(32,20), "ee70361");
    check_base_class_offset(lv, (cc361*)(dd0361*), ABISELECT(16,8), "ee70361");
    check_base_class_offset(lv, (dd0361*), ABISELECT(16,8), "ee70361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70361.e");
    test_class_info(&lv, &cd_ee70361);
    dp->~ee70361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70361(Test_ee70361, "ee70361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70361C1Ev();
extern void _ZN7ee70361D1Ev();
Name_Map name_map_ee70361[] = {
  NSPAIR(_ZN7ee70361C1Ev),
  NSPAIR(_ZN7ee70361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd0361;
extern VTBL_ENTRY _ZTI6dd0361[];
extern  VTBL_ENTRY _ZTV6dd0361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0361[];
static Base_Class bases_ee70361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0361,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee70361[];
extern void _ZN7ee703613fooEv();
extern void _ZN7ee703613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee703613fooEv,_ZTv0_n16_N7ee703613fooEv)();
extern void ABISELECT(_ZThn16_N7ee703613fooEv,_ZThn8_N7ee703613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee703613fooEv,_ZTv0_n12_N7ee703613fooEv)();
extern void ABISELECT(_ZThn32_N7ee703613fooEv,_ZThn20_N7ee703613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee703613barEv,_ZTv0_n16_N7ee703613barEv)();
extern void ABISELECT(_ZThn32_N7ee703613barEv,_ZThn20_N7ee703613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70361[0]),
  (VTBL_ENTRY)&_ZN7ee703613fooEv,
  (VTBL_ENTRY)&_ZN7ee703613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee703613fooEv,_ZTv0_n16_N7ee703613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee703613fooEv,_ZTv0_n12_N7ee703613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee703613barEv,_ZTv0_n16_N7ee703613barEv),
};
extern VTBL_ENTRY _ZTV7ee70361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0361__7ee70361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd0361__7ee70361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd0361__7ee70361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0361__7ee70361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee70361[] = {
  {&(_ZTV7ee70361[4]),  4,17},
  {&(_ZTV7ee70361[10]),  10,17},
  {&(_ZTV7ee70361[15]),  15,17},
  {&(_tg__ZTV6dd0361__7ee70361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd0361__7ee70361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd0361__7ee70361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0361__7ee70361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70361[];
extern  VTBL_ENTRY _ZTV7ee70361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70361[];
static VTBL_ENTRY alt_thunk_names631[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee703613barEv,_ZTv0_n16_N7ee703613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee703613barEv,_ZThn20_N7ee703613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee703613fooEv,_ZTv0_n12_N7ee703613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee703613fooEv,_ZThn20_N7ee703613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee703613fooEv,_ZTv0_n16_N7ee703613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee703613fooEv,_ZThn8_N7ee703613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70361 = {  "ee70361", // class name
  bases_ee70361, 4,
  &(vtc_ee70361[0]), // expected_vtbl_contents
  &(vtt_ee70361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70361),7, //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  dd1361  : virtual cc361 {
  int d;
  ~dd1361(); // tgen
  dd1361(); // tgen
};
//SIG(-1 dd1361) C1{ VBC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} Fi}


dd1361 ::~dd1361(){ note_dtor("dd1361", this);} // tgen
dd1361 ::dd1361(){ note_ctor("dd1361", this);} // tgen

static void Test_dd1361()
{
  extern Class_Descriptor cd_dd1361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1361, buf);
    dd1361 *dp, &lv = *(dp=new (buf) dd1361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd1361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,16), "dd1361");
    check_base_class_offset(lv, (cc361*), ABISELECT(16,8), "dd1361");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1361.d");
    test_class_info(&lv, &cd_dd1361);
    dp->~dd1361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1361(Test_dd1361, "dd1361", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1361C1Ev();
extern void _ZN6dd1361D1Ev();
Name_Map name_map_dd1361[] = {
  NSPAIR(_ZN6dd1361C1Ev),
  NSPAIR(_ZN6dd1361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd1361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1361[];
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd1361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd1361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd1361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd1361[] = {
  {&(_ZTV6dd1361[4]),  4,15},
  {&(_ZTV6dd1361[8]),  8,15},
  {&(_ZTV6dd1361[13]),  13,15},
  {&(_tg__ZTV5cc361__6dd1361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd1361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static VTBL_ENTRY alt_thunk_names632[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1361 = {  "dd1361", // class name
  bases_dd1361, 3,
  &(vtc_dd1361[0]), // expected_vtbl_contents
  &(vtt_dd1361[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1361),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1361),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names632,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01361  : dd1361 {
  int e;
  ~ee01361(); // tgen
  ee01361(); // tgen
};
//SIG(1 ee01361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee01361 ::~ee01361(){ note_dtor("ee01361", this);} // tgen
ee01361 ::ee01361(){ note_ctor("ee01361", this);} // tgen

static void Test_ee01361()
{
  extern Class_Descriptor cd_ee01361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01361, buf);
    ee01361 *dp, &lv = *(dp=new (buf) ee01361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee01361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee01361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(16,12), "ee01361");
    check_base_class_offset(lv, (dd1361*), 0, "ee01361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01361.e");
    test_class_info(&lv, &cd_ee01361);
    dp->~ee01361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01361(Test_ee01361, "ee01361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01361C1Ev();
extern void _ZN7ee01361D1Ev();
Name_Map name_map_ee01361[] = {
  NSPAIR(_ZN7ee01361C1Ev),
  NSPAIR(_ZN7ee01361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee01361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01361[];
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee01361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01361[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee01361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee01361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee01361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee01361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee01361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee01361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee01361[] = {
  {&(_ZTV7ee01361[4]),  4,15},
  {&(_tg__ZTV6dd1361__7ee01361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee01361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee01361[4]),  4,6},
  {&(_ZTV7ee01361[8]),  8,15},
  {&(_ZTV7ee01361[13]),  13,15},
  {&(_tg__ZTV5cc361__7ee01361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee01361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01361[];
extern  VTBL_ENTRY _ZTV7ee01361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01361[];
static VTBL_ENTRY alt_thunk_names633[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01361 = {  "ee01361", // class name
  bases_ee01361, 4,
  &(vtc_ee01361[0]), // expected_vtbl_contents
  &(vtt_ee01361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01361),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01361),8, //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  ee11361  : virtual dd1361 {
  int e;
  ~ee11361(); // tgen
  ee11361(); // tgen
};
//SIG(1 ee11361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee11361 ::~ee11361(){ note_dtor("ee11361", this);} // tgen
ee11361 ::ee11361(){ note_ctor("ee11361", this);} // tgen

static void Test_ee11361()
{
  extern Class_Descriptor cd_ee11361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11361, buf);
    ee11361 *dp, &lv = *(dp=new (buf) ee11361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee11361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee11361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(32,16), "ee11361");
    check_base_class_offset(lv, (dd1361*), ABISELECT(16,8), "ee11361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11361.e");
    test_class_info(&lv, &cd_ee11361);
    dp->~ee11361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11361(Test_ee11361, "ee11361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11361C1Ev();
extern void _ZN7ee11361D1Ev();
Name_Map name_map_ee11361[] = {
  NSPAIR(_ZN7ee11361C1Ev),
  NSPAIR(_ZN7ee11361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee11361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11361[];
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee11361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11361[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11361[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee11361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee11361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee11361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee11361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee11361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee11361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee11361[] = {
  {&(_ZTV7ee11361[5]),  5,20},
  {&(_ZTV7ee11361[9]),  9,20},
  {&(_ZTV7ee11361[13]),  13,20},
  {&(_ZTV7ee11361[18]),  18,20},
  {&(_tg__ZTV6dd1361__7ee11361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee11361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee11361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee11361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee11361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11361[];
extern  VTBL_ENTRY _ZTV7ee11361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11361[];
static VTBL_ENTRY alt_thunk_names634[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11361 = {  "ee11361", // class name
  bases_ee11361, 4,
  &(vtc_ee11361[0]), // expected_vtbl_contents
  &(vtt_ee11361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11361),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names634,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21361  : dd1361 {
  int e;
  virtual void  foo(); // _ZN7ee213613fooEv
  ~ee21361(); // tgen
  ee21361(); // tgen
};
//SIG(1 ee21361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee21361 ::foo(){vfunc_called(this, "_ZN7ee213613fooEv");}
ee21361 ::~ee21361(){ note_dtor("ee21361", this);} // tgen
ee21361 ::ee21361(){ note_ctor("ee21361", this);} // tgen

static void Test_ee21361()
{
  extern Class_Descriptor cd_ee21361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21361, buf);
    ee21361 *dp, &lv = *(dp=new (buf) ee21361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee21361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee21361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(16,12), "ee21361");
    check_base_class_offset(lv, (dd1361*), 0, "ee21361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21361.e");
    test_class_info(&lv, &cd_ee21361);
    dp->~ee21361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21361(Test_ee21361, "ee21361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21361C1Ev();
extern void _ZN7ee21361D1Ev();
Name_Map name_map_ee21361[] = {
  NSPAIR(_ZN7ee21361C1Ev),
  NSPAIR(_ZN7ee21361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee21361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21361[];
extern void _ZN7ee213613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee213613fooEv,_ZTv0_n16_N7ee213613fooEv)();
extern void ABISELECT(_ZThn16_N7ee213613fooEv,_ZThn12_N7ee213613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee213613fooEv,_ZTv0_n12_N7ee213613fooEv)();
extern void ABISELECT(_ZThn32_N7ee213613fooEv,_ZThn20_N7ee213613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee21361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21361[0]),
  (VTBL_ENTRY)&_ZN7ee213613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee213613fooEv,_ZTv0_n16_N7ee213613fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee213613fooEv,_ZTv0_n12_N7ee213613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee21361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee21361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee21361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee21361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee21361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee21361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee21361[] = {
  {&(_ZTV7ee21361[4]),  4,16},
  {&(_tg__ZTV6dd1361__7ee21361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee21361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee21361[4]),  4,6},
  {&(_ZTV7ee21361[9]),  9,16},
  {&(_ZTV7ee21361[14]),  14,16},
  {&(_tg__ZTV5cc361__7ee21361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee21361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21361[];
extern  VTBL_ENTRY _ZTV7ee21361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21361[];
static VTBL_ENTRY alt_thunk_names635[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee213613fooEv,_ZTv0_n12_N7ee213613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee213613fooEv,_ZThn20_N7ee213613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee213613fooEv,_ZTv0_n16_N7ee213613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee213613fooEv,_ZThn12_N7ee213613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21361 = {  "ee21361", // class name
  bases_ee21361, 4,
  &(vtc_ee21361[0]), // expected_vtbl_contents
  &(vtt_ee21361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names635,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31361  : virtual dd1361 {
  int e;
  virtual void  foo(); // _ZN7ee313613fooEv
  ~ee31361(); // tgen
  ee31361(); // tgen
};
//SIG(1 ee31361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee31361 ::foo(){vfunc_called(this, "_ZN7ee313613fooEv");}
ee31361 ::~ee31361(){ note_dtor("ee31361", this);} // tgen
ee31361 ::ee31361(){ note_ctor("ee31361", this);} // tgen

static void Test_ee31361()
{
  extern Class_Descriptor cd_ee31361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31361, buf);
    ee31361 *dp, &lv = *(dp=new (buf) ee31361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee31361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee31361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(32,16), "ee31361");
    check_base_class_offset(lv, (dd1361*), ABISELECT(16,8), "ee31361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31361.e");
    test_class_info(&lv, &cd_ee31361);
    dp->~ee31361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31361(Test_ee31361, "ee31361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31361C1Ev();
extern void _ZN7ee31361D1Ev();
Name_Map name_map_ee31361[] = {
  NSPAIR(_ZN7ee31361C1Ev),
  NSPAIR(_ZN7ee31361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee31361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31361[];
extern void _ZN7ee313613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee313613fooEv,_ZTv0_n16_N7ee313613fooEv)();
extern void ABISELECT(_ZThn32_N7ee313613fooEv,_ZThn16_N7ee313613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee313613fooEv,_ZTv0_n12_N7ee313613fooEv)();
extern void ABISELECT(_ZThn48_N7ee313613fooEv,_ZThn24_N7ee313613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee31361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31361[0]),
  (VTBL_ENTRY)&_ZN7ee313613fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31361[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee313613fooEv,_ZTv0_n16_N7ee313613fooEv),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee313613fooEv,_ZTv0_n12_N7ee313613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee31361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee31361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee31361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee31361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee31361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee31361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee31361[] = {
  {&(_ZTV7ee31361[5]),  5,21},
  {&(_ZTV7ee31361[10]),  10,21},
  {&(_ZTV7ee31361[14]),  14,21},
  {&(_ZTV7ee31361[19]),  19,21},
  {&(_tg__ZTV6dd1361__7ee31361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee31361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee31361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee31361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee31361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31361[];
extern  VTBL_ENTRY _ZTV7ee31361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31361[];
static VTBL_ENTRY alt_thunk_names636[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee313613fooEv,_ZTv0_n12_N7ee313613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee313613fooEv,_ZThn24_N7ee313613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee313613fooEv,_ZTv0_n16_N7ee313613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee313613fooEv,_ZThn16_N7ee313613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31361 = {  "ee31361", // class name
  bases_ee31361, 4,
  &(vtc_ee31361[0]), // expected_vtbl_contents
  &(vtt_ee31361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31361),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names636,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41361  : dd1361 {
  int e;
  virtual void  bar(); // _ZN7ee413613barEv
  ~ee41361(); // tgen
  ee41361(); // tgen
};
//SIG(1 ee41361) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee41361 ::bar(){vfunc_called(this, "_ZN7ee413613barEv");}
ee41361 ::~ee41361(){ note_dtor("ee41361", this);} // tgen
ee41361 ::ee41361(){ note_ctor("ee41361", this);} // tgen

static void Test_ee41361()
{
  extern Class_Descriptor cd_ee41361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41361, buf);
    ee41361 *dp, &lv = *(dp=new (buf) ee41361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee41361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee41361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(16,12), "ee41361");
    check_base_class_offset(lv, (dd1361*), 0, "ee41361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41361.e");
    test_class_info(&lv, &cd_ee41361);
    dp->~ee41361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41361(Test_ee41361, "ee41361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41361C1Ev();
extern void _ZN7ee41361D1Ev();
Name_Map name_map_ee41361[] = {
  NSPAIR(_ZN7ee41361C1Ev),
  NSPAIR(_ZN7ee41361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee41361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41361[];
extern void _ZN7ee413613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee413613barEv,_ZTv0_n16_N7ee413613barEv)();
extern void ABISELECT(_ZThn32_N7ee413613barEv,_ZThn20_N7ee413613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41361[0]),
  (VTBL_ENTRY)&_ZN7ee413613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee413613barEv,_ZTv0_n16_N7ee413613barEv),
};
extern VTBL_ENTRY _ZTV7ee41361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee41361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee41361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee41361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee41361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee41361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee41361[] = {
  {&(_ZTV7ee41361[4]),  4,16},
  {&(_tg__ZTV6dd1361__7ee41361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee41361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee41361[4]),  4,6},
  {&(_ZTV7ee41361[9]),  9,16},
  {&(_ZTV7ee41361[14]),  14,16},
  {&(_tg__ZTV5cc361__7ee41361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee41361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41361[];
extern  VTBL_ENTRY _ZTV7ee41361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41361[];
static VTBL_ENTRY alt_thunk_names637[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee413613barEv,_ZTv0_n16_N7ee413613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee413613barEv,_ZThn20_N7ee413613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41361 = {  "ee41361", // class name
  bases_ee41361, 4,
  &(vtc_ee41361[0]), // expected_vtbl_contents
  &(vtt_ee41361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names637,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51361  : virtual dd1361 {
  int e;
  virtual void  bar(); // _ZN7ee513613barEv
  ~ee51361(); // tgen
  ee51361(); // tgen
};
//SIG(1 ee51361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee51361 ::bar(){vfunc_called(this, "_ZN7ee513613barEv");}
ee51361 ::~ee51361(){ note_dtor("ee51361", this);} // tgen
ee51361 ::ee51361(){ note_ctor("ee51361", this);} // tgen

static void Test_ee51361()
{
  extern Class_Descriptor cd_ee51361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51361, buf);
    ee51361 *dp, &lv = *(dp=new (buf) ee51361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee51361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee51361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(32,16), "ee51361");
    check_base_class_offset(lv, (dd1361*), ABISELECT(16,8), "ee51361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51361.e");
    test_class_info(&lv, &cd_ee51361);
    dp->~ee51361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51361(Test_ee51361, "ee51361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51361C1Ev();
extern void _ZN7ee51361D1Ev();
Name_Map name_map_ee51361[] = {
  NSPAIR(_ZN7ee51361C1Ev),
  NSPAIR(_ZN7ee51361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee51361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51361[];
extern void _ZN7ee513613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee513613barEv,_ZTv0_n16_N7ee513613barEv)();
extern void ABISELECT(_ZThn48_N7ee513613barEv,_ZThn24_N7ee513613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51361[0]),
  (VTBL_ENTRY)&_ZN7ee513613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51361[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee513613barEv,_ZTv0_n16_N7ee513613barEv),
};
extern VTBL_ENTRY _ZTV7ee51361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee51361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee51361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee51361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee51361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee51361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee51361[] = {
  {&(_ZTV7ee51361[5]),  5,21},
  {&(_ZTV7ee51361[10]),  10,21},
  {&(_ZTV7ee51361[14]),  14,21},
  {&(_ZTV7ee51361[19]),  19,21},
  {&(_tg__ZTV6dd1361__7ee51361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee51361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee51361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee51361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee51361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51361[];
extern  VTBL_ENTRY _ZTV7ee51361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51361[];
static VTBL_ENTRY alt_thunk_names638[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee513613barEv,_ZTv0_n16_N7ee513613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee513613barEv,_ZThn24_N7ee513613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51361 = {  "ee51361", // class name
  bases_ee51361, 4,
  &(vtc_ee51361[0]), // expected_vtbl_contents
  &(vtt_ee51361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51361),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names638,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61361  : dd1361 {
  int e;
  virtual void  foo(); // _ZN7ee613613fooEv
  virtual void  bar(); // _ZN7ee613613barEv
  ~ee61361(); // tgen
  ee61361(); // tgen
};
//SIG(1 ee61361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee61361 ::foo(){vfunc_called(this, "_ZN7ee613613fooEv");}
void  ee61361 ::bar(){vfunc_called(this, "_ZN7ee613613barEv");}
ee61361 ::~ee61361(){ note_dtor("ee61361", this);} // tgen
ee61361 ::ee61361(){ note_ctor("ee61361", this);} // tgen

static void Test_ee61361()
{
  extern Class_Descriptor cd_ee61361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61361, buf);
    ee61361 *dp, &lv = *(dp=new (buf) ee61361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee61361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee61361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(16,12), "ee61361");
    check_base_class_offset(lv, (dd1361*), 0, "ee61361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61361.e");
    test_class_info(&lv, &cd_ee61361);
    dp->~ee61361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61361(Test_ee61361, "ee61361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61361C1Ev();
extern void _ZN7ee61361D1Ev();
Name_Map name_map_ee61361[] = {
  NSPAIR(_ZN7ee61361C1Ev),
  NSPAIR(_ZN7ee61361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee61361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61361[];
extern void _ZN7ee613613fooEv();
extern void _ZN7ee613613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee613613fooEv,_ZTv0_n16_N7ee613613fooEv)();
extern void ABISELECT(_ZThn16_N7ee613613fooEv,_ZThn12_N7ee613613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee613613fooEv,_ZTv0_n12_N7ee613613fooEv)();
extern void ABISELECT(_ZThn32_N7ee613613fooEv,_ZThn20_N7ee613613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee613613barEv,_ZTv0_n16_N7ee613613barEv)();
extern void ABISELECT(_ZThn32_N7ee613613barEv,_ZThn20_N7ee613613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61361[0]),
  (VTBL_ENTRY)&_ZN7ee613613fooEv,
  (VTBL_ENTRY)&_ZN7ee613613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee613613fooEv,_ZTv0_n16_N7ee613613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee613613fooEv,_ZTv0_n12_N7ee613613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee613613barEv,_ZTv0_n16_N7ee613613barEv),
};
extern VTBL_ENTRY _ZTV7ee61361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee61361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee61361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee61361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee61361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee61361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee61361[] = {
  {&(_ZTV7ee61361[4]),  4,17},
  {&(_tg__ZTV6dd1361__7ee61361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee61361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee61361[4]),  4,6},
  {&(_ZTV7ee61361[10]),  10,17},
  {&(_ZTV7ee61361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee61361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee61361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61361[];
extern  VTBL_ENTRY _ZTV7ee61361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61361[];
static VTBL_ENTRY alt_thunk_names639[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee613613barEv,_ZTv0_n16_N7ee613613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee613613barEv,_ZThn20_N7ee613613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee613613fooEv,_ZTv0_n12_N7ee613613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee613613fooEv,_ZThn20_N7ee613613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee613613fooEv,_ZTv0_n16_N7ee613613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee613613fooEv,_ZThn12_N7ee613613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61361 = {  "ee61361", // class name
  bases_ee61361, 4,
  &(vtc_ee61361[0]), // expected_vtbl_contents
  &(vtt_ee61361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names639,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71361  : virtual dd1361 {
  int e;
  virtual void  foo(); // _ZN7ee713613fooEv
  virtual void  bar(); // _ZN7ee713613barEv
  ~ee71361(); // tgen
  ee71361(); // tgen
};
//SIG(1 ee71361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee71361 ::foo(){vfunc_called(this, "_ZN7ee713613fooEv");}
void  ee71361 ::bar(){vfunc_called(this, "_ZN7ee713613barEv");}
ee71361 ::~ee71361(){ note_dtor("ee71361", this);} // tgen
ee71361 ::ee71361(){ note_ctor("ee71361", this);} // tgen

static void Test_ee71361()
{
  extern Class_Descriptor cd_ee71361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71361, buf);
    ee71361 *dp, &lv = *(dp=new (buf) ee71361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee71361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee71361");
    check_base_class_offset(lv, (cc361*)(dd1361*), ABISELECT(32,16), "ee71361");
    check_base_class_offset(lv, (dd1361*), ABISELECT(16,8), "ee71361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71361.e");
    test_class_info(&lv, &cd_ee71361);
    dp->~ee71361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71361(Test_ee71361, "ee71361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71361C1Ev();
extern void _ZN7ee71361D1Ev();
Name_Map name_map_ee71361[] = {
  NSPAIR(_ZN7ee71361C1Ev),
  NSPAIR(_ZN7ee71361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd1361;
extern VTBL_ENTRY _ZTI6dd1361[];
extern  VTBL_ENTRY _ZTV6dd1361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1361[];
static Base_Class bases_ee71361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1361,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71361[];
extern void _ZN7ee713613fooEv();
extern void _ZN7ee713613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee713613fooEv,_ZTv0_n16_N7ee713613fooEv)();
extern void ABISELECT(_ZThn32_N7ee713613fooEv,_ZThn16_N7ee713613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee713613fooEv,_ZTv0_n12_N7ee713613fooEv)();
extern void ABISELECT(_ZThn48_N7ee713613fooEv,_ZThn24_N7ee713613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee713613barEv,_ZTv0_n16_N7ee713613barEv)();
extern void ABISELECT(_ZThn48_N7ee713613barEv,_ZThn24_N7ee713613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71361[0]),
  (VTBL_ENTRY)&_ZN7ee713613fooEv,
  (VTBL_ENTRY)&_ZN7ee713613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71361[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee713613fooEv,_ZTv0_n16_N7ee713613fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee713613fooEv,_ZTv0_n12_N7ee713613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee713613barEv,_ZTv0_n16_N7ee713613barEv),
};
extern VTBL_ENTRY _ZTV7ee71361[];
static  VTBL_ENTRY _tg__ZTV6dd1361__7ee71361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd1361__7ee71361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1361__7ee71361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee71361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee71361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee71361[] = {
  {&(_ZTV7ee71361[5]),  5,22},
  {&(_ZTV7ee71361[11]),  11,22},
  {&(_ZTV7ee71361[15]),  15,22},
  {&(_ZTV7ee71361[20]),  20,22},
  {&(_tg__ZTV6dd1361__7ee71361[4]),  4,4},
  {&(_tg__ZTV5cc361__6dd1361__7ee71361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1361__7ee71361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee71361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee71361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71361[];
extern  VTBL_ENTRY _ZTV7ee71361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71361[];
static VTBL_ENTRY alt_thunk_names640[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee713613barEv,_ZTv0_n16_N7ee713613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee713613barEv,_ZThn24_N7ee713613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee713613fooEv,_ZTv0_n12_N7ee713613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee713613fooEv,_ZThn24_N7ee713613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee713613fooEv,_ZTv0_n16_N7ee713613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee713613fooEv,_ZThn16_N7ee713613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71361 = {  "ee71361", // class name
  bases_ee71361, 4,
  &(vtc_ee71361[0]), // expected_vtbl_contents
  &(vtt_ee71361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71361),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names640,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2361  : cc361 {
  int d;
  virtual void  foo(); // _ZN6dd23613fooEv
  ~dd2361(); // tgen
  dd2361(); // tgen
};
//SIG(-1 dd2361) C1{ BC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd2361 ::foo(){vfunc_called(this, "_ZN6dd23613fooEv");}
dd2361 ::~dd2361(){ note_dtor("dd2361", this);} // tgen
dd2361 ::dd2361(){ note_ctor("dd2361", this);} // tgen

static void Test_dd2361()
{
  extern Class_Descriptor cd_dd2361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2361, buf);
    dd2361 *dp, &lv = *(dp=new (buf) dd2361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd2361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(16,12), "dd2361");
    check_base_class_offset(lv, (cc361*), 0, "dd2361");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2361.d");
    test_class_info(&lv, &cd_dd2361);
    dp->~dd2361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2361(Test_dd2361, "dd2361", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2361C1Ev();
extern void _ZN6dd2361D1Ev();
Name_Map name_map_dd2361[] = {
  NSPAIR(_ZN6dd2361C1Ev),
  NSPAIR(_ZN6dd2361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd2361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2361[];
extern void _ZN6dd23613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd2361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd2361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd2361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd2361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd2361[] = {
  {&(_ZTV6dd2361[3]),  3,10},
  {&(_tg__ZTV5cc361__6dd2361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd2361[4]),  4,6},
  {&(_ZTV6dd2361[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static VTBL_ENTRY alt_thunk_names641[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2361 = {  "dd2361", // class name
  bases_dd2361, 3,
  &(vtc_dd2361[0]), // expected_vtbl_contents
  &(vtt_dd2361[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2361),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2361),4, //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  ee02361  : dd2361 {
  int e;
  ~ee02361(); // tgen
  ee02361(); // tgen
};
//SIG(1 ee02361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee02361 ::~ee02361(){ note_dtor("ee02361", this);} // tgen
ee02361 ::ee02361(){ note_ctor("ee02361", this);} // tgen

static void Test_ee02361()
{
  extern Class_Descriptor cd_ee02361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02361, buf);
    ee02361 *dp, &lv = *(dp=new (buf) ee02361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee02361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(24,16), "ee02361");
    check_base_class_offset(lv, (cc361*)(dd2361*), 0, "ee02361");
    check_base_class_offset(lv, (dd2361*), 0, "ee02361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02361.e");
    test_class_info(&lv, &cd_ee02361);
    dp->~ee02361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02361(Test_ee02361, "ee02361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02361C1Ev();
extern void _ZN7ee02361D1Ev();
Name_Map name_map_ee02361[] = {
  NSPAIR(_ZN7ee02361C1Ev),
  NSPAIR(_ZN7ee02361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee02361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02361[];
extern void _ZN6dd23613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee02361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee02361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee02361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee02361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee02361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee02361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee02361[] = {
  {&(_ZTV7ee02361[3]),  3,10},
  {&(_tg__ZTV6dd2361__7ee02361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee02361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee02361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee02361[4]),  4,6},
  {&(_ZTV7ee02361[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee02361[];
extern  VTBL_ENTRY _ZTV7ee02361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02361[];
static VTBL_ENTRY alt_thunk_names642[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02361 = {  "ee02361", // class name
  bases_ee02361, 4,
  &(vtc_ee02361[0]), // expected_vtbl_contents
  &(vtt_ee02361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02361),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names642,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12361  : virtual dd2361 {
  int e;
  ~ee12361(); // tgen
  ee12361(); // tgen
};
//SIG(1 ee12361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee12361 ::~ee12361(){ note_dtor("ee12361", this);} // tgen
ee12361 ::ee12361(){ note_ctor("ee12361", this);} // tgen

static void Test_ee12361()
{
  extern Class_Descriptor cd_ee12361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12361, buf);
    ee12361 *dp, &lv = *(dp=new (buf) ee12361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee12361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(32,20), "ee12361");
    check_base_class_offset(lv, (cc361*)(dd2361*), ABISELECT(16,8), "ee12361");
    check_base_class_offset(lv, (dd2361*), ABISELECT(16,8), "ee12361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12361.e");
    test_class_info(&lv, &cd_ee12361);
    dp->~ee12361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12361(Test_ee12361, "ee12361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12361C1Ev();
extern void _ZN7ee12361D1Ev();
Name_Map name_map_ee12361[] = {
  NSPAIR(_ZN7ee12361C1Ev),
  NSPAIR(_ZN7ee12361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee12361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12361[];
extern void _ZN6dd23613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee12361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12361[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee12361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee12361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee12361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee12361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee12361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee12361[] = {
  {&(_ZTV7ee12361[4]),  4,15},
  {&(_ZTV7ee12361[8]),  8,15},
  {&(_ZTV7ee12361[13]),  13,15},
  {&(_tg__ZTV6dd2361__7ee12361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee12361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee12361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee12361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12361[];
extern  VTBL_ENTRY _ZTV7ee12361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12361[];
static VTBL_ENTRY alt_thunk_names643[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12361 = {  "ee12361", // class name
  bases_ee12361, 4,
  &(vtc_ee12361[0]), // expected_vtbl_contents
  &(vtt_ee12361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12361),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names643,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22361  : dd2361 {
  int e;
  virtual void  foo(); // _ZN7ee223613fooEv
  ~ee22361(); // tgen
  ee22361(); // tgen
};
//SIG(1 ee22361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee22361 ::foo(){vfunc_called(this, "_ZN7ee223613fooEv");}
ee22361 ::~ee22361(){ note_dtor("ee22361", this);} // tgen
ee22361 ::ee22361(){ note_ctor("ee22361", this);} // tgen

static void Test_ee22361()
{
  extern Class_Descriptor cd_ee22361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22361, buf);
    ee22361 *dp, &lv = *(dp=new (buf) ee22361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee22361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(24,16), "ee22361");
    check_base_class_offset(lv, (cc361*)(dd2361*), 0, "ee22361");
    check_base_class_offset(lv, (dd2361*), 0, "ee22361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22361.e");
    test_class_info(&lv, &cd_ee22361);
    dp->~ee22361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22361(Test_ee22361, "ee22361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22361C1Ev();
extern void _ZN7ee22361D1Ev();
Name_Map name_map_ee22361[] = {
  NSPAIR(_ZN7ee22361C1Ev),
  NSPAIR(_ZN7ee22361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee22361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22361[];
extern void _ZN7ee223613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee223613fooEv,_ZTv0_n12_N7ee223613fooEv)();
extern void ABISELECT(_ZThn24_N7ee223613fooEv,_ZThn16_N7ee223613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee22361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22361[0]),
  (VTBL_ENTRY)&_ZN7ee223613fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee223613fooEv,_ZTv0_n12_N7ee223613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee22361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee22361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee22361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee22361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee22361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee22361[] = {
  {&(_ZTV7ee22361[3]),  3,10},
  {&(_tg__ZTV6dd2361__7ee22361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee22361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee22361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee22361[4]),  4,6},
  {&(_ZTV7ee22361[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee22361[];
extern  VTBL_ENTRY _ZTV7ee22361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22361[];
static VTBL_ENTRY alt_thunk_names644[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee223613fooEv,_ZTv0_n12_N7ee223613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee223613fooEv,_ZThn16_N7ee223613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22361 = {  "ee22361", // class name
  bases_ee22361, 4,
  &(vtc_ee22361[0]), // expected_vtbl_contents
  &(vtt_ee22361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22361),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names644,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32361  : virtual dd2361 {
  int e;
  virtual void  foo(); // _ZN7ee323613fooEv
  ~ee32361(); // tgen
  ee32361(); // tgen
};
//SIG(1 ee32361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee32361 ::foo(){vfunc_called(this, "_ZN7ee323613fooEv");}
ee32361 ::~ee32361(){ note_dtor("ee32361", this);} // tgen
ee32361 ::ee32361(){ note_ctor("ee32361", this);} // tgen

static void Test_ee32361()
{
  extern Class_Descriptor cd_ee32361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32361, buf);
    ee32361 *dp, &lv = *(dp=new (buf) ee32361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee32361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(32,20), "ee32361");
    check_base_class_offset(lv, (cc361*)(dd2361*), ABISELECT(16,8), "ee32361");
    check_base_class_offset(lv, (dd2361*), ABISELECT(16,8), "ee32361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32361.e");
    test_class_info(&lv, &cd_ee32361);
    dp->~ee32361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32361(Test_ee32361, "ee32361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32361C1Ev();
extern void _ZN7ee32361D1Ev();
Name_Map name_map_ee32361[] = {
  NSPAIR(_ZN7ee32361C1Ev),
  NSPAIR(_ZN7ee32361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee32361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32361[];
extern void _ZN7ee323613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee323613fooEv,_ZTv0_n16_N7ee323613fooEv)();
extern void ABISELECT(_ZThn16_N7ee323613fooEv,_ZThn8_N7ee323613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee323613fooEv,_ZTv0_n12_N7ee323613fooEv)();
extern void ABISELECT(_ZThn32_N7ee323613fooEv,_ZThn20_N7ee323613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee32361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32361[0]),
  (VTBL_ENTRY)&_ZN7ee323613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee323613fooEv,_ZTv0_n16_N7ee323613fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee323613fooEv,_ZTv0_n12_N7ee323613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee32361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee32361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee32361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee32361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee32361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee32361[] = {
  {&(_ZTV7ee32361[4]),  4,16},
  {&(_ZTV7ee32361[9]),  9,16},
  {&(_ZTV7ee32361[14]),  14,16},
  {&(_tg__ZTV6dd2361__7ee32361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee32361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee32361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee32361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32361[];
extern  VTBL_ENTRY _ZTV7ee32361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32361[];
static VTBL_ENTRY alt_thunk_names645[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee323613fooEv,_ZTv0_n12_N7ee323613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee323613fooEv,_ZThn20_N7ee323613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee323613fooEv,_ZTv0_n16_N7ee323613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee323613fooEv,_ZThn8_N7ee323613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32361 = {  "ee32361", // class name
  bases_ee32361, 4,
  &(vtc_ee32361[0]), // expected_vtbl_contents
  &(vtt_ee32361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names645,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42361  : dd2361 {
  int e;
  virtual void  bar(); // _ZN7ee423613barEv
  ~ee42361(); // tgen
  ee42361(); // tgen
};
//SIG(1 ee42361) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee42361 ::bar(){vfunc_called(this, "_ZN7ee423613barEv");}
ee42361 ::~ee42361(){ note_dtor("ee42361", this);} // tgen
ee42361 ::ee42361(){ note_ctor("ee42361", this);} // tgen

static void Test_ee42361()
{
  extern Class_Descriptor cd_ee42361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42361, buf);
    ee42361 *dp, &lv = *(dp=new (buf) ee42361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee42361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(24,16), "ee42361");
    check_base_class_offset(lv, (cc361*)(dd2361*), 0, "ee42361");
    check_base_class_offset(lv, (dd2361*), 0, "ee42361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42361.e");
    test_class_info(&lv, &cd_ee42361);
    dp->~ee42361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42361(Test_ee42361, "ee42361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42361C1Ev();
extern void _ZN7ee42361D1Ev();
Name_Map name_map_ee42361[] = {
  NSPAIR(_ZN7ee42361C1Ev),
  NSPAIR(_ZN7ee42361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee42361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42361[];
extern void _ZN6dd23613fooEv();
extern void _ZN7ee423613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee423613barEv,_ZTv0_n16_N7ee423613barEv)();
extern void ABISELECT(_ZThn24_N7ee423613barEv,_ZThn16_N7ee423613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
  (VTBL_ENTRY)&_ZN7ee423613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee423613barEv,_ZTv0_n16_N7ee423613barEv),
};
extern VTBL_ENTRY _ZTV7ee42361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee42361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee42361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee42361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee42361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee42361[] = {
  {&(_ZTV7ee42361[3]),  3,11},
  {&(_tg__ZTV6dd2361__7ee42361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee42361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee42361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee42361[4]),  4,6},
  {&(_ZTV7ee42361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42361[];
extern  VTBL_ENTRY _ZTV7ee42361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42361[];
static VTBL_ENTRY alt_thunk_names646[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee423613barEv,_ZTv0_n16_N7ee423613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee423613barEv,_ZThn16_N7ee423613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42361 = {  "ee42361", // class name
  bases_ee42361, 4,
  &(vtc_ee42361[0]), // expected_vtbl_contents
  &(vtt_ee42361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names646,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52361  : virtual dd2361 {
  int e;
  virtual void  bar(); // _ZN7ee523613barEv
  ~ee52361(); // tgen
  ee52361(); // tgen
};
//SIG(1 ee52361) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee52361 ::bar(){vfunc_called(this, "_ZN7ee523613barEv");}
ee52361 ::~ee52361(){ note_dtor("ee52361", this);} // tgen
ee52361 ::ee52361(){ note_ctor("ee52361", this);} // tgen

static void Test_ee52361()
{
  extern Class_Descriptor cd_ee52361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52361, buf);
    ee52361 *dp, &lv = *(dp=new (buf) ee52361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee52361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(32,20), "ee52361");
    check_base_class_offset(lv, (cc361*)(dd2361*), ABISELECT(16,8), "ee52361");
    check_base_class_offset(lv, (dd2361*), ABISELECT(16,8), "ee52361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52361.e");
    test_class_info(&lv, &cd_ee52361);
    dp->~ee52361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52361(Test_ee52361, "ee52361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52361C1Ev();
extern void _ZN7ee52361D1Ev();
Name_Map name_map_ee52361[] = {
  NSPAIR(_ZN7ee52361C1Ev),
  NSPAIR(_ZN7ee52361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee52361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52361[];
extern void _ZN7ee523613barEv();
extern void _ZN6dd23613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee523613barEv,_ZTv0_n16_N7ee523613barEv)();
extern void ABISELECT(_ZThn32_N7ee523613barEv,_ZThn20_N7ee523613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52361[0]),
  (VTBL_ENTRY)&_ZN7ee523613barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee523613barEv,_ZTv0_n16_N7ee523613barEv),
};
extern VTBL_ENTRY _ZTV7ee52361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee52361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee52361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee52361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee52361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee52361[] = {
  {&(_ZTV7ee52361[4]),  4,16},
  {&(_ZTV7ee52361[9]),  9,16},
  {&(_ZTV7ee52361[14]),  14,16},
  {&(_tg__ZTV6dd2361__7ee52361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee52361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee52361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee52361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52361[];
extern  VTBL_ENTRY _ZTV7ee52361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52361[];
static VTBL_ENTRY alt_thunk_names647[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee523613barEv,_ZTv0_n16_N7ee523613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee523613barEv,_ZThn20_N7ee523613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52361 = {  "ee52361", // class name
  bases_ee52361, 4,
  &(vtc_ee52361[0]), // expected_vtbl_contents
  &(vtt_ee52361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names647,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62361  : dd2361 {
  int e;
  virtual void  foo(); // _ZN7ee623613fooEv
  virtual void  bar(); // _ZN7ee623613barEv
  ~ee62361(); // tgen
  ee62361(); // tgen
};
//SIG(1 ee62361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee62361 ::foo(){vfunc_called(this, "_ZN7ee623613fooEv");}
void  ee62361 ::bar(){vfunc_called(this, "_ZN7ee623613barEv");}
ee62361 ::~ee62361(){ note_dtor("ee62361", this);} // tgen
ee62361 ::ee62361(){ note_ctor("ee62361", this);} // tgen

static void Test_ee62361()
{
  extern Class_Descriptor cd_ee62361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62361, buf);
    ee62361 *dp, &lv = *(dp=new (buf) ee62361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee62361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(24,16), "ee62361");
    check_base_class_offset(lv, (cc361*)(dd2361*), 0, "ee62361");
    check_base_class_offset(lv, (dd2361*), 0, "ee62361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62361.e");
    test_class_info(&lv, &cd_ee62361);
    dp->~ee62361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62361(Test_ee62361, "ee62361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62361C1Ev();
extern void _ZN7ee62361D1Ev();
Name_Map name_map_ee62361[] = {
  NSPAIR(_ZN7ee62361C1Ev),
  NSPAIR(_ZN7ee62361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee62361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62361[];
extern void _ZN7ee623613fooEv();
extern void _ZN7ee623613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee623613fooEv,_ZTv0_n12_N7ee623613fooEv)();
extern void ABISELECT(_ZThn24_N7ee623613fooEv,_ZThn16_N7ee623613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee623613barEv,_ZTv0_n16_N7ee623613barEv)();
extern void ABISELECT(_ZThn24_N7ee623613barEv,_ZThn16_N7ee623613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62361[0]),
  (VTBL_ENTRY)&_ZN7ee623613fooEv,
  (VTBL_ENTRY)&_ZN7ee623613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee623613fooEv,_ZTv0_n12_N7ee623613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee623613barEv,_ZTv0_n16_N7ee623613barEv),
};
extern VTBL_ENTRY _ZTV7ee62361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee62361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee62361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee62361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee62361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee62361[] = {
  {&(_ZTV7ee62361[3]),  3,11},
  {&(_tg__ZTV6dd2361__7ee62361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee62361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee62361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee62361[4]),  4,6},
  {&(_ZTV7ee62361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62361[];
extern  VTBL_ENTRY _ZTV7ee62361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62361[];
static VTBL_ENTRY alt_thunk_names648[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23613fooEv,_ZThn16_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee623613barEv,_ZTv0_n16_N7ee623613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee623613barEv,_ZThn16_N7ee623613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee623613fooEv,_ZTv0_n12_N7ee623613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee623613fooEv,_ZThn16_N7ee623613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62361 = {  "ee62361", // class name
  bases_ee62361, 4,
  &(vtc_ee62361[0]), // expected_vtbl_contents
  &(vtt_ee62361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62361),6, //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  ee72361  : virtual dd2361 {
  int e;
  virtual void  foo(); // _ZN7ee723613fooEv
  virtual void  bar(); // _ZN7ee723613barEv
  ~ee72361(); // tgen
  ee72361(); // tgen
};
//SIG(1 ee72361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee72361 ::foo(){vfunc_called(this, "_ZN7ee723613fooEv");}
void  ee72361 ::bar(){vfunc_called(this, "_ZN7ee723613barEv");}
ee72361 ::~ee72361(){ note_dtor("ee72361", this);} // tgen
ee72361 ::ee72361(){ note_ctor("ee72361", this);} // tgen

static void Test_ee72361()
{
  extern Class_Descriptor cd_ee72361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72361, buf);
    ee72361 *dp, &lv = *(dp=new (buf) ee72361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee72361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd2361*), ABISELECT(32,20), "ee72361");
    check_base_class_offset(lv, (cc361*)(dd2361*), ABISELECT(16,8), "ee72361");
    check_base_class_offset(lv, (dd2361*), ABISELECT(16,8), "ee72361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72361.e");
    test_class_info(&lv, &cd_ee72361);
    dp->~ee72361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72361(Test_ee72361, "ee72361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72361C1Ev();
extern void _ZN7ee72361D1Ev();
Name_Map name_map_ee72361[] = {
  NSPAIR(_ZN7ee72361C1Ev),
  NSPAIR(_ZN7ee72361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd2361;
extern VTBL_ENTRY _ZTI6dd2361[];
extern  VTBL_ENTRY _ZTV6dd2361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2361[];
static Base_Class bases_ee72361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2361,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72361[];
extern void _ZN7ee723613fooEv();
extern void _ZN7ee723613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee723613fooEv,_ZTv0_n16_N7ee723613fooEv)();
extern void ABISELECT(_ZThn16_N7ee723613fooEv,_ZThn8_N7ee723613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee723613fooEv,_ZTv0_n12_N7ee723613fooEv)();
extern void ABISELECT(_ZThn32_N7ee723613fooEv,_ZThn20_N7ee723613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee723613barEv,_ZTv0_n16_N7ee723613barEv)();
extern void ABISELECT(_ZThn32_N7ee723613barEv,_ZThn20_N7ee723613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72361[0]),
  (VTBL_ENTRY)&_ZN7ee723613fooEv,
  (VTBL_ENTRY)&_ZN7ee723613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee723613fooEv,_ZTv0_n16_N7ee723613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee723613fooEv,_ZTv0_n12_N7ee723613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee723613barEv,_ZTv0_n16_N7ee723613barEv),
};
extern VTBL_ENTRY _ZTV7ee72361[];
extern void _ZN6dd23613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2361__7ee72361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&_ZN6dd23613fooEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd2361__7ee72361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd2361__7ee72361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv)();
extern void ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2361__7ee72361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee72361[] = {
  {&(_ZTV7ee72361[4]),  4,17},
  {&(_ZTV7ee72361[10]),  10,17},
  {&(_ZTV7ee72361[15]),  15,17},
  {&(_tg__ZTV6dd2361__7ee72361[3]),  3,4},
  {&(_tg__ZTV5cc3616dd2361__7ee72361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd2361__7ee72361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2361__7ee72361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72361[];
extern  VTBL_ENTRY _ZTV7ee72361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72361[];
static VTBL_ENTRY alt_thunk_names649[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23613fooEv,_ZTv0_n12_N6dd23613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23613fooEv,_ZThn12_N6dd23613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee723613barEv,_ZTv0_n16_N7ee723613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee723613barEv,_ZThn20_N7ee723613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee723613fooEv,_ZTv0_n12_N7ee723613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee723613fooEv,_ZThn20_N7ee723613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee723613fooEv,_ZTv0_n16_N7ee723613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee723613fooEv,_ZThn8_N7ee723613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72361 = {  "ee72361", // class name
  bases_ee72361, 4,
  &(vtc_ee72361[0]), // expected_vtbl_contents
  &(vtt_ee72361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72361),7, //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  dd3361  : virtual cc361 {
  int d;
  virtual void  foo(); // _ZN6dd33613fooEv
  ~dd3361(); // tgen
  dd3361(); // tgen
};
//SIG(-1 dd3361) C1{ VBC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd3361 ::foo(){vfunc_called(this, "_ZN6dd33613fooEv");}
dd3361 ::~dd3361(){ note_dtor("dd3361", this);} // tgen
dd3361 ::dd3361(){ note_ctor("dd3361", this);} // tgen

static void Test_dd3361()
{
  extern Class_Descriptor cd_dd3361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3361, buf);
    dd3361 *dp, &lv = *(dp=new (buf) dd3361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd3361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,16), "dd3361");
    check_base_class_offset(lv, (cc361*), ABISELECT(16,8), "dd3361");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3361.d");
    test_class_info(&lv, &cd_dd3361);
    dp->~dd3361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3361(Test_dd3361, "dd3361", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3361C1Ev();
extern void _ZN6dd3361D1Ev();
Name_Map name_map_dd3361[] = {
  NSPAIR(_ZN6dd3361C1Ev),
  NSPAIR(_ZN6dd3361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd3361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc361,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3361[];
extern void _ZN6dd33613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_dd3361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV6dd3361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd3361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd3361[] = {
  {&(_ZTV6dd3361[4]),  4,16},
  {&(_ZTV6dd3361[9]),  9,16},
  {&(_ZTV6dd3361[14]),  14,16},
  {&(_tg__ZTV5cc361__6dd3361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd3361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static VTBL_ENTRY alt_thunk_names650[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3361 = {  "dd3361", // class name
  bases_dd3361, 3,
  &(vtc_dd3361[0]), // expected_vtbl_contents
  &(vtt_dd3361[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3361),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names650,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03361  : dd3361 {
  int e;
  ~ee03361(); // tgen
  ee03361(); // tgen
};
//SIG(1 ee03361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee03361 ::~ee03361(){ note_dtor("ee03361", this);} // tgen
ee03361 ::ee03361(){ note_ctor("ee03361", this);} // tgen

static void Test_ee03361()
{
  extern Class_Descriptor cd_ee03361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03361, buf);
    ee03361 *dp, &lv = *(dp=new (buf) ee03361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee03361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee03361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(16,12), "ee03361");
    check_base_class_offset(lv, (dd3361*), 0, "ee03361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03361.e");
    test_class_info(&lv, &cd_ee03361);
    dp->~ee03361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03361(Test_ee03361, "ee03361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03361C1Ev();
extern void _ZN7ee03361D1Ev();
Name_Map name_map_ee03361[] = {
  NSPAIR(_ZN7ee03361C1Ev),
  NSPAIR(_ZN7ee03361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee03361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03361[];
extern void _ZN6dd33613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee03361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee03361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee03361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee03361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee03361[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee03361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee03361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee03361[] = {
  {&(_ZTV7ee03361[4]),  4,16},
  {&(_tg__ZTV6dd3361__7ee03361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee03361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee03361[4]),  4,6},
  {&(_ZTV7ee03361[9]),  9,16},
  {&(_ZTV7ee03361[14]),  14,16},
  {&(_tg__ZTV5cc361__7ee03361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee03361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03361[];
extern  VTBL_ENTRY _ZTV7ee03361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03361[];
static VTBL_ENTRY alt_thunk_names651[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03361 = {  "ee03361", // class name
  bases_ee03361, 4,
  &(vtc_ee03361[0]), // expected_vtbl_contents
  &(vtt_ee03361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03361),8, //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  ee13361  : virtual dd3361 {
  int e;
  ~ee13361(); // tgen
  ee13361(); // tgen
};
//SIG(1 ee13361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee13361 ::~ee13361(){ note_dtor("ee13361", this);} // tgen
ee13361 ::ee13361(){ note_ctor("ee13361", this);} // tgen

static void Test_ee13361()
{
  extern Class_Descriptor cd_ee13361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13361, buf);
    ee13361 *dp, &lv = *(dp=new (buf) ee13361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee13361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee13361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(32,16), "ee13361");
    check_base_class_offset(lv, (dd3361*), ABISELECT(16,8), "ee13361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13361.e");
    test_class_info(&lv, &cd_ee13361);
    dp->~ee13361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13361(Test_ee13361, "ee13361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13361C1Ev();
extern void _ZN7ee13361D1Ev();
Name_Map name_map_ee13361[] = {
  NSPAIR(_ZN7ee13361C1Ev),
  NSPAIR(_ZN7ee13361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee13361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13361[];
extern void _ZN6dd33613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee13361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13361[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee13361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee13361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee13361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee13361[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee13361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee13361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee13361[] = {
  {&(_ZTV7ee13361[5]),  5,22},
  {&(_ZTV7ee13361[10]),  10,22},
  {&(_ZTV7ee13361[15]),  15,22},
  {&(_ZTV7ee13361[20]),  20,22},
  {&(_tg__ZTV6dd3361__7ee13361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee13361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee13361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee13361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee13361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13361[];
extern  VTBL_ENTRY _ZTV7ee13361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13361[];
static VTBL_ENTRY alt_thunk_names652[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13361 = {  "ee13361", // class name
  bases_ee13361, 4,
  &(vtc_ee13361[0]), // expected_vtbl_contents
  &(vtt_ee13361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13361),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names652,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23361  : dd3361 {
  int e;
  virtual void  foo(); // _ZN7ee233613fooEv
  ~ee23361(); // tgen
  ee23361(); // tgen
};
//SIG(1 ee23361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee23361 ::foo(){vfunc_called(this, "_ZN7ee233613fooEv");}
ee23361 ::~ee23361(){ note_dtor("ee23361", this);} // tgen
ee23361 ::ee23361(){ note_ctor("ee23361", this);} // tgen

static void Test_ee23361()
{
  extern Class_Descriptor cd_ee23361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23361, buf);
    ee23361 *dp, &lv = *(dp=new (buf) ee23361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee23361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee23361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(16,12), "ee23361");
    check_base_class_offset(lv, (dd3361*), 0, "ee23361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23361.e");
    test_class_info(&lv, &cd_ee23361);
    dp->~ee23361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23361(Test_ee23361, "ee23361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23361C1Ev();
extern void _ZN7ee23361D1Ev();
Name_Map name_map_ee23361[] = {
  NSPAIR(_ZN7ee23361C1Ev),
  NSPAIR(_ZN7ee23361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee23361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23361[];
extern void _ZN7ee233613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee233613fooEv,_ZTv0_n16_N7ee233613fooEv)();
extern void ABISELECT(_ZThn16_N7ee233613fooEv,_ZThn12_N7ee233613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee233613fooEv,_ZTv0_n12_N7ee233613fooEv)();
extern void ABISELECT(_ZThn32_N7ee233613fooEv,_ZThn20_N7ee233613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee23361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23361[0]),
  (VTBL_ENTRY)&_ZN7ee233613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee233613fooEv,_ZTv0_n16_N7ee233613fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee233613fooEv,_ZTv0_n12_N7ee233613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee23361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee23361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee23361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee23361[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee23361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee23361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee23361[] = {
  {&(_ZTV7ee23361[4]),  4,16},
  {&(_tg__ZTV6dd3361__7ee23361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee23361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee23361[4]),  4,6},
  {&(_ZTV7ee23361[9]),  9,16},
  {&(_ZTV7ee23361[14]),  14,16},
  {&(_tg__ZTV5cc361__7ee23361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee23361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23361[];
extern  VTBL_ENTRY _ZTV7ee23361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23361[];
static VTBL_ENTRY alt_thunk_names653[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee233613fooEv,_ZTv0_n12_N7ee233613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee233613fooEv,_ZThn20_N7ee233613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee233613fooEv,_ZTv0_n16_N7ee233613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee233613fooEv,_ZThn12_N7ee233613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23361 = {  "ee23361", // class name
  bases_ee23361, 4,
  &(vtc_ee23361[0]), // expected_vtbl_contents
  &(vtt_ee23361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names653,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33361  : virtual dd3361 {
  int e;
  virtual void  foo(); // _ZN7ee333613fooEv
  ~ee33361(); // tgen
  ee33361(); // tgen
};
//SIG(1 ee33361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee33361 ::foo(){vfunc_called(this, "_ZN7ee333613fooEv");}
ee33361 ::~ee33361(){ note_dtor("ee33361", this);} // tgen
ee33361 ::ee33361(){ note_ctor("ee33361", this);} // tgen

static void Test_ee33361()
{
  extern Class_Descriptor cd_ee33361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33361, buf);
    ee33361 *dp, &lv = *(dp=new (buf) ee33361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee33361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee33361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(32,16), "ee33361");
    check_base_class_offset(lv, (dd3361*), ABISELECT(16,8), "ee33361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33361.e");
    test_class_info(&lv, &cd_ee33361);
    dp->~ee33361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33361(Test_ee33361, "ee33361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33361C1Ev();
extern void _ZN7ee33361D1Ev();
Name_Map name_map_ee33361[] = {
  NSPAIR(_ZN7ee33361C1Ev),
  NSPAIR(_ZN7ee33361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee33361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33361[];
extern void _ZN7ee333613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee333613fooEv,_ZTv0_n20_N7ee333613fooEv)();
extern void ABISELECT(_ZThn16_N7ee333613fooEv,_ZThn8_N7ee333613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee333613fooEv,_ZTv0_n16_N7ee333613fooEv)();
extern void ABISELECT(_ZThn32_N7ee333613fooEv,_ZThn16_N7ee333613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee333613fooEv,_ZTv0_n12_N7ee333613fooEv)();
extern void ABISELECT(_ZThn48_N7ee333613fooEv,_ZThn24_N7ee333613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY vtc_ee33361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33361[0]),
  (VTBL_ENTRY)&_ZN7ee333613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee333613fooEv,_ZTv0_n20_N7ee333613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee333613fooEv,_ZTv0_n16_N7ee333613fooEv),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee333613fooEv,_ZTv0_n12_N7ee333613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern VTBL_ENTRY _ZTV7ee33361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee33361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee33361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee33361[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee33361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee33361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee33361[] = {
  {&(_ZTV7ee33361[5]),  5,23},
  {&(_ZTV7ee33361[11]),  11,23},
  {&(_ZTV7ee33361[16]),  16,23},
  {&(_ZTV7ee33361[21]),  21,23},
  {&(_tg__ZTV6dd3361__7ee33361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee33361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee33361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee33361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee33361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33361[];
extern  VTBL_ENTRY _ZTV7ee33361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33361[];
static VTBL_ENTRY alt_thunk_names654[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee333613fooEv,_ZTv0_n12_N7ee333613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee333613fooEv,_ZThn24_N7ee333613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee333613fooEv,_ZTv0_n16_N7ee333613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee333613fooEv,_ZThn16_N7ee333613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee333613fooEv,_ZTv0_n20_N7ee333613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee333613fooEv,_ZThn8_N7ee333613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33361 = {  "ee33361", // class name
  bases_ee33361, 4,
  &(vtc_ee33361[0]), // expected_vtbl_contents
  &(vtt_ee33361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33361),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names654,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43361  : dd3361 {
  int e;
  virtual void  bar(); // _ZN7ee433613barEv
  ~ee43361(); // tgen
  ee43361(); // tgen
};
//SIG(1 ee43361) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee43361 ::bar(){vfunc_called(this, "_ZN7ee433613barEv");}
ee43361 ::~ee43361(){ note_dtor("ee43361", this);} // tgen
ee43361 ::ee43361(){ note_ctor("ee43361", this);} // tgen

static void Test_ee43361()
{
  extern Class_Descriptor cd_ee43361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43361, buf);
    ee43361 *dp, &lv = *(dp=new (buf) ee43361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee43361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee43361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(16,12), "ee43361");
    check_base_class_offset(lv, (dd3361*), 0, "ee43361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43361.e");
    test_class_info(&lv, &cd_ee43361);
    dp->~ee43361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43361(Test_ee43361, "ee43361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43361C1Ev();
extern void _ZN7ee43361D1Ev();
Name_Map name_map_ee43361[] = {
  NSPAIR(_ZN7ee43361C1Ev),
  NSPAIR(_ZN7ee43361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee43361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43361[];
extern void _ZN6dd33613fooEv();
extern void _ZN7ee433613barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee433613barEv,_ZTv0_n16_N7ee433613barEv)();
extern void ABISELECT(_ZThn32_N7ee433613barEv,_ZThn20_N7ee433613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
  (VTBL_ENTRY)&_ZN7ee433613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee433613barEv,_ZTv0_n16_N7ee433613barEv),
};
extern VTBL_ENTRY _ZTV7ee43361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee43361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee43361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee43361[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee43361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee43361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee43361[] = {
  {&(_ZTV7ee43361[4]),  4,17},
  {&(_tg__ZTV6dd3361__7ee43361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee43361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee43361[4]),  4,6},
  {&(_ZTV7ee43361[10]),  10,17},
  {&(_ZTV7ee43361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee43361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee43361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43361[];
extern  VTBL_ENTRY _ZTV7ee43361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43361[];
static VTBL_ENTRY alt_thunk_names655[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee433613barEv,_ZTv0_n16_N7ee433613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee433613barEv,_ZThn20_N7ee433613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43361 = {  "ee43361", // class name
  bases_ee43361, 4,
  &(vtc_ee43361[0]), // expected_vtbl_contents
  &(vtt_ee43361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names655,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53361  : virtual dd3361 {
  int e;
  virtual void  bar(); // _ZN7ee533613barEv
  ~ee53361(); // tgen
  ee53361(); // tgen
};
//SIG(1 ee53361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee53361 ::bar(){vfunc_called(this, "_ZN7ee533613barEv");}
ee53361 ::~ee53361(){ note_dtor("ee53361", this);} // tgen
ee53361 ::ee53361(){ note_ctor("ee53361", this);} // tgen

static void Test_ee53361()
{
  extern Class_Descriptor cd_ee53361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53361, buf);
    ee53361 *dp, &lv = *(dp=new (buf) ee53361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee53361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee53361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(32,16), "ee53361");
    check_base_class_offset(lv, (dd3361*), ABISELECT(16,8), "ee53361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53361.e");
    test_class_info(&lv, &cd_ee53361);
    dp->~ee53361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53361(Test_ee53361, "ee53361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53361C1Ev();
extern void _ZN7ee53361D1Ev();
Name_Map name_map_ee53361[] = {
  NSPAIR(_ZN7ee53361C1Ev),
  NSPAIR(_ZN7ee53361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee53361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53361[];
extern void _ZN7ee533613barEv();
extern void _ZN6dd33613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee533613barEv,_ZTv0_n16_N7ee533613barEv)();
extern void ABISELECT(_ZThn48_N7ee533613barEv,_ZThn24_N7ee533613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53361[0]),
  (VTBL_ENTRY)&_ZN7ee533613barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee533613barEv,_ZTv0_n16_N7ee533613barEv),
};
extern VTBL_ENTRY _ZTV7ee53361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee53361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee53361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee53361[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee53361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee53361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee53361[] = {
  {&(_ZTV7ee53361[5]),  5,23},
  {&(_ZTV7ee53361[11]),  11,23},
  {&(_ZTV7ee53361[16]),  16,23},
  {&(_ZTV7ee53361[21]),  21,23},
  {&(_tg__ZTV6dd3361__7ee53361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee53361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee53361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee53361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee53361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53361[];
extern  VTBL_ENTRY _ZTV7ee53361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53361[];
static VTBL_ENTRY alt_thunk_names656[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee533613barEv,_ZTv0_n16_N7ee533613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee533613barEv,_ZThn24_N7ee533613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53361 = {  "ee53361", // class name
  bases_ee53361, 4,
  &(vtc_ee53361[0]), // expected_vtbl_contents
  &(vtt_ee53361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53361),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names656,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63361  : dd3361 {
  int e;
  virtual void  foo(); // _ZN7ee633613fooEv
  virtual void  bar(); // _ZN7ee633613barEv
  ~ee63361(); // tgen
  ee63361(); // tgen
};
//SIG(1 ee63361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee63361 ::foo(){vfunc_called(this, "_ZN7ee633613fooEv");}
void  ee63361 ::bar(){vfunc_called(this, "_ZN7ee633613barEv");}
ee63361 ::~ee63361(){ note_dtor("ee63361", this);} // tgen
ee63361 ::ee63361(){ note_ctor("ee63361", this);} // tgen

static void Test_ee63361()
{
  extern Class_Descriptor cd_ee63361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63361, buf);
    ee63361 *dp, &lv = *(dp=new (buf) ee63361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee63361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee63361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(16,12), "ee63361");
    check_base_class_offset(lv, (dd3361*), 0, "ee63361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63361.e");
    test_class_info(&lv, &cd_ee63361);
    dp->~ee63361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63361(Test_ee63361, "ee63361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63361C1Ev();
extern void _ZN7ee63361D1Ev();
Name_Map name_map_ee63361[] = {
  NSPAIR(_ZN7ee63361C1Ev),
  NSPAIR(_ZN7ee63361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee63361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63361[];
extern void _ZN7ee633613fooEv();
extern void _ZN7ee633613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee633613fooEv,_ZTv0_n16_N7ee633613fooEv)();
extern void ABISELECT(_ZThn16_N7ee633613fooEv,_ZThn12_N7ee633613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee633613fooEv,_ZTv0_n12_N7ee633613fooEv)();
extern void ABISELECT(_ZThn32_N7ee633613fooEv,_ZThn20_N7ee633613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee633613barEv,_ZTv0_n16_N7ee633613barEv)();
extern void ABISELECT(_ZThn32_N7ee633613barEv,_ZThn20_N7ee633613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63361[0]),
  (VTBL_ENTRY)&_ZN7ee633613fooEv,
  (VTBL_ENTRY)&_ZN7ee633613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee633613fooEv,_ZTv0_n16_N7ee633613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee633613fooEv,_ZTv0_n12_N7ee633613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee633613barEv,_ZTv0_n16_N7ee633613barEv),
};
extern VTBL_ENTRY _ZTV7ee63361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee63361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee63361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee63361[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee63361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee63361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee63361[] = {
  {&(_ZTV7ee63361[4]),  4,17},
  {&(_tg__ZTV6dd3361__7ee63361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee63361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee63361[4]),  4,6},
  {&(_ZTV7ee63361[10]),  10,17},
  {&(_ZTV7ee63361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee63361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee63361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63361[];
extern  VTBL_ENTRY _ZTV7ee63361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63361[];
static VTBL_ENTRY alt_thunk_names657[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn20_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn12_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee633613barEv,_ZTv0_n16_N7ee633613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee633613barEv,_ZThn20_N7ee633613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee633613fooEv,_ZTv0_n12_N7ee633613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee633613fooEv,_ZThn20_N7ee633613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee633613fooEv,_ZTv0_n16_N7ee633613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee633613fooEv,_ZThn12_N7ee633613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63361 = {  "ee63361", // class name
  bases_ee63361, 4,
  &(vtc_ee63361[0]), // expected_vtbl_contents
  &(vtt_ee63361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63361),8, //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  ee73361  : virtual dd3361 {
  int e;
  virtual void  foo(); // _ZN7ee733613fooEv
  virtual void  bar(); // _ZN7ee733613barEv
  ~ee73361(); // tgen
  ee73361(); // tgen
};
//SIG(1 ee73361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee73361 ::foo(){vfunc_called(this, "_ZN7ee733613fooEv");}
void  ee73361 ::bar(){vfunc_called(this, "_ZN7ee733613barEv");}
ee73361 ::~ee73361(){ note_dtor("ee73361", this);} // tgen
ee73361 ::ee73361(){ note_ctor("ee73361", this);} // tgen

static void Test_ee73361()
{
  extern Class_Descriptor cd_ee73361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73361, buf);
    ee73361 *dp, &lv = *(dp=new (buf) ee73361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee73361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee73361");
    check_base_class_offset(lv, (cc361*)(dd3361*), ABISELECT(32,16), "ee73361");
    check_base_class_offset(lv, (dd3361*), ABISELECT(16,8), "ee73361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73361.e");
    test_class_info(&lv, &cd_ee73361);
    dp->~ee73361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73361(Test_ee73361, "ee73361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73361C1Ev();
extern void _ZN7ee73361D1Ev();
Name_Map name_map_ee73361[] = {
  NSPAIR(_ZN7ee73361C1Ev),
  NSPAIR(_ZN7ee73361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd3361;
extern VTBL_ENTRY _ZTI6dd3361[];
extern  VTBL_ENTRY _ZTV6dd3361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3361[];
static Base_Class bases_ee73361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3361,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73361[];
extern void _ZN7ee733613fooEv();
extern void _ZN7ee733613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee733613fooEv,_ZTv0_n20_N7ee733613fooEv)();
extern void ABISELECT(_ZThn16_N7ee733613fooEv,_ZThn8_N7ee733613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee733613fooEv,_ZTv0_n16_N7ee733613fooEv)();
extern void ABISELECT(_ZThn32_N7ee733613fooEv,_ZThn16_N7ee733613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee733613fooEv,_ZTv0_n12_N7ee733613fooEv)();
extern void ABISELECT(_ZThn48_N7ee733613fooEv,_ZThn24_N7ee733613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee733613barEv,_ZTv0_n16_N7ee733613barEv)();
extern void ABISELECT(_ZThn48_N7ee733613barEv,_ZThn24_N7ee733613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73361[0]),
  (VTBL_ENTRY)&_ZN7ee733613fooEv,
  (VTBL_ENTRY)&_ZN7ee733613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee733613fooEv,_ZTv0_n20_N7ee733613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee733613fooEv,_ZTv0_n16_N7ee733613fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee733613fooEv,_ZTv0_n12_N7ee733613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee733613barEv,_ZTv0_n16_N7ee733613barEv),
};
extern VTBL_ENTRY _ZTV7ee73361[];
extern void _ZN6dd33613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3361__7ee73361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&_ZN6dd33613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv)();
extern void ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd3361__7ee73361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv)();
extern void ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3361__7ee73361[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee73361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee73361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee73361[] = {
  {&(_ZTV7ee73361[5]),  5,24},
  {&(_ZTV7ee73361[12]),  12,24},
  {&(_ZTV7ee73361[17]),  17,24},
  {&(_ZTV7ee73361[22]),  22,24},
  {&(_tg__ZTV6dd3361__7ee73361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd3361__7ee73361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3361__7ee73361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee73361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee73361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73361[];
extern  VTBL_ENTRY _ZTV7ee73361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73361[];
static VTBL_ENTRY alt_thunk_names658[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33613fooEv,_ZTv0_n12_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33613fooEv,_ZThn16_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33613fooEv,_ZTv0_n16_N6dd33613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33613fooEv,_ZThn8_N6dd33613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee733613barEv,_ZTv0_n16_N7ee733613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee733613barEv,_ZThn24_N7ee733613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee733613fooEv,_ZTv0_n12_N7ee733613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee733613fooEv,_ZThn24_N7ee733613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee733613fooEv,_ZTv0_n16_N7ee733613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee733613fooEv,_ZThn16_N7ee733613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee733613fooEv,_ZTv0_n20_N7ee733613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee733613fooEv,_ZThn8_N7ee733613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73361 = {  "ee73361", // class name
  bases_ee73361, 4,
  &(vtc_ee73361[0]), // expected_vtbl_contents
  &(vtt_ee73361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73361),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73361),9, //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  dd4361  : cc361 {
  int d;
  virtual void  bar(); // _ZN6dd43613barEv
  ~dd4361(); // tgen
  dd4361(); // tgen
};
//SIG(-1 dd4361) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd4361 ::bar(){vfunc_called(this, "_ZN6dd43613barEv");}
dd4361 ::~dd4361(){ note_dtor("dd4361", this);} // tgen
dd4361 ::dd4361(){ note_ctor("dd4361", this);} // tgen

static void Test_dd4361()
{
  extern Class_Descriptor cd_dd4361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4361, buf);
    dd4361 *dp, &lv = *(dp=new (buf) dd4361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd4361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(16,12), "dd4361");
    check_base_class_offset(lv, (cc361*), 0, "dd4361");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4361.d");
    test_class_info(&lv, &cd_dd4361);
    dp->~dd4361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4361(Test_dd4361, "dd4361", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4361C1Ev();
extern void _ZN6dd4361D1Ev();
Name_Map name_map_dd4361[] = {
  NSPAIR(_ZN6dd4361C1Ev),
  NSPAIR(_ZN6dd4361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd4361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
extern VTBL_ENTRY _ZTV6dd4361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd4361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd4361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd4361[] = {
  {&(_ZTV6dd4361[3]),  3,11},
  {&(_tg__ZTV5cc361__6dd4361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd4361[4]),  4,6},
  {&(_ZTV6dd4361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static VTBL_ENTRY alt_thunk_names659[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4361 = {  "dd4361", // class name
  bases_dd4361, 3,
  &(vtc_dd4361[0]), // expected_vtbl_contents
  &(vtt_dd4361[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4361),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names659,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04361  : dd4361 {
  int e;
  ~ee04361(); // tgen
  ee04361(); // tgen
};
//SIG(1 ee04361) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee04361 ::~ee04361(){ note_dtor("ee04361", this);} // tgen
ee04361 ::ee04361(){ note_ctor("ee04361", this);} // tgen

static void Test_ee04361()
{
  extern Class_Descriptor cd_ee04361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04361, buf);
    ee04361 *dp, &lv = *(dp=new (buf) ee04361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee04361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(24,16), "ee04361");
    check_base_class_offset(lv, (cc361*)(dd4361*), 0, "ee04361");
    check_base_class_offset(lv, (dd4361*), 0, "ee04361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04361.e");
    test_class_info(&lv, &cd_ee04361);
    dp->~ee04361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04361(Test_ee04361, "ee04361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04361C1Ev();
extern void _ZN7ee04361D1Ev();
Name_Map name_map_ee04361[] = {
  NSPAIR(_ZN7ee04361C1Ev),
  NSPAIR(_ZN7ee04361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee04361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
extern VTBL_ENTRY _ZTV7ee04361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee04361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee04361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee04361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee04361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee04361[] = {
  {&(_ZTV7ee04361[3]),  3,11},
  {&(_tg__ZTV6dd4361__7ee04361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee04361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee04361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee04361[4]),  4,6},
  {&(_ZTV7ee04361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee04361[];
extern  VTBL_ENTRY _ZTV7ee04361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04361[];
static VTBL_ENTRY alt_thunk_names660[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04361 = {  "ee04361", // class name
  bases_ee04361, 4,
  &(vtc_ee04361[0]), // expected_vtbl_contents
  &(vtt_ee04361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04361),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  ee14361  : virtual dd4361 {
  int e;
  ~ee14361(); // tgen
  ee14361(); // tgen
};
//SIG(1 ee14361) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee14361 ::~ee14361(){ note_dtor("ee14361", this);} // tgen
ee14361 ::ee14361(){ note_ctor("ee14361", this);} // tgen

static void Test_ee14361()
{
  extern Class_Descriptor cd_ee14361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14361, buf);
    ee14361 *dp, &lv = *(dp=new (buf) ee14361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee14361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(32,20), "ee14361");
    check_base_class_offset(lv, (cc361*)(dd4361*), ABISELECT(16,8), "ee14361");
    check_base_class_offset(lv, (dd4361*), ABISELECT(16,8), "ee14361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14361.e");
    test_class_info(&lv, &cd_ee14361);
    dp->~ee14361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14361(Test_ee14361, "ee14361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14361C1Ev();
extern void _ZN7ee14361D1Ev();
Name_Map name_map_ee14361[] = {
  NSPAIR(_ZN7ee14361C1Ev),
  NSPAIR(_ZN7ee14361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee14361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14361[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
extern VTBL_ENTRY _ZTV7ee14361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee14361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee14361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee14361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee14361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee14361[] = {
  {&(_ZTV7ee14361[4]),  4,17},
  {&(_ZTV7ee14361[9]),  9,17},
  {&(_ZTV7ee14361[15]),  15,17},
  {&(_tg__ZTV6dd4361__7ee14361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee14361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee14361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee14361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14361[];
extern  VTBL_ENTRY _ZTV7ee14361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14361[];
static VTBL_ENTRY alt_thunk_names661[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14361 = {  "ee14361", // class name
  bases_ee14361, 4,
  &(vtc_ee14361[0]), // expected_vtbl_contents
  &(vtt_ee14361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names661,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24361  : dd4361 {
  int e;
  virtual void  foo(); // _ZN7ee243613fooEv
  ~ee24361(); // tgen
  ee24361(); // tgen
};
//SIG(1 ee24361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee24361 ::foo(){vfunc_called(this, "_ZN7ee243613fooEv");}
ee24361 ::~ee24361(){ note_dtor("ee24361", this);} // tgen
ee24361 ::ee24361(){ note_ctor("ee24361", this);} // tgen

static void Test_ee24361()
{
  extern Class_Descriptor cd_ee24361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24361, buf);
    ee24361 *dp, &lv = *(dp=new (buf) ee24361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee24361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(24,16), "ee24361");
    check_base_class_offset(lv, (cc361*)(dd4361*), 0, "ee24361");
    check_base_class_offset(lv, (dd4361*), 0, "ee24361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24361.e");
    test_class_info(&lv, &cd_ee24361);
    dp->~ee24361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24361(Test_ee24361, "ee24361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24361C1Ev();
extern void _ZN7ee24361D1Ev();
Name_Map name_map_ee24361[] = {
  NSPAIR(_ZN7ee24361C1Ev),
  NSPAIR(_ZN7ee24361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee24361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24361[];
extern void _ZN7ee243613fooEv();
extern void _ZN6dd43613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee243613fooEv,_ZTv0_n12_N7ee243613fooEv)();
extern void ABISELECT(_ZThn24_N7ee243613fooEv,_ZThn16_N7ee243613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24361[0]),
  (VTBL_ENTRY)&_ZN7ee243613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee243613fooEv,_ZTv0_n12_N7ee243613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
extern VTBL_ENTRY _ZTV7ee24361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee24361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee24361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee24361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee24361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee24361[] = {
  {&(_ZTV7ee24361[3]),  3,11},
  {&(_tg__ZTV6dd4361__7ee24361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee24361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee24361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee24361[4]),  4,6},
  {&(_ZTV7ee24361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24361[];
extern  VTBL_ENTRY _ZTV7ee24361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24361[];
static VTBL_ENTRY alt_thunk_names662[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee243613fooEv,_ZTv0_n12_N7ee243613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee243613fooEv,_ZThn16_N7ee243613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24361 = {  "ee24361", // class name
  bases_ee24361, 4,
  &(vtc_ee24361[0]), // expected_vtbl_contents
  &(vtt_ee24361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names662,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34361  : virtual dd4361 {
  int e;
  virtual void  foo(); // _ZN7ee343613fooEv
  ~ee34361(); // tgen
  ee34361(); // tgen
};
//SIG(1 ee34361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee34361 ::foo(){vfunc_called(this, "_ZN7ee343613fooEv");}
ee34361 ::~ee34361(){ note_dtor("ee34361", this);} // tgen
ee34361 ::ee34361(){ note_ctor("ee34361", this);} // tgen

static void Test_ee34361()
{
  extern Class_Descriptor cd_ee34361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34361, buf);
    ee34361 *dp, &lv = *(dp=new (buf) ee34361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee34361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(32,20), "ee34361");
    check_base_class_offset(lv, (cc361*)(dd4361*), ABISELECT(16,8), "ee34361");
    check_base_class_offset(lv, (dd4361*), ABISELECT(16,8), "ee34361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34361.e");
    test_class_info(&lv, &cd_ee34361);
    dp->~ee34361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34361(Test_ee34361, "ee34361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34361C1Ev();
extern void _ZN7ee34361D1Ev();
Name_Map name_map_ee34361[] = {
  NSPAIR(_ZN7ee34361C1Ev),
  NSPAIR(_ZN7ee34361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee34361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34361[];
extern void _ZN7ee343613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee343613fooEv,_ZTv0_n16_N7ee343613fooEv)();
extern void ABISELECT(_ZThn16_N7ee343613fooEv,_ZThn8_N7ee343613fooEv)() __attribute__((weak));
extern void _ZN6dd43613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee343613fooEv,_ZTv0_n12_N7ee343613fooEv)();
extern void ABISELECT(_ZThn32_N7ee343613fooEv,_ZThn20_N7ee343613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34361[0]),
  (VTBL_ENTRY)&_ZN7ee343613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee343613fooEv,_ZTv0_n16_N7ee343613fooEv),
  (VTBL_ENTRY)&_ZN6dd43613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee343613fooEv,_ZTv0_n12_N7ee343613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
extern VTBL_ENTRY _ZTV7ee34361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee34361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee34361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee34361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee34361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee34361[] = {
  {&(_ZTV7ee34361[4]),  4,18},
  {&(_ZTV7ee34361[10]),  10,18},
  {&(_ZTV7ee34361[16]),  16,18},
  {&(_tg__ZTV6dd4361__7ee34361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee34361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee34361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee34361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34361[];
extern  VTBL_ENTRY _ZTV7ee34361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34361[];
static VTBL_ENTRY alt_thunk_names663[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee343613fooEv,_ZTv0_n12_N7ee343613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee343613fooEv,_ZThn20_N7ee343613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee343613fooEv,_ZTv0_n16_N7ee343613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee343613fooEv,_ZThn8_N7ee343613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34361 = {  "ee34361", // class name
  bases_ee34361, 4,
  &(vtc_ee34361[0]), // expected_vtbl_contents
  &(vtt_ee34361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34361),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names663,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44361  : dd4361 {
  int e;
  virtual void  bar(); // _ZN7ee443613barEv
  ~ee44361(); // tgen
  ee44361(); // tgen
};
//SIG(1 ee44361) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee44361 ::bar(){vfunc_called(this, "_ZN7ee443613barEv");}
ee44361 ::~ee44361(){ note_dtor("ee44361", this);} // tgen
ee44361 ::ee44361(){ note_ctor("ee44361", this);} // tgen

static void Test_ee44361()
{
  extern Class_Descriptor cd_ee44361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44361, buf);
    ee44361 *dp, &lv = *(dp=new (buf) ee44361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee44361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(24,16), "ee44361");
    check_base_class_offset(lv, (cc361*)(dd4361*), 0, "ee44361");
    check_base_class_offset(lv, (dd4361*), 0, "ee44361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44361.e");
    test_class_info(&lv, &cd_ee44361);
    dp->~ee44361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44361(Test_ee44361, "ee44361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44361C1Ev();
extern void _ZN7ee44361D1Ev();
Name_Map name_map_ee44361[] = {
  NSPAIR(_ZN7ee44361C1Ev),
  NSPAIR(_ZN7ee44361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee44361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44361[];
extern void _ZN5cc3613fooEv();
extern void _ZN7ee443613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee443613barEv,_ZTv0_n16_N7ee443613barEv)();
extern void ABISELECT(_ZThn24_N7ee443613barEv,_ZThn16_N7ee443613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN7ee443613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee443613barEv,_ZTv0_n16_N7ee443613barEv),
};
extern VTBL_ENTRY _ZTV7ee44361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee44361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee44361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee44361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee44361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee44361[] = {
  {&(_ZTV7ee44361[3]),  3,11},
  {&(_tg__ZTV6dd4361__7ee44361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee44361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee44361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee44361[4]),  4,6},
  {&(_ZTV7ee44361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee44361[];
extern  VTBL_ENTRY _ZTV7ee44361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44361[];
static VTBL_ENTRY alt_thunk_names664[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee443613barEv,_ZTv0_n16_N7ee443613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee443613barEv,_ZThn16_N7ee443613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44361 = {  "ee44361", // class name
  bases_ee44361, 4,
  &(vtc_ee44361[0]), // expected_vtbl_contents
  &(vtt_ee44361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names664,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54361  : virtual dd4361 {
  int e;
  virtual void  bar(); // _ZN7ee543613barEv
  ~ee54361(); // tgen
  ee54361(); // tgen
};
//SIG(1 ee54361) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee54361 ::bar(){vfunc_called(this, "_ZN7ee543613barEv");}
ee54361 ::~ee54361(){ note_dtor("ee54361", this);} // tgen
ee54361 ::ee54361(){ note_ctor("ee54361", this);} // tgen

static void Test_ee54361()
{
  extern Class_Descriptor cd_ee54361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54361, buf);
    ee54361 *dp, &lv = *(dp=new (buf) ee54361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee54361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(32,20), "ee54361");
    check_base_class_offset(lv, (cc361*)(dd4361*), ABISELECT(16,8), "ee54361");
    check_base_class_offset(lv, (dd4361*), ABISELECT(16,8), "ee54361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54361.e");
    test_class_info(&lv, &cd_ee54361);
    dp->~ee54361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54361(Test_ee54361, "ee54361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54361C1Ev();
extern void _ZN7ee54361D1Ev();
Name_Map name_map_ee54361[] = {
  NSPAIR(_ZN7ee54361C1Ev),
  NSPAIR(_ZN7ee54361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee54361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54361[];
extern void _ZN7ee543613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee543613barEv,_ZTv0_n20_N7ee543613barEv)();
extern void ABISELECT(_ZThn16_N7ee543613barEv,_ZThn8_N7ee543613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee543613barEv,_ZTv0_n16_N7ee543613barEv)();
extern void ABISELECT(_ZThn32_N7ee543613barEv,_ZThn20_N7ee543613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54361[0]),
  (VTBL_ENTRY)&_ZN7ee543613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee543613barEv,_ZTv0_n20_N7ee543613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee543613barEv,_ZTv0_n16_N7ee543613barEv),
};
extern VTBL_ENTRY _ZTV7ee54361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee54361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee54361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee54361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee54361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee54361[] = {
  {&(_ZTV7ee54361[4]),  4,18},
  {&(_ZTV7ee54361[10]),  10,18},
  {&(_ZTV7ee54361[16]),  16,18},
  {&(_tg__ZTV6dd4361__7ee54361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee54361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee54361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee54361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54361[];
extern  VTBL_ENTRY _ZTV7ee54361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54361[];
static VTBL_ENTRY alt_thunk_names665[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee543613barEv,_ZTv0_n16_N7ee543613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee543613barEv,_ZThn20_N7ee543613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee543613barEv,_ZTv0_n20_N7ee543613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee543613barEv,_ZThn8_N7ee543613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54361 = {  "ee54361", // class name
  bases_ee54361, 4,
  &(vtc_ee54361[0]), // expected_vtbl_contents
  &(vtt_ee54361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54361),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names665,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64361  : dd4361 {
  int e;
  virtual void  foo(); // _ZN7ee643613fooEv
  virtual void  bar(); // _ZN7ee643613barEv
  ~ee64361(); // tgen
  ee64361(); // tgen
};
//SIG(1 ee64361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee64361 ::foo(){vfunc_called(this, "_ZN7ee643613fooEv");}
void  ee64361 ::bar(){vfunc_called(this, "_ZN7ee643613barEv");}
ee64361 ::~ee64361(){ note_dtor("ee64361", this);} // tgen
ee64361 ::ee64361(){ note_ctor("ee64361", this);} // tgen

static void Test_ee64361()
{
  extern Class_Descriptor cd_ee64361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64361, buf);
    ee64361 *dp, &lv = *(dp=new (buf) ee64361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee64361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(24,16), "ee64361");
    check_base_class_offset(lv, (cc361*)(dd4361*), 0, "ee64361");
    check_base_class_offset(lv, (dd4361*), 0, "ee64361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64361.e");
    test_class_info(&lv, &cd_ee64361);
    dp->~ee64361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64361(Test_ee64361, "ee64361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64361C1Ev();
extern void _ZN7ee64361D1Ev();
Name_Map name_map_ee64361[] = {
  NSPAIR(_ZN7ee64361C1Ev),
  NSPAIR(_ZN7ee64361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee64361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64361[];
extern void _ZN7ee643613fooEv();
extern void _ZN7ee643613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee643613fooEv,_ZTv0_n12_N7ee643613fooEv)();
extern void ABISELECT(_ZThn24_N7ee643613fooEv,_ZThn16_N7ee643613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee643613barEv,_ZTv0_n16_N7ee643613barEv)();
extern void ABISELECT(_ZThn24_N7ee643613barEv,_ZThn16_N7ee643613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64361[0]),
  (VTBL_ENTRY)&_ZN7ee643613fooEv,
  (VTBL_ENTRY)&_ZN7ee643613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee643613fooEv,_ZTv0_n12_N7ee643613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee643613barEv,_ZTv0_n16_N7ee643613barEv),
};
extern VTBL_ENTRY _ZTV7ee64361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee64361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee64361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee64361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee64361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee64361[] = {
  {&(_ZTV7ee64361[3]),  3,11},
  {&(_tg__ZTV6dd4361__7ee64361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee64361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee64361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee64361[4]),  4,6},
  {&(_ZTV7ee64361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64361[];
extern  VTBL_ENTRY _ZTV7ee64361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64361[];
static VTBL_ENTRY alt_thunk_names666[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43613barEv,_ZThn16_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee643613barEv,_ZTv0_n16_N7ee643613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee643613barEv,_ZThn16_N7ee643613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee643613fooEv,_ZTv0_n12_N7ee643613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee643613fooEv,_ZThn16_N7ee643613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64361 = {  "ee64361", // class name
  bases_ee64361, 4,
  &(vtc_ee64361[0]), // expected_vtbl_contents
  &(vtt_ee64361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names666,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74361  : virtual dd4361 {
  int e;
  virtual void  foo(); // _ZN7ee743613fooEv
  virtual void  bar(); // _ZN7ee743613barEv
  ~ee74361(); // tgen
  ee74361(); // tgen
};
//SIG(1 ee74361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee74361 ::foo(){vfunc_called(this, "_ZN7ee743613fooEv");}
void  ee74361 ::bar(){vfunc_called(this, "_ZN7ee743613barEv");}
ee74361 ::~ee74361(){ note_dtor("ee74361", this);} // tgen
ee74361 ::ee74361(){ note_ctor("ee74361", this);} // tgen

static void Test_ee74361()
{
  extern Class_Descriptor cd_ee74361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74361, buf);
    ee74361 *dp, &lv = *(dp=new (buf) ee74361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee74361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd4361*), ABISELECT(32,20), "ee74361");
    check_base_class_offset(lv, (cc361*)(dd4361*), ABISELECT(16,8), "ee74361");
    check_base_class_offset(lv, (dd4361*), ABISELECT(16,8), "ee74361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74361.e");
    test_class_info(&lv, &cd_ee74361);
    dp->~ee74361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74361(Test_ee74361, "ee74361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74361C1Ev();
extern void _ZN7ee74361D1Ev();
Name_Map name_map_ee74361[] = {
  NSPAIR(_ZN7ee74361C1Ev),
  NSPAIR(_ZN7ee74361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd4361;
extern VTBL_ENTRY _ZTI6dd4361[];
extern  VTBL_ENTRY _ZTV6dd4361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4361[];
static Base_Class bases_ee74361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74361[];
extern void _ZN7ee743613fooEv();
extern void _ZN7ee743613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee743613fooEv,_ZTv0_n16_N7ee743613fooEv)();
extern void ABISELECT(_ZThn16_N7ee743613fooEv,_ZThn8_N7ee743613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee743613barEv,_ZTv0_n20_N7ee743613barEv)();
extern void ABISELECT(_ZThn16_N7ee743613barEv,_ZThn8_N7ee743613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee743613fooEv,_ZTv0_n12_N7ee743613fooEv)();
extern void ABISELECT(_ZThn32_N7ee743613fooEv,_ZThn20_N7ee743613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee743613barEv,_ZTv0_n16_N7ee743613barEv)();
extern void ABISELECT(_ZThn32_N7ee743613barEv,_ZThn20_N7ee743613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74361[0]),
  (VTBL_ENTRY)&_ZN7ee743613fooEv,
  (VTBL_ENTRY)&_ZN7ee743613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee743613fooEv,_ZTv0_n16_N7ee743613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee743613barEv,_ZTv0_n20_N7ee743613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee743613fooEv,_ZTv0_n12_N7ee743613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee743613barEv,_ZTv0_n16_N7ee743613barEv),
};
extern VTBL_ENTRY _ZTV7ee74361[];
extern void _ZN5cc3613fooEv();
extern void _ZN6dd43613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4361__7ee74361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  (VTBL_ENTRY)&_ZN6dd43613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd4361__7ee74361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd4361__7ee74361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv)();
extern void ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4361__7ee74361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv),
};
static  VTT_ENTRY vtt_ee74361[] = {
  {&(_ZTV7ee74361[4]),  4,19},
  {&(_ZTV7ee74361[11]),  11,19},
  {&(_ZTV7ee74361[17]),  17,19},
  {&(_tg__ZTV6dd4361__7ee74361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd4361__7ee74361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd4361__7ee74361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4361__7ee74361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74361[];
extern  VTBL_ENTRY _ZTV7ee74361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74361[];
static VTBL_ENTRY alt_thunk_names667[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43613barEv,_ZTv0_n16_N6dd43613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43613barEv,_ZThn12_N6dd43613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee743613barEv,_ZTv0_n16_N7ee743613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee743613barEv,_ZThn20_N7ee743613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee743613fooEv,_ZTv0_n12_N7ee743613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee743613fooEv,_ZThn20_N7ee743613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee743613barEv,_ZTv0_n20_N7ee743613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee743613barEv,_ZThn8_N7ee743613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee743613fooEv,_ZTv0_n16_N7ee743613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee743613fooEv,_ZThn8_N7ee743613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74361 = {  "ee74361", // class name
  bases_ee74361, 4,
  &(vtc_ee74361[0]), // expected_vtbl_contents
  &(vtt_ee74361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74361),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names667,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5361  : virtual cc361 {
  int d;
  virtual void  bar(); // _ZN6dd53613barEv
  ~dd5361(); // tgen
  dd5361(); // tgen
};
//SIG(-1 dd5361) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd5361 ::bar(){vfunc_called(this, "_ZN6dd53613barEv");}
dd5361 ::~dd5361(){ note_dtor("dd5361", this);} // tgen
dd5361 ::dd5361(){ note_ctor("dd5361", this);} // tgen

static void Test_dd5361()
{
  extern Class_Descriptor cd_dd5361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5361, buf);
    dd5361 *dp, &lv = *(dp=new (buf) dd5361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd5361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,16), "dd5361");
    check_base_class_offset(lv, (cc361*), ABISELECT(16,8), "dd5361");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5361.d");
    test_class_info(&lv, &cd_dd5361);
    dp->~dd5361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5361(Test_dd5361, "dd5361", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5361C1Ev();
extern void _ZN6dd5361D1Ev();
Name_Map name_map_dd5361[] = {
  NSPAIR(_ZN6dd5361C1Ev),
  NSPAIR(_ZN6dd5361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd5361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc361,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5361[];
extern void _ZN6dd53613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern VTBL_ENTRY _ZTV6dd5361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd5361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd5361[] = {
  {&(_ZTV6dd5361[4]),  4,16},
  {&(_ZTV6dd5361[9]),  9,16},
  {&(_ZTV6dd5361[14]),  14,16},
  {&(_tg__ZTV5cc361__6dd5361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd5361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static VTBL_ENTRY alt_thunk_names668[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5361 = {  "dd5361", // class name
  bases_dd5361, 3,
  &(vtc_dd5361[0]), // expected_vtbl_contents
  &(vtt_dd5361[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5361),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names668,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05361  : dd5361 {
  int e;
  ~ee05361(); // tgen
  ee05361(); // tgen
};
//SIG(1 ee05361) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee05361 ::~ee05361(){ note_dtor("ee05361", this);} // tgen
ee05361 ::ee05361(){ note_ctor("ee05361", this);} // tgen

static void Test_ee05361()
{
  extern Class_Descriptor cd_ee05361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05361, buf);
    ee05361 *dp, &lv = *(dp=new (buf) ee05361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee05361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee05361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(16,12), "ee05361");
    check_base_class_offset(lv, (dd5361*), 0, "ee05361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05361.e");
    test_class_info(&lv, &cd_ee05361);
    dp->~ee05361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05361(Test_ee05361, "ee05361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05361C1Ev();
extern void _ZN7ee05361D1Ev();
Name_Map name_map_ee05361[] = {
  NSPAIR(_ZN7ee05361C1Ev),
  NSPAIR(_ZN7ee05361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee05361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05361[];
extern void _ZN6dd53613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern VTBL_ENTRY _ZTV7ee05361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee05361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee05361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee05361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee05361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee05361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee05361[] = {
  {&(_ZTV7ee05361[4]),  4,16},
  {&(_tg__ZTV6dd5361__7ee05361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee05361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee05361[4]),  4,6},
  {&(_ZTV7ee05361[9]),  9,16},
  {&(_ZTV7ee05361[14]),  14,16},
  {&(_tg__ZTV5cc361__7ee05361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee05361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05361[];
extern  VTBL_ENTRY _ZTV7ee05361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05361[];
static VTBL_ENTRY alt_thunk_names669[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05361 = {  "ee05361", // class name
  bases_ee05361, 4,
  &(vtc_ee05361[0]), // expected_vtbl_contents
  &(vtt_ee05361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names669,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15361  : virtual dd5361 {
  int e;
  ~ee15361(); // tgen
  ee15361(); // tgen
};
//SIG(1 ee15361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee15361 ::~ee15361(){ note_dtor("ee15361", this);} // tgen
ee15361 ::ee15361(){ note_ctor("ee15361", this);} // tgen

static void Test_ee15361()
{
  extern Class_Descriptor cd_ee15361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15361, buf);
    ee15361 *dp, &lv = *(dp=new (buf) ee15361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee15361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee15361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(32,16), "ee15361");
    check_base_class_offset(lv, (dd5361*), ABISELECT(16,8), "ee15361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15361.e");
    test_class_info(&lv, &cd_ee15361);
    dp->~ee15361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15361(Test_ee15361, "ee15361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15361C1Ev();
extern void _ZN7ee15361D1Ev();
Name_Map name_map_ee15361[] = {
  NSPAIR(_ZN7ee15361C1Ev),
  NSPAIR(_ZN7ee15361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee15361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15361[];
extern void _ZN6dd53613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15361[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern VTBL_ENTRY _ZTV7ee15361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee15361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee15361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee15361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee15361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee15361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee15361[] = {
  {&(_ZTV7ee15361[5]),  5,22},
  {&(_ZTV7ee15361[10]),  10,22},
  {&(_ZTV7ee15361[15]),  15,22},
  {&(_ZTV7ee15361[20]),  20,22},
  {&(_tg__ZTV6dd5361__7ee15361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee15361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee15361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee15361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee15361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15361[];
extern  VTBL_ENTRY _ZTV7ee15361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15361[];
static VTBL_ENTRY alt_thunk_names670[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15361 = {  "ee15361", // class name
  bases_ee15361, 4,
  &(vtc_ee15361[0]), // expected_vtbl_contents
  &(vtt_ee15361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15361),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15361),9, //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  ee25361  : dd5361 {
  int e;
  virtual void  foo(); // _ZN7ee253613fooEv
  ~ee25361(); // tgen
  ee25361(); // tgen
};
//SIG(1 ee25361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee25361 ::foo(){vfunc_called(this, "_ZN7ee253613fooEv");}
ee25361 ::~ee25361(){ note_dtor("ee25361", this);} // tgen
ee25361 ::ee25361(){ note_ctor("ee25361", this);} // tgen

static void Test_ee25361()
{
  extern Class_Descriptor cd_ee25361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25361, buf);
    ee25361 *dp, &lv = *(dp=new (buf) ee25361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee25361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee25361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(16,12), "ee25361");
    check_base_class_offset(lv, (dd5361*), 0, "ee25361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25361.e");
    test_class_info(&lv, &cd_ee25361);
    dp->~ee25361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25361(Test_ee25361, "ee25361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25361C1Ev();
extern void _ZN7ee25361D1Ev();
Name_Map name_map_ee25361[] = {
  NSPAIR(_ZN7ee25361C1Ev),
  NSPAIR(_ZN7ee25361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee25361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25361[];
extern void _ZN6dd53613barEv();
extern void _ZN7ee253613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee253613fooEv,_ZTv0_n16_N7ee253613fooEv)();
extern void ABISELECT(_ZThn16_N7ee253613fooEv,_ZThn12_N7ee253613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee253613fooEv,_ZTv0_n12_N7ee253613fooEv)();
extern void ABISELECT(_ZThn32_N7ee253613fooEv,_ZThn20_N7ee253613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
  (VTBL_ENTRY)&_ZN7ee253613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee253613fooEv,_ZTv0_n16_N7ee253613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee253613fooEv,_ZTv0_n12_N7ee253613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern VTBL_ENTRY _ZTV7ee25361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee25361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee25361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee25361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee25361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee25361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee25361[] = {
  {&(_ZTV7ee25361[4]),  4,17},
  {&(_tg__ZTV6dd5361__7ee25361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee25361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee25361[4]),  4,6},
  {&(_ZTV7ee25361[10]),  10,17},
  {&(_ZTV7ee25361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee25361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee25361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25361[];
extern  VTBL_ENTRY _ZTV7ee25361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25361[];
static VTBL_ENTRY alt_thunk_names671[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee253613fooEv,_ZTv0_n12_N7ee253613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee253613fooEv,_ZThn20_N7ee253613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee253613fooEv,_ZTv0_n16_N7ee253613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee253613fooEv,_ZThn12_N7ee253613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25361 = {  "ee25361", // class name
  bases_ee25361, 4,
  &(vtc_ee25361[0]), // expected_vtbl_contents
  &(vtt_ee25361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25361),8, //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  ee35361  : virtual dd5361 {
  int e;
  virtual void  foo(); // _ZN7ee353613fooEv
  ~ee35361(); // tgen
  ee35361(); // tgen
};
//SIG(1 ee35361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee35361 ::foo(){vfunc_called(this, "_ZN7ee353613fooEv");}
ee35361 ::~ee35361(){ note_dtor("ee35361", this);} // tgen
ee35361 ::ee35361(){ note_ctor("ee35361", this);} // tgen

static void Test_ee35361()
{
  extern Class_Descriptor cd_ee35361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35361, buf);
    ee35361 *dp, &lv = *(dp=new (buf) ee35361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee35361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee35361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(32,16), "ee35361");
    check_base_class_offset(lv, (dd5361*), ABISELECT(16,8), "ee35361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35361.e");
    test_class_info(&lv, &cd_ee35361);
    dp->~ee35361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35361(Test_ee35361, "ee35361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35361C1Ev();
extern void _ZN7ee35361D1Ev();
Name_Map name_map_ee35361[] = {
  NSPAIR(_ZN7ee35361C1Ev),
  NSPAIR(_ZN7ee35361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee35361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35361[];
extern void _ZN7ee353613fooEv();
extern void _ZN6dd53613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee353613fooEv,_ZTv0_n16_N7ee353613fooEv)();
extern void ABISELECT(_ZThn32_N7ee353613fooEv,_ZThn16_N7ee353613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee353613fooEv,_ZTv0_n12_N7ee353613fooEv)();
extern void ABISELECT(_ZThn48_N7ee353613fooEv,_ZThn24_N7ee353613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35361[0]),
  (VTBL_ENTRY)&_ZN7ee353613fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee353613fooEv,_ZTv0_n16_N7ee353613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee353613fooEv,_ZTv0_n12_N7ee353613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern VTBL_ENTRY _ZTV7ee35361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee35361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee35361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee35361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee35361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee35361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee35361[] = {
  {&(_ZTV7ee35361[5]),  5,23},
  {&(_ZTV7ee35361[11]),  11,23},
  {&(_ZTV7ee35361[16]),  16,23},
  {&(_ZTV7ee35361[21]),  21,23},
  {&(_tg__ZTV6dd5361__7ee35361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee35361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee35361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee35361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee35361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35361[];
extern  VTBL_ENTRY _ZTV7ee35361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35361[];
static VTBL_ENTRY alt_thunk_names672[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee353613fooEv,_ZTv0_n12_N7ee353613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee353613fooEv,_ZThn24_N7ee353613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee353613fooEv,_ZTv0_n16_N7ee353613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee353613fooEv,_ZThn16_N7ee353613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35361 = {  "ee35361", // class name
  bases_ee35361, 4,
  &(vtc_ee35361[0]), // expected_vtbl_contents
  &(vtt_ee35361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35361),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35361),9, //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  ee45361  : dd5361 {
  int e;
  virtual void  bar(); // _ZN7ee453613barEv
  ~ee45361(); // tgen
  ee45361(); // tgen
};
//SIG(1 ee45361) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee45361 ::bar(){vfunc_called(this, "_ZN7ee453613barEv");}
ee45361 ::~ee45361(){ note_dtor("ee45361", this);} // tgen
ee45361 ::ee45361(){ note_ctor("ee45361", this);} // tgen

static void Test_ee45361()
{
  extern Class_Descriptor cd_ee45361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45361, buf);
    ee45361 *dp, &lv = *(dp=new (buf) ee45361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee45361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee45361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(16,12), "ee45361");
    check_base_class_offset(lv, (dd5361*), 0, "ee45361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45361.e");
    test_class_info(&lv, &cd_ee45361);
    dp->~ee45361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45361(Test_ee45361, "ee45361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45361C1Ev();
extern void _ZN7ee45361D1Ev();
Name_Map name_map_ee45361[] = {
  NSPAIR(_ZN7ee45361C1Ev),
  NSPAIR(_ZN7ee45361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee45361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45361[];
extern void _ZN7ee453613barEv();
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee453613barEv,_ZTv0_n16_N7ee453613barEv)();
extern void ABISELECT(_ZThn32_N7ee453613barEv,_ZThn20_N7ee453613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45361[0]),
  (VTBL_ENTRY)&_ZN7ee453613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee453613barEv,_ZTv0_n16_N7ee453613barEv),
};
extern VTBL_ENTRY _ZTV7ee45361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee45361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee45361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee45361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee45361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee45361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee45361[] = {
  {&(_ZTV7ee45361[4]),  4,16},
  {&(_tg__ZTV6dd5361__7ee45361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee45361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee45361[4]),  4,6},
  {&(_ZTV7ee45361[9]),  9,16},
  {&(_ZTV7ee45361[14]),  14,16},
  {&(_tg__ZTV5cc361__7ee45361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee45361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45361[];
extern  VTBL_ENTRY _ZTV7ee45361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45361[];
static VTBL_ENTRY alt_thunk_names673[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee453613barEv,_ZTv0_n16_N7ee453613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee453613barEv,_ZThn20_N7ee453613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45361 = {  "ee45361", // class name
  bases_ee45361, 4,
  &(vtc_ee45361[0]), // expected_vtbl_contents
  &(vtt_ee45361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45361),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45361),8, //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  ee55361  : virtual dd5361 {
  int e;
  virtual void  bar(); // _ZN7ee553613barEv
  ~ee55361(); // tgen
  ee55361(); // tgen
};
//SIG(1 ee55361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee55361 ::bar(){vfunc_called(this, "_ZN7ee553613barEv");}
ee55361 ::~ee55361(){ note_dtor("ee55361", this);} // tgen
ee55361 ::ee55361(){ note_ctor("ee55361", this);} // tgen

static void Test_ee55361()
{
  extern Class_Descriptor cd_ee55361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55361, buf);
    ee55361 *dp, &lv = *(dp=new (buf) ee55361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee55361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee55361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(32,16), "ee55361");
    check_base_class_offset(lv, (dd5361*), ABISELECT(16,8), "ee55361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55361.e");
    test_class_info(&lv, &cd_ee55361);
    dp->~ee55361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55361(Test_ee55361, "ee55361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55361C1Ev();
extern void _ZN7ee55361D1Ev();
Name_Map name_map_ee55361[] = {
  NSPAIR(_ZN7ee55361C1Ev),
  NSPAIR(_ZN7ee55361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee55361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55361[];
extern void _ZN7ee553613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee553613barEv,_ZTv0_n20_N7ee553613barEv)();
extern void ABISELECT(_ZThn16_N7ee553613barEv,_ZThn8_N7ee553613barEv)() __attribute__((weak));
extern void _ZN5cc3613fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee553613barEv,_ZTv0_n16_N7ee553613barEv)();
extern void ABISELECT(_ZThn48_N7ee553613barEv,_ZThn24_N7ee553613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55361[0]),
  (VTBL_ENTRY)&_ZN7ee553613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee553613barEv,_ZTv0_n20_N7ee553613barEv),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee553613barEv,_ZTv0_n16_N7ee553613barEv),
};
extern VTBL_ENTRY _ZTV7ee55361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee55361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee55361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee55361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee55361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee55361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee55361[] = {
  {&(_ZTV7ee55361[5]),  5,23},
  {&(_ZTV7ee55361[11]),  11,23},
  {&(_ZTV7ee55361[16]),  16,23},
  {&(_ZTV7ee55361[21]),  21,23},
  {&(_tg__ZTV6dd5361__7ee55361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee55361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee55361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee55361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee55361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55361[];
extern  VTBL_ENTRY _ZTV7ee55361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55361[];
static VTBL_ENTRY alt_thunk_names674[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee553613barEv,_ZTv0_n16_N7ee553613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee553613barEv,_ZThn24_N7ee553613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee553613barEv,_ZTv0_n20_N7ee553613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee553613barEv,_ZThn8_N7ee553613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55361 = {  "ee55361", // class name
  bases_ee55361, 4,
  &(vtc_ee55361[0]), // expected_vtbl_contents
  &(vtt_ee55361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55361),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names674,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65361  : dd5361 {
  int e;
  virtual void  foo(); // _ZN7ee653613fooEv
  virtual void  bar(); // _ZN7ee653613barEv
  ~ee65361(); // tgen
  ee65361(); // tgen
};
//SIG(1 ee65361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee65361 ::foo(){vfunc_called(this, "_ZN7ee653613fooEv");}
void  ee65361 ::bar(){vfunc_called(this, "_ZN7ee653613barEv");}
ee65361 ::~ee65361(){ note_dtor("ee65361", this);} // tgen
ee65361 ::ee65361(){ note_ctor("ee65361", this);} // tgen

static void Test_ee65361()
{
  extern Class_Descriptor cd_ee65361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65361, buf);
    ee65361 *dp, &lv = *(dp=new (buf) ee65361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee65361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee65361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(16,12), "ee65361");
    check_base_class_offset(lv, (dd5361*), 0, "ee65361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65361.e");
    test_class_info(&lv, &cd_ee65361);
    dp->~ee65361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65361(Test_ee65361, "ee65361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65361C1Ev();
extern void _ZN7ee65361D1Ev();
Name_Map name_map_ee65361[] = {
  NSPAIR(_ZN7ee65361C1Ev),
  NSPAIR(_ZN7ee65361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee65361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65361[];
extern void _ZN7ee653613barEv();
extern void _ZN7ee653613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee653613fooEv,_ZTv0_n16_N7ee653613fooEv)();
extern void ABISELECT(_ZThn16_N7ee653613fooEv,_ZThn12_N7ee653613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee653613fooEv,_ZTv0_n12_N7ee653613fooEv)();
extern void ABISELECT(_ZThn32_N7ee653613fooEv,_ZThn20_N7ee653613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee653613barEv,_ZTv0_n16_N7ee653613barEv)();
extern void ABISELECT(_ZThn32_N7ee653613barEv,_ZThn20_N7ee653613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65361[0]),
  (VTBL_ENTRY)&_ZN7ee653613barEv,
  (VTBL_ENTRY)&_ZN7ee653613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee653613fooEv,_ZTv0_n16_N7ee653613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee653613fooEv,_ZTv0_n12_N7ee653613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee653613barEv,_ZTv0_n16_N7ee653613barEv),
};
extern VTBL_ENTRY _ZTV7ee65361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee65361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee65361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee65361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee65361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee65361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee65361[] = {
  {&(_ZTV7ee65361[4]),  4,17},
  {&(_tg__ZTV6dd5361__7ee65361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee65361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee65361[4]),  4,6},
  {&(_ZTV7ee65361[10]),  10,17},
  {&(_ZTV7ee65361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee65361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee65361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65361[];
extern  VTBL_ENTRY _ZTV7ee65361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65361[];
static VTBL_ENTRY alt_thunk_names675[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn20_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee653613barEv,_ZTv0_n16_N7ee653613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee653613barEv,_ZThn20_N7ee653613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee653613fooEv,_ZTv0_n12_N7ee653613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee653613fooEv,_ZThn20_N7ee653613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee653613fooEv,_ZTv0_n16_N7ee653613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee653613fooEv,_ZThn12_N7ee653613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65361 = {  "ee65361", // class name
  bases_ee65361, 4,
  &(vtc_ee65361[0]), // expected_vtbl_contents
  &(vtt_ee65361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65361),8, //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  ee75361  : virtual dd5361 {
  int e;
  virtual void  foo(); // _ZN7ee753613fooEv
  virtual void  bar(); // _ZN7ee753613barEv
  ~ee75361(); // tgen
  ee75361(); // tgen
};
//SIG(1 ee75361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee75361 ::foo(){vfunc_called(this, "_ZN7ee753613fooEv");}
void  ee75361 ::bar(){vfunc_called(this, "_ZN7ee753613barEv");}
ee75361 ::~ee75361(){ note_dtor("ee75361", this);} // tgen
ee75361 ::ee75361(){ note_ctor("ee75361", this);} // tgen

static void Test_ee75361()
{
  extern Class_Descriptor cd_ee75361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75361, buf);
    ee75361 *dp, &lv = *(dp=new (buf) ee75361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee75361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee75361");
    check_base_class_offset(lv, (cc361*)(dd5361*), ABISELECT(32,16), "ee75361");
    check_base_class_offset(lv, (dd5361*), ABISELECT(16,8), "ee75361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75361.e");
    test_class_info(&lv, &cd_ee75361);
    dp->~ee75361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75361(Test_ee75361, "ee75361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75361C1Ev();
extern void _ZN7ee75361D1Ev();
Name_Map name_map_ee75361[] = {
  NSPAIR(_ZN7ee75361C1Ev),
  NSPAIR(_ZN7ee75361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd5361;
extern VTBL_ENTRY _ZTI6dd5361[];
extern  VTBL_ENTRY _ZTV6dd5361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5361[];
static Base_Class bases_ee75361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5361,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75361[];
extern void _ZN7ee753613fooEv();
extern void _ZN7ee753613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee753613barEv,_ZTv0_n20_N7ee753613barEv)();
extern void ABISELECT(_ZThn16_N7ee753613barEv,_ZThn8_N7ee753613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee753613fooEv,_ZTv0_n16_N7ee753613fooEv)();
extern void ABISELECT(_ZThn32_N7ee753613fooEv,_ZThn16_N7ee753613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee753613fooEv,_ZTv0_n12_N7ee753613fooEv)();
extern void ABISELECT(_ZThn48_N7ee753613fooEv,_ZThn24_N7ee753613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee753613barEv,_ZTv0_n16_N7ee753613barEv)();
extern void ABISELECT(_ZThn48_N7ee753613barEv,_ZThn24_N7ee753613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75361[0]),
  (VTBL_ENTRY)&_ZN7ee753613fooEv,
  (VTBL_ENTRY)&_ZN7ee753613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee753613barEv,_ZTv0_n20_N7ee753613barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee753613fooEv,_ZTv0_n16_N7ee753613fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee753613fooEv,_ZTv0_n12_N7ee753613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee753613barEv,_ZTv0_n16_N7ee753613barEv),
};
extern VTBL_ENTRY _ZTV7ee75361[];
extern void _ZN6dd53613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5361__7ee75361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN6dd53613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd5361__7ee75361[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv)();
extern void ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5361__7ee75361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee75361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee75361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee75361[] = {
  {&(_ZTV7ee75361[5]),  5,24},
  {&(_ZTV7ee75361[12]),  12,24},
  {&(_ZTV7ee75361[17]),  17,24},
  {&(_ZTV7ee75361[22]),  22,24},
  {&(_tg__ZTV6dd5361__7ee75361[4]),  4,5},
  {&(_tg__ZTV5cc361__6dd5361__7ee75361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5361__7ee75361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee75361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee75361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75361[];
extern  VTBL_ENTRY _ZTV7ee75361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75361[];
static VTBL_ENTRY alt_thunk_names676[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53613barEv,_ZTv0_n16_N6dd53613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53613barEv,_ZThn16_N6dd53613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee753613barEv,_ZTv0_n16_N7ee753613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee753613barEv,_ZThn24_N7ee753613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee753613fooEv,_ZTv0_n12_N7ee753613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee753613fooEv,_ZThn24_N7ee753613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee753613fooEv,_ZTv0_n16_N7ee753613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee753613fooEv,_ZThn16_N7ee753613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee753613barEv,_ZTv0_n20_N7ee753613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee753613barEv,_ZThn8_N7ee753613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75361 = {  "ee75361", // class name
  bases_ee75361, 4,
  &(vtc_ee75361[0]), // expected_vtbl_contents
  &(vtt_ee75361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75361),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75361),9, //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  dd6361  : cc361 {
  int d;
  virtual void  bar(); // _ZN6dd63613barEv
  virtual void  foo(); // _ZN6dd63613fooEv
  ~dd6361(); // tgen
  dd6361(); // tgen
};
//SIG(-1 dd6361) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd6361 ::bar(){vfunc_called(this, "_ZN6dd63613barEv");}
void  dd6361 ::foo(){vfunc_called(this, "_ZN6dd63613fooEv");}
dd6361 ::~dd6361(){ note_dtor("dd6361", this);} // tgen
dd6361 ::dd6361(){ note_ctor("dd6361", this);} // tgen

static void Test_dd6361()
{
  extern Class_Descriptor cd_dd6361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6361, buf);
    dd6361 *dp, &lv = *(dp=new (buf) dd6361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd6361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(16,12), "dd6361");
    check_base_class_offset(lv, (cc361*), 0, "dd6361");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6361.d");
    test_class_info(&lv, &cd_dd6361);
    dp->~dd6361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6361(Test_dd6361, "dd6361", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6361C1Ev();
extern void _ZN6dd6361D1Ev();
Name_Map name_map_dd6361[] = {
  NSPAIR(_ZN6dd6361C1Ev),
  NSPAIR(_ZN6dd6361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd6361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
extern VTBL_ENTRY _ZTV6dd6361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd6361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd6361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd6361[] = {
  {&(_ZTV6dd6361[3]),  3,11},
  {&(_tg__ZTV5cc361__6dd6361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd6361[4]),  4,6},
  {&(_ZTV6dd6361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static VTBL_ENTRY alt_thunk_names677[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6361 = {  "dd6361", // class name
  bases_dd6361, 3,
  &(vtc_dd6361[0]), // expected_vtbl_contents
  &(vtt_dd6361[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6361),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names677,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06361  : dd6361 {
  int e;
  ~ee06361(); // tgen
  ee06361(); // tgen
};
//SIG(1 ee06361) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee06361 ::~ee06361(){ note_dtor("ee06361", this);} // tgen
ee06361 ::ee06361(){ note_ctor("ee06361", this);} // tgen

static void Test_ee06361()
{
  extern Class_Descriptor cd_ee06361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06361, buf);
    ee06361 *dp, &lv = *(dp=new (buf) ee06361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee06361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(24,16), "ee06361");
    check_base_class_offset(lv, (cc361*)(dd6361*), 0, "ee06361");
    check_base_class_offset(lv, (dd6361*), 0, "ee06361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06361.e");
    test_class_info(&lv, &cd_ee06361);
    dp->~ee06361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06361(Test_ee06361, "ee06361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06361C1Ev();
extern void _ZN7ee06361D1Ev();
Name_Map name_map_ee06361[] = {
  NSPAIR(_ZN7ee06361C1Ev),
  NSPAIR(_ZN7ee06361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee06361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
extern VTBL_ENTRY _ZTV7ee06361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee06361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee06361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee06361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee06361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee06361[] = {
  {&(_ZTV7ee06361[3]),  3,11},
  {&(_tg__ZTV6dd6361__7ee06361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee06361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee06361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee06361[4]),  4,6},
  {&(_ZTV7ee06361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06361[];
extern  VTBL_ENTRY _ZTV7ee06361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06361[];
static VTBL_ENTRY alt_thunk_names678[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06361 = {  "ee06361", // class name
  bases_ee06361, 4,
  &(vtc_ee06361[0]), // expected_vtbl_contents
  &(vtt_ee06361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06361),6, //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  ee16361  : virtual dd6361 {
  int e;
  ~ee16361(); // tgen
  ee16361(); // tgen
};
//SIG(1 ee16361) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee16361 ::~ee16361(){ note_dtor("ee16361", this);} // tgen
ee16361 ::ee16361(){ note_ctor("ee16361", this);} // tgen

static void Test_ee16361()
{
  extern Class_Descriptor cd_ee16361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16361, buf);
    ee16361 *dp, &lv = *(dp=new (buf) ee16361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee16361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(32,20), "ee16361");
    check_base_class_offset(lv, (cc361*)(dd6361*), ABISELECT(16,8), "ee16361");
    check_base_class_offset(lv, (dd6361*), ABISELECT(16,8), "ee16361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16361.e");
    test_class_info(&lv, &cd_ee16361);
    dp->~ee16361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16361(Test_ee16361, "ee16361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16361C1Ev();
extern void _ZN7ee16361D1Ev();
Name_Map name_map_ee16361[] = {
  NSPAIR(_ZN7ee16361C1Ev),
  NSPAIR(_ZN7ee16361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee16361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16361[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
extern VTBL_ENTRY _ZTV7ee16361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee16361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee16361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee16361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee16361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee16361[] = {
  {&(_ZTV7ee16361[4]),  4,17},
  {&(_ZTV7ee16361[9]),  9,17},
  {&(_ZTV7ee16361[15]),  15,17},
  {&(_tg__ZTV6dd6361__7ee16361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee16361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee16361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee16361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16361[];
extern  VTBL_ENTRY _ZTV7ee16361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16361[];
static VTBL_ENTRY alt_thunk_names679[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16361 = {  "ee16361", // class name
  bases_ee16361, 4,
  &(vtc_ee16361[0]), // expected_vtbl_contents
  &(vtt_ee16361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names679,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26361  : dd6361 {
  int e;
  virtual void  foo(); // _ZN7ee263613fooEv
  ~ee26361(); // tgen
  ee26361(); // tgen
};
//SIG(1 ee26361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee26361 ::foo(){vfunc_called(this, "_ZN7ee263613fooEv");}
ee26361 ::~ee26361(){ note_dtor("ee26361", this);} // tgen
ee26361 ::ee26361(){ note_ctor("ee26361", this);} // tgen

static void Test_ee26361()
{
  extern Class_Descriptor cd_ee26361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26361, buf);
    ee26361 *dp, &lv = *(dp=new (buf) ee26361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee26361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(24,16), "ee26361");
    check_base_class_offset(lv, (cc361*)(dd6361*), 0, "ee26361");
    check_base_class_offset(lv, (dd6361*), 0, "ee26361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26361.e");
    test_class_info(&lv, &cd_ee26361);
    dp->~ee26361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26361(Test_ee26361, "ee26361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26361C1Ev();
extern void _ZN7ee26361D1Ev();
Name_Map name_map_ee26361[] = {
  NSPAIR(_ZN7ee26361C1Ev),
  NSPAIR(_ZN7ee26361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee26361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26361[];
extern void _ZN7ee263613fooEv();
extern void _ZN6dd63613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee263613fooEv,_ZTv0_n12_N7ee263613fooEv)();
extern void ABISELECT(_ZThn24_N7ee263613fooEv,_ZThn16_N7ee263613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26361[0]),
  (VTBL_ENTRY)&_ZN7ee263613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee263613fooEv,_ZTv0_n12_N7ee263613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
extern VTBL_ENTRY _ZTV7ee26361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee26361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee26361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee26361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee26361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee26361[] = {
  {&(_ZTV7ee26361[3]),  3,11},
  {&(_tg__ZTV6dd6361__7ee26361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee26361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee26361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee26361[4]),  4,6},
  {&(_ZTV7ee26361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26361[];
extern  VTBL_ENTRY _ZTV7ee26361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26361[];
static VTBL_ENTRY alt_thunk_names680[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee263613fooEv,_ZTv0_n12_N7ee263613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee263613fooEv,_ZThn16_N7ee263613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26361 = {  "ee26361", // class name
  bases_ee26361, 4,
  &(vtc_ee26361[0]), // expected_vtbl_contents
  &(vtt_ee26361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names680,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36361  : virtual dd6361 {
  int e;
  virtual void  foo(); // _ZN7ee363613fooEv
  ~ee36361(); // tgen
  ee36361(); // tgen
};
//SIG(1 ee36361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee36361 ::foo(){vfunc_called(this, "_ZN7ee363613fooEv");}
ee36361 ::~ee36361(){ note_dtor("ee36361", this);} // tgen
ee36361 ::ee36361(){ note_ctor("ee36361", this);} // tgen

static void Test_ee36361()
{
  extern Class_Descriptor cd_ee36361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36361, buf);
    ee36361 *dp, &lv = *(dp=new (buf) ee36361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee36361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(32,20), "ee36361");
    check_base_class_offset(lv, (cc361*)(dd6361*), ABISELECT(16,8), "ee36361");
    check_base_class_offset(lv, (dd6361*), ABISELECT(16,8), "ee36361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36361.e");
    test_class_info(&lv, &cd_ee36361);
    dp->~ee36361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36361(Test_ee36361, "ee36361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36361C1Ev();
extern void _ZN7ee36361D1Ev();
Name_Map name_map_ee36361[] = {
  NSPAIR(_ZN7ee36361C1Ev),
  NSPAIR(_ZN7ee36361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee36361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36361[];
extern void _ZN7ee363613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee363613fooEv,_ZTv0_n16_N7ee363613fooEv)();
extern void ABISELECT(_ZThn16_N7ee363613fooEv,_ZThn8_N7ee363613fooEv)() __attribute__((weak));
extern void _ZN6dd63613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee363613fooEv,_ZTv0_n12_N7ee363613fooEv)();
extern void ABISELECT(_ZThn32_N7ee363613fooEv,_ZThn20_N7ee363613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36361[0]),
  (VTBL_ENTRY)&_ZN7ee363613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee363613fooEv,_ZTv0_n16_N7ee363613fooEv),
  (VTBL_ENTRY)&_ZN6dd63613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee363613fooEv,_ZTv0_n12_N7ee363613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
extern VTBL_ENTRY _ZTV7ee36361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee36361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee36361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee36361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee36361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee36361[] = {
  {&(_ZTV7ee36361[4]),  4,18},
  {&(_ZTV7ee36361[10]),  10,18},
  {&(_ZTV7ee36361[16]),  16,18},
  {&(_tg__ZTV6dd6361__7ee36361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee36361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee36361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee36361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36361[];
extern  VTBL_ENTRY _ZTV7ee36361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36361[];
static VTBL_ENTRY alt_thunk_names681[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee363613fooEv,_ZTv0_n12_N7ee363613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee363613fooEv,_ZThn20_N7ee363613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee363613fooEv,_ZTv0_n16_N7ee363613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee363613fooEv,_ZThn8_N7ee363613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36361 = {  "ee36361", // class name
  bases_ee36361, 4,
  &(vtc_ee36361[0]), // expected_vtbl_contents
  &(vtt_ee36361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36361),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names681,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46361  : dd6361 {
  int e;
  virtual void  bar(); // _ZN7ee463613barEv
  ~ee46361(); // tgen
  ee46361(); // tgen
};
//SIG(1 ee46361) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee46361 ::bar(){vfunc_called(this, "_ZN7ee463613barEv");}
ee46361 ::~ee46361(){ note_dtor("ee46361", this);} // tgen
ee46361 ::ee46361(){ note_ctor("ee46361", this);} // tgen

static void Test_ee46361()
{
  extern Class_Descriptor cd_ee46361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46361, buf);
    ee46361 *dp, &lv = *(dp=new (buf) ee46361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee46361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(24,16), "ee46361");
    check_base_class_offset(lv, (cc361*)(dd6361*), 0, "ee46361");
    check_base_class_offset(lv, (dd6361*), 0, "ee46361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46361.e");
    test_class_info(&lv, &cd_ee46361);
    dp->~ee46361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46361(Test_ee46361, "ee46361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46361C1Ev();
extern void _ZN7ee46361D1Ev();
Name_Map name_map_ee46361[] = {
  NSPAIR(_ZN7ee46361C1Ev),
  NSPAIR(_ZN7ee46361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee46361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46361[];
extern void _ZN6dd63613fooEv();
extern void _ZN7ee463613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee463613barEv,_ZTv0_n16_N7ee463613barEv)();
extern void ABISELECT(_ZThn24_N7ee463613barEv,_ZThn16_N7ee463613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN7ee463613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee463613barEv,_ZTv0_n16_N7ee463613barEv),
};
extern VTBL_ENTRY _ZTV7ee46361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee46361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee46361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee46361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee46361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee46361[] = {
  {&(_ZTV7ee46361[3]),  3,11},
  {&(_tg__ZTV6dd6361__7ee46361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee46361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee46361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee46361[4]),  4,6},
  {&(_ZTV7ee46361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46361[];
extern  VTBL_ENTRY _ZTV7ee46361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46361[];
static VTBL_ENTRY alt_thunk_names682[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee463613barEv,_ZTv0_n16_N7ee463613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee463613barEv,_ZThn16_N7ee463613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46361 = {  "ee46361", // class name
  bases_ee46361, 4,
  &(vtc_ee46361[0]), // expected_vtbl_contents
  &(vtt_ee46361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names682,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56361  : virtual dd6361 {
  int e;
  virtual void  bar(); // _ZN7ee563613barEv
  ~ee56361(); // tgen
  ee56361(); // tgen
};
//SIG(1 ee56361) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee56361 ::bar(){vfunc_called(this, "_ZN7ee563613barEv");}
ee56361 ::~ee56361(){ note_dtor("ee56361", this);} // tgen
ee56361 ::ee56361(){ note_ctor("ee56361", this);} // tgen

static void Test_ee56361()
{
  extern Class_Descriptor cd_ee56361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56361, buf);
    ee56361 *dp, &lv = *(dp=new (buf) ee56361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee56361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(32,20), "ee56361");
    check_base_class_offset(lv, (cc361*)(dd6361*), ABISELECT(16,8), "ee56361");
    check_base_class_offset(lv, (dd6361*), ABISELECT(16,8), "ee56361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56361.e");
    test_class_info(&lv, &cd_ee56361);
    dp->~ee56361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56361(Test_ee56361, "ee56361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56361C1Ev();
extern void _ZN7ee56361D1Ev();
Name_Map name_map_ee56361[] = {
  NSPAIR(_ZN7ee56361C1Ev),
  NSPAIR(_ZN7ee56361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee56361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56361[];
extern void _ZN7ee563613barEv();
extern void _ZN6dd63613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee563613barEv,_ZTv0_n20_N7ee563613barEv)();
extern void ABISELECT(_ZThn16_N7ee563613barEv,_ZThn8_N7ee563613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee563613barEv,_ZTv0_n16_N7ee563613barEv)();
extern void ABISELECT(_ZThn32_N7ee563613barEv,_ZThn20_N7ee563613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56361[0]),
  (VTBL_ENTRY)&_ZN7ee563613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee563613barEv,_ZTv0_n20_N7ee563613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee563613barEv,_ZTv0_n16_N7ee563613barEv),
};
extern VTBL_ENTRY _ZTV7ee56361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee56361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee56361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee56361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee56361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee56361[] = {
  {&(_ZTV7ee56361[4]),  4,18},
  {&(_ZTV7ee56361[10]),  10,18},
  {&(_ZTV7ee56361[16]),  16,18},
  {&(_tg__ZTV6dd6361__7ee56361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee56361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee56361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee56361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56361[];
extern  VTBL_ENTRY _ZTV7ee56361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56361[];
static VTBL_ENTRY alt_thunk_names683[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee563613barEv,_ZTv0_n16_N7ee563613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee563613barEv,_ZThn20_N7ee563613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee563613barEv,_ZTv0_n20_N7ee563613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee563613barEv,_ZThn8_N7ee563613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56361 = {  "ee56361", // class name
  bases_ee56361, 4,
  &(vtc_ee56361[0]), // expected_vtbl_contents
  &(vtt_ee56361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56361),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names683,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66361  : dd6361 {
  int e;
  virtual void  foo(); // _ZN7ee663613fooEv
  virtual void  bar(); // _ZN7ee663613barEv
  ~ee66361(); // tgen
  ee66361(); // tgen
};
//SIG(1 ee66361) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66361 ::foo(){vfunc_called(this, "_ZN7ee663613fooEv");}
void  ee66361 ::bar(){vfunc_called(this, "_ZN7ee663613barEv");}
ee66361 ::~ee66361(){ note_dtor("ee66361", this);} // tgen
ee66361 ::ee66361(){ note_ctor("ee66361", this);} // tgen

static void Test_ee66361()
{
  extern Class_Descriptor cd_ee66361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66361, buf);
    ee66361 *dp, &lv = *(dp=new (buf) ee66361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee66361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(24,16), "ee66361");
    check_base_class_offset(lv, (cc361*)(dd6361*), 0, "ee66361");
    check_base_class_offset(lv, (dd6361*), 0, "ee66361");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66361.e");
    test_class_info(&lv, &cd_ee66361);
    dp->~ee66361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66361(Test_ee66361, "ee66361", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66361C1Ev();
extern void _ZN7ee66361D1Ev();
Name_Map name_map_ee66361[] = {
  NSPAIR(_ZN7ee66361C1Ev),
  NSPAIR(_ZN7ee66361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee66361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66361[];
extern void _ZN7ee663613fooEv();
extern void _ZN7ee663613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee663613fooEv,_ZTv0_n12_N7ee663613fooEv)();
extern void ABISELECT(_ZThn24_N7ee663613fooEv,_ZThn16_N7ee663613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee663613barEv,_ZTv0_n16_N7ee663613barEv)();
extern void ABISELECT(_ZThn24_N7ee663613barEv,_ZThn16_N7ee663613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66361[0]),
  (VTBL_ENTRY)&_ZN7ee663613fooEv,
  (VTBL_ENTRY)&_ZN7ee663613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee663613fooEv,_ZTv0_n12_N7ee663613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee663613barEv,_ZTv0_n16_N7ee663613barEv),
};
extern VTBL_ENTRY _ZTV7ee66361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee66361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee66361[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee66361[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee66361[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee66361[] = {
  {&(_ZTV7ee66361[3]),  3,11},
  {&(_tg__ZTV6dd6361__7ee66361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee66361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee66361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee66361[4]),  4,6},
  {&(_ZTV7ee66361[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66361[];
extern  VTBL_ENTRY _ZTV7ee66361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66361[];
static VTBL_ENTRY alt_thunk_names684[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613barEv,_ZThn16_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63613fooEv,_ZThn16_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3613fooEv,_ZThn16_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee663613barEv,_ZTv0_n16_N7ee663613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee663613barEv,_ZThn16_N7ee663613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee663613fooEv,_ZTv0_n12_N7ee663613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee663613fooEv,_ZThn16_N7ee663613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66361 = {  "ee66361", // class name
  bases_ee66361, 4,
  &(vtc_ee66361[0]), // expected_vtbl_contents
  &(vtt_ee66361[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66361),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66361),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names684,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76361  : virtual dd6361 {
  int e;
  virtual void  foo(); // _ZN7ee763613fooEv
  virtual void  bar(); // _ZN7ee763613barEv
  ~ee76361(); // tgen
  ee76361(); // tgen
};
//SIG(1 ee76361) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76361 ::foo(){vfunc_called(this, "_ZN7ee763613fooEv");}
void  ee76361 ::bar(){vfunc_called(this, "_ZN7ee763613barEv");}
ee76361 ::~ee76361(){ note_dtor("ee76361", this);} // tgen
ee76361 ::ee76361(){ note_ctor("ee76361", this);} // tgen

static void Test_ee76361()
{
  extern Class_Descriptor cd_ee76361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76361, buf);
    ee76361 *dp, &lv = *(dp=new (buf) ee76361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee76361");
    check_base_class_offset(lv, (bb61*)(cc361*)(dd6361*), ABISELECT(32,20), "ee76361");
    check_base_class_offset(lv, (cc361*)(dd6361*), ABISELECT(16,8), "ee76361");
    check_base_class_offset(lv, (dd6361*), ABISELECT(16,8), "ee76361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76361.e");
    test_class_info(&lv, &cd_ee76361);
    dp->~ee76361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76361(Test_ee76361, "ee76361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76361C1Ev();
extern void _ZN7ee76361D1Ev();
Name_Map name_map_ee76361[] = {
  NSPAIR(_ZN7ee76361C1Ev),
  NSPAIR(_ZN7ee76361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd6361;
extern VTBL_ENTRY _ZTI6dd6361[];
extern  VTBL_ENTRY _ZTV6dd6361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6361[];
static Base_Class bases_ee76361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc361,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76361[];
extern void _ZN7ee763613fooEv();
extern void _ZN7ee763613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee763613fooEv,_ZTv0_n16_N7ee763613fooEv)();
extern void ABISELECT(_ZThn16_N7ee763613fooEv,_ZThn8_N7ee763613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee763613barEv,_ZTv0_n20_N7ee763613barEv)();
extern void ABISELECT(_ZThn16_N7ee763613barEv,_ZThn8_N7ee763613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee763613fooEv,_ZTv0_n12_N7ee763613fooEv)();
extern void ABISELECT(_ZThn32_N7ee763613fooEv,_ZThn20_N7ee763613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee763613barEv,_ZTv0_n16_N7ee763613barEv)();
extern void ABISELECT(_ZThn32_N7ee763613barEv,_ZThn20_N7ee763613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76361[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76361[0]),
  (VTBL_ENTRY)&_ZN7ee763613fooEv,
  (VTBL_ENTRY)&_ZN7ee763613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee763613fooEv,_ZTv0_n16_N7ee763613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee763613barEv,_ZTv0_n20_N7ee763613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee763613fooEv,_ZTv0_n12_N7ee763613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee763613barEv,_ZTv0_n16_N7ee763613barEv),
};
extern VTBL_ENTRY _ZTV7ee76361[];
extern void _ZN6dd63613fooEv();
extern void _ZN6dd63613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6361__7ee76361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&_ZN6dd63613fooEv,
  (VTBL_ENTRY)&_ZN6dd63613barEv,
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3616dd6361__7ee76361[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc3616dd6361__7ee76361[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv)();
extern void ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv)();
extern void ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6361__7ee76361[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv),
};
static  VTT_ENTRY vtt_ee76361[] = {
  {&(_ZTV7ee76361[4]),  4,19},
  {&(_ZTV7ee76361[11]),  11,19},
  {&(_ZTV7ee76361[17]),  17,19},
  {&(_tg__ZTV6dd6361__7ee76361[3]),  3,5},
  {&(_tg__ZTV5cc3616dd6361__7ee76361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc3616dd6361__7ee76361[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6361__7ee76361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76361[];
extern  VTBL_ENTRY _ZTV7ee76361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76361[];
static VTBL_ENTRY alt_thunk_names685[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63613barEv,_ZTv0_n16_N6dd63613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613barEv,_ZThn12_N6dd63613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63613fooEv,_ZTv0_n12_N6dd63613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63613fooEv,_ZThn12_N6dd63613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn12_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee763613barEv,_ZTv0_n16_N7ee763613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee763613barEv,_ZThn20_N7ee763613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee763613fooEv,_ZTv0_n12_N7ee763613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee763613fooEv,_ZThn20_N7ee763613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee763613barEv,_ZTv0_n20_N7ee763613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee763613barEv,_ZThn8_N7ee763613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee763613fooEv,_ZTv0_n16_N7ee763613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee763613fooEv,_ZThn8_N7ee763613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76361 = {  "ee76361", // class name
  bases_ee76361, 4,
  &(vtc_ee76361[0]), // expected_vtbl_contents
  &(vtt_ee76361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76361),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76361),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names685,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7361  : virtual cc361 {
  int d;
  virtual void  bar(); // _ZN6dd73613barEv
  virtual void  foo(); // _ZN6dd73613fooEv
  ~dd7361(); // tgen
  dd7361(); // tgen
};
//SIG(-1 dd7361) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd7361 ::bar(){vfunc_called(this, "_ZN6dd73613barEv");}
void  dd7361 ::foo(){vfunc_called(this, "_ZN6dd73613fooEv");}
dd7361 ::~dd7361(){ note_dtor("dd7361", this);} // tgen
dd7361 ::dd7361(){ note_ctor("dd7361", this);} // tgen

static void Test_dd7361()
{
  extern Class_Descriptor cd_dd7361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7361, buf);
    dd7361 *dp, &lv = *(dp=new (buf) dd7361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd7361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,16), "dd7361");
    check_base_class_offset(lv, (cc361*), ABISELECT(16,8), "dd7361");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7361.d");
    test_class_info(&lv, &cd_dd7361);
    dp->~dd7361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7361(Test_dd7361, "dd7361", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7361C1Ev();
extern void _ZN6dd7361D1Ev();
Name_Map name_map_dd7361[] = {
  NSPAIR(_ZN6dd7361C1Ev),
  NSPAIR(_ZN6dd7361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
static Base_Class bases_dd7361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc361,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern VTBL_ENTRY _ZTV6dd7361[];
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__6dd7361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_dd7361[] = {
  {&(_ZTV6dd7361[4]),  4,17},
  {&(_ZTV6dd7361[10]),  10,17},
  {&(_ZTV6dd7361[15]),  15,17},
  {&(_tg__ZTV5cc361__6dd7361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__6dd7361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static VTBL_ENTRY alt_thunk_names686[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7361 = {  "dd7361", // class name
  bases_dd7361, 3,
  &(vtc_dd7361[0]), // expected_vtbl_contents
  &(vtt_dd7361[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7361),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names686,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07361  : dd7361 {
  int e;
  ~ee07361(); // tgen
  ee07361(); // tgen
};
//SIG(1 ee07361) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee07361 ::~ee07361(){ note_dtor("ee07361", this);} // tgen
ee07361 ::ee07361(){ note_ctor("ee07361", this);} // tgen

static void Test_ee07361()
{
  extern Class_Descriptor cd_ee07361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07361, buf);
    ee07361 *dp, &lv = *(dp=new (buf) ee07361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee07361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee07361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(16,12), "ee07361");
    check_base_class_offset(lv, (dd7361*), 0, "ee07361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07361.e");
    test_class_info(&lv, &cd_ee07361);
    dp->~ee07361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07361(Test_ee07361, "ee07361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07361C1Ev();
extern void _ZN7ee07361D1Ev();
Name_Map name_map_ee07361[] = {
  NSPAIR(_ZN7ee07361C1Ev),
  NSPAIR(_ZN7ee07361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee07361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern VTBL_ENTRY _ZTV7ee07361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee07361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee07361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee07361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee07361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee07361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee07361[] = {
  {&(_ZTV7ee07361[4]),  4,17},
  {&(_tg__ZTV6dd7361__7ee07361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee07361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee07361[4]),  4,6},
  {&(_ZTV7ee07361[10]),  10,17},
  {&(_ZTV7ee07361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee07361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee07361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07361[];
extern  VTBL_ENTRY _ZTV7ee07361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07361[];
static VTBL_ENTRY alt_thunk_names687[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07361 = {  "ee07361", // class name
  bases_ee07361, 4,
  &(vtc_ee07361[0]), // expected_vtbl_contents
  &(vtt_ee07361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names687,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17361  : virtual dd7361 {
  int e;
  ~ee17361(); // tgen
  ee17361(); // tgen
};
//SIG(1 ee17361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee17361 ::~ee17361(){ note_dtor("ee17361", this);} // tgen
ee17361 ::ee17361(){ note_ctor("ee17361", this);} // tgen

static void Test_ee17361()
{
  extern Class_Descriptor cd_ee17361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17361, buf);
    ee17361 *dp, &lv = *(dp=new (buf) ee17361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee17361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee17361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(32,16), "ee17361");
    check_base_class_offset(lv, (dd7361*), ABISELECT(16,8), "ee17361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17361.e");
    test_class_info(&lv, &cd_ee17361);
    dp->~ee17361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17361(Test_ee17361, "ee17361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17361C1Ev();
extern void _ZN7ee17361D1Ev();
Name_Map name_map_ee17361[] = {
  NSPAIR(_ZN7ee17361C1Ev),
  NSPAIR(_ZN7ee17361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee17361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17361[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern VTBL_ENTRY _ZTV7ee17361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee17361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee17361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee17361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee17361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee17361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee17361[] = {
  {&(_ZTV7ee17361[5]),  5,24},
  {&(_ZTV7ee17361[11]),  11,24},
  {&(_ZTV7ee17361[17]),  17,24},
  {&(_ZTV7ee17361[22]),  22,24},
  {&(_tg__ZTV6dd7361__7ee17361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee17361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee17361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee17361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee17361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17361[];
extern  VTBL_ENTRY _ZTV7ee17361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17361[];
static VTBL_ENTRY alt_thunk_names688[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17361 = {  "ee17361", // class name
  bases_ee17361, 4,
  &(vtc_ee17361[0]), // expected_vtbl_contents
  &(vtt_ee17361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17361),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17361),9, //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  ee27361  : dd7361 {
  int e;
  virtual void  foo(); // _ZN7ee273613fooEv
  ~ee27361(); // tgen
  ee27361(); // tgen
};
//SIG(1 ee27361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee27361 ::foo(){vfunc_called(this, "_ZN7ee273613fooEv");}
ee27361 ::~ee27361(){ note_dtor("ee27361", this);} // tgen
ee27361 ::ee27361(){ note_ctor("ee27361", this);} // tgen

static void Test_ee27361()
{
  extern Class_Descriptor cd_ee27361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27361, buf);
    ee27361 *dp, &lv = *(dp=new (buf) ee27361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee27361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee27361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(16,12), "ee27361");
    check_base_class_offset(lv, (dd7361*), 0, "ee27361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27361.e");
    test_class_info(&lv, &cd_ee27361);
    dp->~ee27361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27361(Test_ee27361, "ee27361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27361C1Ev();
extern void _ZN7ee27361D1Ev();
Name_Map name_map_ee27361[] = {
  NSPAIR(_ZN7ee27361C1Ev),
  NSPAIR(_ZN7ee27361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee27361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27361[];
extern void _ZN6dd73613barEv();
extern void _ZN7ee273613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee273613fooEv,_ZTv0_n16_N7ee273613fooEv)();
extern void ABISELECT(_ZThn16_N7ee273613fooEv,_ZThn12_N7ee273613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee273613fooEv,_ZTv0_n12_N7ee273613fooEv)();
extern void ABISELECT(_ZThn32_N7ee273613fooEv,_ZThn20_N7ee273613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN7ee273613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee273613fooEv,_ZTv0_n16_N7ee273613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee273613fooEv,_ZTv0_n12_N7ee273613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern VTBL_ENTRY _ZTV7ee27361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee27361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee27361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee27361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee27361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee27361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee27361[] = {
  {&(_ZTV7ee27361[4]),  4,17},
  {&(_tg__ZTV6dd7361__7ee27361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee27361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee27361[4]),  4,6},
  {&(_ZTV7ee27361[10]),  10,17},
  {&(_ZTV7ee27361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee27361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee27361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27361[];
extern  VTBL_ENTRY _ZTV7ee27361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27361[];
static VTBL_ENTRY alt_thunk_names689[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee273613fooEv,_ZTv0_n12_N7ee273613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee273613fooEv,_ZThn20_N7ee273613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee273613fooEv,_ZTv0_n16_N7ee273613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee273613fooEv,_ZThn12_N7ee273613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27361 = {  "ee27361", // class name
  bases_ee27361, 4,
  &(vtc_ee27361[0]), // expected_vtbl_contents
  &(vtt_ee27361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27361),8, //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  ee37361  : virtual dd7361 {
  int e;
  virtual void  foo(); // _ZN7ee373613fooEv
  ~ee37361(); // tgen
  ee37361(); // tgen
};
//SIG(1 ee37361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee37361 ::foo(){vfunc_called(this, "_ZN7ee373613fooEv");}
ee37361 ::~ee37361(){ note_dtor("ee37361", this);} // tgen
ee37361 ::ee37361(){ note_ctor("ee37361", this);} // tgen

static void Test_ee37361()
{
  extern Class_Descriptor cd_ee37361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37361, buf);
    ee37361 *dp, &lv = *(dp=new (buf) ee37361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee37361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee37361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(32,16), "ee37361");
    check_base_class_offset(lv, (dd7361*), ABISELECT(16,8), "ee37361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37361.e");
    test_class_info(&lv, &cd_ee37361);
    dp->~ee37361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37361(Test_ee37361, "ee37361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37361C1Ev();
extern void _ZN7ee37361D1Ev();
Name_Map name_map_ee37361[] = {
  NSPAIR(_ZN7ee37361C1Ev),
  NSPAIR(_ZN7ee37361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee37361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37361[];
extern void _ZN7ee373613fooEv();
extern void _ZN6dd73613barEv();
extern void ABISELECT(_ZTv0_n48_N7ee373613fooEv,_ZTv0_n24_N7ee373613fooEv)();
extern void ABISELECT(_ZThn16_N7ee373613fooEv,_ZThn8_N7ee373613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee373613fooEv,_ZTv0_n16_N7ee373613fooEv)();
extern void ABISELECT(_ZThn32_N7ee373613fooEv,_ZThn16_N7ee373613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee373613fooEv,_ZTv0_n12_N7ee373613fooEv)();
extern void ABISELECT(_ZThn48_N7ee373613fooEv,_ZThn24_N7ee373613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37361[0]),
  (VTBL_ENTRY)&_ZN7ee373613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee373613fooEv,_ZTv0_n24_N7ee373613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee373613fooEv,_ZTv0_n16_N7ee373613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee373613fooEv,_ZTv0_n12_N7ee373613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern VTBL_ENTRY _ZTV7ee37361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee37361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee37361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee37361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee37361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee37361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee37361[] = {
  {&(_ZTV7ee37361[5]),  5,25},
  {&(_ZTV7ee37361[12]),  12,25},
  {&(_ZTV7ee37361[18]),  18,25},
  {&(_ZTV7ee37361[23]),  23,25},
  {&(_tg__ZTV6dd7361__7ee37361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee37361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee37361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee37361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee37361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37361[];
extern  VTBL_ENTRY _ZTV7ee37361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37361[];
static VTBL_ENTRY alt_thunk_names690[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee373613fooEv,_ZTv0_n12_N7ee373613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee373613fooEv,_ZThn24_N7ee373613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee373613fooEv,_ZTv0_n16_N7ee373613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee373613fooEv,_ZThn16_N7ee373613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee373613fooEv,_ZTv0_n24_N7ee373613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee373613fooEv,_ZThn8_N7ee373613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37361 = {  "ee37361", // class name
  bases_ee37361, 4,
  &(vtc_ee37361[0]), // expected_vtbl_contents
  &(vtt_ee37361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37361),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37361),9, //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  ee47361  : dd7361 {
  int e;
  virtual void  bar(); // _ZN7ee473613barEv
  ~ee47361(); // tgen
  ee47361(); // tgen
};
//SIG(1 ee47361) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee47361 ::bar(){vfunc_called(this, "_ZN7ee473613barEv");}
ee47361 ::~ee47361(){ note_dtor("ee47361", this);} // tgen
ee47361 ::ee47361(){ note_ctor("ee47361", this);} // tgen

static void Test_ee47361()
{
  extern Class_Descriptor cd_ee47361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47361, buf);
    ee47361 *dp, &lv = *(dp=new (buf) ee47361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee47361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee47361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(16,12), "ee47361");
    check_base_class_offset(lv, (dd7361*), 0, "ee47361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47361.e");
    test_class_info(&lv, &cd_ee47361);
    dp->~ee47361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47361(Test_ee47361, "ee47361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47361C1Ev();
extern void _ZN7ee47361D1Ev();
Name_Map name_map_ee47361[] = {
  NSPAIR(_ZN7ee47361C1Ev),
  NSPAIR(_ZN7ee47361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee47361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47361[];
extern void _ZN7ee473613barEv();
extern void _ZN6dd73613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee473613barEv,_ZTv0_n16_N7ee473613barEv)();
extern void ABISELECT(_ZThn32_N7ee473613barEv,_ZThn20_N7ee473613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47361[0]),
  (VTBL_ENTRY)&_ZN7ee473613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee473613barEv,_ZTv0_n16_N7ee473613barEv),
};
extern VTBL_ENTRY _ZTV7ee47361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee47361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee47361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee47361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee47361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee47361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee47361[] = {
  {&(_ZTV7ee47361[4]),  4,17},
  {&(_tg__ZTV6dd7361__7ee47361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee47361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee47361[4]),  4,6},
  {&(_ZTV7ee47361[10]),  10,17},
  {&(_ZTV7ee47361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee47361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee47361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47361[];
extern  VTBL_ENTRY _ZTV7ee47361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47361[];
static VTBL_ENTRY alt_thunk_names691[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee473613barEv,_ZTv0_n16_N7ee473613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee473613barEv,_ZThn20_N7ee473613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47361 = {  "ee47361", // class name
  bases_ee47361, 4,
  &(vtc_ee47361[0]), // expected_vtbl_contents
  &(vtt_ee47361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47361),8, //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  ee57361  : virtual dd7361 {
  int e;
  virtual void  bar(); // _ZN7ee573613barEv
  ~ee57361(); // tgen
  ee57361(); // tgen
};
//SIG(1 ee57361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee57361 ::bar(){vfunc_called(this, "_ZN7ee573613barEv");}
ee57361 ::~ee57361(){ note_dtor("ee57361", this);} // tgen
ee57361 ::ee57361(){ note_ctor("ee57361", this);} // tgen

static void Test_ee57361()
{
  extern Class_Descriptor cd_ee57361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57361, buf);
    ee57361 *dp, &lv = *(dp=new (buf) ee57361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee57361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee57361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(32,16), "ee57361");
    check_base_class_offset(lv, (dd7361*), ABISELECT(16,8), "ee57361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57361.e");
    test_class_info(&lv, &cd_ee57361);
    dp->~ee57361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57361(Test_ee57361, "ee57361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57361C1Ev();
extern void _ZN7ee57361D1Ev();
Name_Map name_map_ee57361[] = {
  NSPAIR(_ZN7ee57361C1Ev),
  NSPAIR(_ZN7ee57361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee57361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc361,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57361[];
extern void _ZN7ee573613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee573613barEv,_ZTv0_n20_N7ee573613barEv)();
extern void ABISELECT(_ZThn16_N7ee573613barEv,_ZThn8_N7ee573613barEv)() __attribute__((weak));
extern void _ZN6dd73613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee573613barEv,_ZTv0_n16_N7ee573613barEv)();
extern void ABISELECT(_ZThn48_N7ee573613barEv,_ZThn24_N7ee573613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57361[0]),
  (VTBL_ENTRY)&_ZN7ee573613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee573613barEv,_ZTv0_n20_N7ee573613barEv),
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee573613barEv,_ZTv0_n16_N7ee573613barEv),
};
extern VTBL_ENTRY _ZTV7ee57361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee57361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee57361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee57361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee57361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee57361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee57361[] = {
  {&(_ZTV7ee57361[5]),  5,25},
  {&(_ZTV7ee57361[12]),  12,25},
  {&(_ZTV7ee57361[18]),  18,25},
  {&(_ZTV7ee57361[23]),  23,25},
  {&(_tg__ZTV6dd7361__7ee57361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee57361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee57361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee57361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee57361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57361[];
extern  VTBL_ENTRY _ZTV7ee57361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57361[];
static VTBL_ENTRY alt_thunk_names692[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee573613barEv,_ZTv0_n16_N7ee573613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee573613barEv,_ZThn24_N7ee573613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee573613barEv,_ZTv0_n20_N7ee573613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee573613barEv,_ZThn8_N7ee573613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57361 = {  "ee57361", // class name
  bases_ee57361, 4,
  &(vtc_ee57361[0]), // expected_vtbl_contents
  &(vtt_ee57361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57361),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names692,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67361  : dd7361 {
  int e;
  virtual void  foo(); // _ZN7ee673613fooEv
  virtual void  bar(); // _ZN7ee673613barEv
  ~ee67361(); // tgen
  ee67361(); // tgen
};
//SIG(1 ee67361) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67361 ::foo(){vfunc_called(this, "_ZN7ee673613fooEv");}
void  ee67361 ::bar(){vfunc_called(this, "_ZN7ee673613barEv");}
ee67361 ::~ee67361(){ note_dtor("ee67361", this);} // tgen
ee67361 ::ee67361(){ note_ctor("ee67361", this);} // tgen

static void Test_ee67361()
{
  extern Class_Descriptor cd_ee67361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67361, buf);
    ee67361 *dp, &lv = *(dp=new (buf) ee67361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee67361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(32,20), "ee67361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(16,12), "ee67361");
    check_base_class_offset(lv, (dd7361*), 0, "ee67361");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67361.e");
    test_class_info(&lv, &cd_ee67361);
    dp->~ee67361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67361(Test_ee67361, "ee67361", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67361C1Ev();
extern void _ZN7ee67361D1Ev();
Name_Map name_map_ee67361[] = {
  NSPAIR(_ZN7ee67361C1Ev),
  NSPAIR(_ZN7ee67361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee67361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67361[];
extern void _ZN7ee673613barEv();
extern void _ZN7ee673613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee673613fooEv,_ZTv0_n16_N7ee673613fooEv)();
extern void ABISELECT(_ZThn16_N7ee673613fooEv,_ZThn12_N7ee673613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee673613fooEv,_ZTv0_n12_N7ee673613fooEv)();
extern void ABISELECT(_ZThn32_N7ee673613fooEv,_ZThn20_N7ee673613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee673613barEv,_ZTv0_n16_N7ee673613barEv)();
extern void ABISELECT(_ZThn32_N7ee673613barEv,_ZThn20_N7ee673613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67361[0]),
  (VTBL_ENTRY)&_ZN7ee673613barEv,
  (VTBL_ENTRY)&_ZN7ee673613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee673613fooEv,_ZTv0_n16_N7ee673613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee673613fooEv,_ZTv0_n12_N7ee673613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee673613barEv,_ZTv0_n16_N7ee673613barEv),
};
extern VTBL_ENTRY _ZTV7ee67361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee67361[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee67361[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee67361[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee67361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee67361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee67361[] = {
  {&(_ZTV7ee67361[4]),  4,17},
  {&(_tg__ZTV6dd7361__7ee67361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee67361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee67361[4]),  4,6},
  {&(_ZTV7ee67361[10]),  10,17},
  {&(_ZTV7ee67361[15]),  15,17},
  {&(_tg__ZTV5cc361__7ee67361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee67361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67361[];
extern  VTBL_ENTRY _ZTV7ee67361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67361[];
static VTBL_ENTRY alt_thunk_names693[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn20_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn20_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn12_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee673613barEv,_ZTv0_n16_N7ee673613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee673613barEv,_ZThn20_N7ee673613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee673613fooEv,_ZTv0_n12_N7ee673613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee673613fooEv,_ZThn20_N7ee673613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee673613fooEv,_ZTv0_n16_N7ee673613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee673613fooEv,_ZThn12_N7ee673613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67361 = {  "ee67361", // class name
  bases_ee67361, 4,
  &(vtc_ee67361[0]), // expected_vtbl_contents
  &(vtt_ee67361[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67361),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67361),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67361),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names693,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77361  : virtual dd7361 {
  int e;
  virtual void  foo(); // _ZN7ee773613fooEv
  virtual void  bar(); // _ZN7ee773613barEv
  ~ee77361(); // tgen
  ee77361(); // tgen
};
//SIG(1 ee77361) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77361 ::foo(){vfunc_called(this, "_ZN7ee773613fooEv");}
void  ee77361 ::bar(){vfunc_called(this, "_ZN7ee773613barEv");}
ee77361 ::~ee77361(){ note_dtor("ee77361", this);} // tgen
ee77361 ::ee77361(){ note_ctor("ee77361", this);} // tgen

static void Test_ee77361()
{
  extern Class_Descriptor cd_ee77361;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77361, buf);
    ee77361 *dp, &lv = *(dp=new (buf) ee77361());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77361)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77361)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee77361");
    check_base_class_offset(lv, (bb61*)(cc361*), ABISELECT(48,24), "ee77361");
    check_base_class_offset(lv, (cc361*)(dd7361*), ABISELECT(32,16), "ee77361");
    check_base_class_offset(lv, (dd7361*), ABISELECT(16,8), "ee77361");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77361.e");
    test_class_info(&lv, &cd_ee77361);
    dp->~ee77361();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77361(Test_ee77361, "ee77361", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77361C1Ev();
extern void _ZN7ee77361D1Ev();
Name_Map name_map_ee77361[] = {
  NSPAIR(_ZN7ee77361C1Ev),
  NSPAIR(_ZN7ee77361D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc361;
extern VTBL_ENTRY _ZTI5cc361[];
extern  VTBL_ENTRY _ZTV5cc361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc361[];
extern Class_Descriptor cd_dd7361;
extern VTBL_ENTRY _ZTI6dd7361[];
extern  VTBL_ENTRY _ZTV6dd7361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7361[];
static Base_Class bases_ee77361[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc361,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7361,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77361[];
extern void _ZN7ee773613fooEv();
extern void _ZN7ee773613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee773613barEv,_ZTv0_n20_N7ee773613barEv)();
extern void ABISELECT(_ZThn16_N7ee773613barEv,_ZThn8_N7ee773613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee773613fooEv,_ZTv0_n24_N7ee773613fooEv)();
extern void ABISELECT(_ZThn16_N7ee773613fooEv,_ZThn8_N7ee773613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee773613fooEv,_ZTv0_n16_N7ee773613fooEv)();
extern void ABISELECT(_ZThn32_N7ee773613fooEv,_ZThn16_N7ee773613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee773613fooEv,_ZTv0_n12_N7ee773613fooEv)();
extern void ABISELECT(_ZThn48_N7ee773613fooEv,_ZThn24_N7ee773613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee773613barEv,_ZTv0_n16_N7ee773613barEv)();
extern void ABISELECT(_ZThn48_N7ee773613barEv,_ZThn24_N7ee773613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77361[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77361[0]),
  (VTBL_ENTRY)&_ZN7ee773613fooEv,
  (VTBL_ENTRY)&_ZN7ee773613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee773613barEv,_ZTv0_n20_N7ee773613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee773613fooEv,_ZTv0_n24_N7ee773613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee773613fooEv,_ZTv0_n16_N7ee773613fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee773613fooEv,_ZTv0_n12_N7ee773613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee773613barEv,_ZTv0_n16_N7ee773613barEv),
};
extern VTBL_ENTRY _ZTV7ee77361[];
extern void _ZN6dd73613barEv();
extern void _ZN6dd73613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7361__7ee77361[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&_ZN6dd73613barEv,
  (VTBL_ENTRY)&_ZN6dd73613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv)();
extern void ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc361__6dd7361__7ee77361[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv)();
extern void ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv)();
extern void ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7361__7ee77361[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv),
};
extern void _ZN5cc3613fooEv();
static  VTBL_ENTRY _tg__ZTV5cc361__7ee77361[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&_ZN5cc3613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv)();
extern void ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv)() __attribute__((weak));
extern void _ZN4bb613barEv();
static  VTBL_ENTRY _tg__ZTV4bb61__5cc361__7ee77361[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc361[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv),
  (VTBL_ENTRY)&_ZN4bb613barEv,
};
static  VTT_ENTRY vtt_ee77361[] = {
  {&(_ZTV7ee77361[5]),  5,26},
  {&(_ZTV7ee77361[13]),  13,26},
  {&(_ZTV7ee77361[19]),  19,26},
  {&(_ZTV7ee77361[24]),  24,26},
  {&(_tg__ZTV6dd7361__7ee77361[4]),  4,6},
  {&(_tg__ZTV5cc361__6dd7361__7ee77361[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7361__7ee77361[4]),  4,6},
  {&(_tg__ZTV5cc361__7ee77361[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc361__7ee77361[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77361[];
extern  VTBL_ENTRY _ZTV7ee77361[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77361[];
static VTBL_ENTRY alt_thunk_names694[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3613fooEv,_ZTv0_n12_N5cc3613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3613fooEv,_ZThn8_N5cc3613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613barEv,_ZTv0_n16_N6dd73613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613barEv,_ZThn16_N6dd73613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73613fooEv,_ZTv0_n12_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73613fooEv,_ZThn16_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73613fooEv,_ZTv0_n16_N6dd73613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73613fooEv,_ZThn8_N6dd73613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee773613barEv,_ZTv0_n16_N7ee773613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee773613barEv,_ZThn24_N7ee773613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee773613fooEv,_ZTv0_n12_N7ee773613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee773613fooEv,_ZThn24_N7ee773613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee773613fooEv,_ZTv0_n16_N7ee773613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee773613fooEv,_ZThn16_N7ee773613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee773613fooEv,_ZTv0_n24_N7ee773613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee773613fooEv,_ZThn8_N7ee773613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee773613barEv,_ZTv0_n20_N7ee773613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee773613barEv,_ZThn8_N7ee773613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77361 = {  "ee77361", // class name
  bases_ee77361, 4,
  &(vtc_ee77361[0]), // expected_vtbl_contents
  &(vtt_ee77361[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77361),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77361),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77361),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names694,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc461  : bb61 {
  int c;
  virtual void  bar(); // _ZN5cc4613barEv
  ~cc461(); // tgen
  cc461(); // tgen
};
//SIG(-1 cc461) C1{ BC2{ BC3{ v2 Fi} v1 v2 Fi} v1 Fi}


void  cc461 ::bar(){vfunc_called(this, "_ZN5cc4613barEv");}
cc461 ::~cc461(){ note_dtor("cc461", this);} // tgen
cc461 ::cc461(){ note_ctor("cc461", this);} // tgen

static void Test_cc461()
{
  extern Class_Descriptor cd_cc461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc461, buf);
    cc461 *dp, &lv = *(dp=new (buf) cc461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc461)");
    check_base_class_offset(lv, (aa1*)(bb61*), 0, "cc461");
    check_base_class_offset(lv, (bb61*), 0, "cc461");
    check_field_offset(lv, c, ABISELECT(16,12), "cc461.c");
    test_class_info(&lv, &cd_cc461);
    dp->~cc461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc461(Test_cc461, "cc461", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc461C1Ev();
extern void _ZN5cc461D1Ev();
Name_Map name_map_cc461[] = {
  NSPAIR(_ZN5cc461C1Ev),
  NSPAIR(_ZN5cc461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI5cc461[];
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_cc461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
Class_Descriptor cd_cc461 = {  "cc461", // class name
  bases_cc461, 2,
  &(vtc_cc461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc461),4, //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  dd0461  : cc461 {
  int d;
  ~dd0461(); // tgen
  dd0461(); // tgen
};
//SIG(-1 dd0461) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} Fi}


dd0461 ::~dd0461(){ note_dtor("dd0461", this);} // tgen
dd0461 ::dd0461(){ note_ctor("dd0461", this);} // tgen

static void Test_dd0461()
{
  extern Class_Descriptor cd_dd0461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0461, buf);
    dd0461 *dp, &lv = *(dp=new (buf) dd0461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), 0, "dd0461");
    check_base_class_offset(lv, (bb61*)(cc461*), 0, "dd0461");
    check_base_class_offset(lv, (cc461*), 0, "dd0461");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0461.d");
    test_class_info(&lv, &cd_dd0461);
    dp->~dd0461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0461(Test_dd0461, "dd0461", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0461C1Ev();
extern void _ZN6dd0461D1Ev();
Name_Map name_map_dd0461[] = {
  NSPAIR(_ZN6dd0461C1Ev),
  NSPAIR(_ZN6dd0461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd0461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0461[];
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_dd0461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
Class_Descriptor cd_dd0461 = {  "dd0461", // class name
  bases_dd0461, 3,
  &(vtc_dd0461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0461),4, //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  ee00461  : dd0461 {
  int e;
  ~ee00461(); // tgen
  ee00461(); // tgen
};
//SIG(1 ee00461) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee00461 ::~ee00461(){ note_dtor("ee00461", this);} // tgen
ee00461 ::ee00461(){ note_ctor("ee00461", this);} // tgen

static void Test_ee00461()
{
  extern Class_Descriptor cd_ee00461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00461, buf);
    ee00461 *dp, &lv = *(dp=new (buf) ee00461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), 0, "ee00461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), 0, "ee00461");
    check_base_class_offset(lv, (cc461*)(dd0461*), 0, "ee00461");
    check_base_class_offset(lv, (dd0461*), 0, "ee00461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00461.e");
    test_class_info(&lv, &cd_ee00461);
    dp->~ee00461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00461(Test_ee00461, "ee00461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00461C1Ev();
extern void _ZN7ee00461D1Ev();
Name_Map name_map_ee00461[] = {
  NSPAIR(_ZN7ee00461C1Ev),
  NSPAIR(_ZN7ee00461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee00461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00461[];
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee00461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTI7ee00461[];
extern  VTBL_ENTRY _ZTV7ee00461[];
Class_Descriptor cd_ee00461 = {  "ee00461", // class name
  bases_ee00461, 4,
  &(vtc_ee00461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00461),4, //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  ee10461  : virtual dd0461 {
  int e;
  ~ee10461(); // tgen
  ee10461(); // tgen
};
//SIG(1 ee10461) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee10461 ::~ee10461(){ note_dtor("ee10461", this);} // tgen
ee10461 ::ee10461(){ note_ctor("ee10461", this);} // tgen

static void Test_ee10461()
{
  extern Class_Descriptor cd_ee10461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10461, buf);
    ee10461 *dp, &lv = *(dp=new (buf) ee10461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee10461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee10461");
    check_base_class_offset(lv, (cc461*)(dd0461*), ABISELECT(16,8), "ee10461");
    check_base_class_offset(lv, (dd0461*), ABISELECT(16,8), "ee10461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10461.e");
    test_class_info(&lv, &cd_ee10461);
    dp->~ee10461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10461(Test_ee10461, "ee10461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10461C1Ev();
extern void _ZN7ee10461D1Ev();
Name_Map name_map_ee10461[] = {
  NSPAIR(_ZN7ee10461C1Ev),
  NSPAIR(_ZN7ee10461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee10461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10461[];
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee10461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10461[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee10461[];
static  VTT_ENTRY vtt_ee10461[] = {
  {&(_ZTV7ee10461[3]),  3,9},
  {&(_ZTV7ee10461[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10461[];
extern  VTBL_ENTRY _ZTV7ee10461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10461[];
Class_Descriptor cd_ee10461 = {  "ee10461", // class name
  bases_ee10461, 4,
  &(vtc_ee10461[0]), // expected_vtbl_contents
  &(vtt_ee10461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10461),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10461),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  ee20461  : dd0461 {
  int e;
  virtual void  foo(); // _ZN7ee204613fooEv
  ~ee20461(); // tgen
  ee20461(); // tgen
};
//SIG(1 ee20461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee20461 ::foo(){vfunc_called(this, "_ZN7ee204613fooEv");}
ee20461 ::~ee20461(){ note_dtor("ee20461", this);} // tgen
ee20461 ::ee20461(){ note_ctor("ee20461", this);} // tgen

static void Test_ee20461()
{
  extern Class_Descriptor cd_ee20461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20461, buf);
    ee20461 *dp, &lv = *(dp=new (buf) ee20461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), 0, "ee20461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), 0, "ee20461");
    check_base_class_offset(lv, (cc461*)(dd0461*), 0, "ee20461");
    check_base_class_offset(lv, (dd0461*), 0, "ee20461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20461.e");
    test_class_info(&lv, &cd_ee20461);
    dp->~ee20461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20461(Test_ee20461, "ee20461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20461C1Ev();
extern void _ZN7ee20461D1Ev();
Name_Map name_map_ee20461[] = {
  NSPAIR(_ZN7ee20461C1Ev),
  NSPAIR(_ZN7ee20461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee20461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20461[];
extern void _ZN7ee204613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee20461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20461[0]),
  (VTBL_ENTRY)&_ZN7ee204613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTI7ee20461[];
extern  VTBL_ENTRY _ZTV7ee20461[];
Class_Descriptor cd_ee20461 = {  "ee20461", // class name
  bases_ee20461, 4,
  &(vtc_ee20461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20461),4, //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  ee30461  : virtual dd0461 {
  int e;
  virtual void  foo(); // _ZN7ee304613fooEv
  ~ee30461(); // tgen
  ee30461(); // tgen
};
//SIG(1 ee30461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee30461 ::foo(){vfunc_called(this, "_ZN7ee304613fooEv");}
ee30461 ::~ee30461(){ note_dtor("ee30461", this);} // tgen
ee30461 ::ee30461(){ note_ctor("ee30461", this);} // tgen

static void Test_ee30461()
{
  extern Class_Descriptor cd_ee30461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30461, buf);
    ee30461 *dp, &lv = *(dp=new (buf) ee30461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee30461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee30461");
    check_base_class_offset(lv, (cc461*)(dd0461*), ABISELECT(16,8), "ee30461");
    check_base_class_offset(lv, (dd0461*), ABISELECT(16,8), "ee30461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30461.e");
    test_class_info(&lv, &cd_ee30461);
    dp->~ee30461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30461(Test_ee30461, "ee30461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30461C1Ev();
extern void _ZN7ee30461D1Ev();
Name_Map name_map_ee30461[] = {
  NSPAIR(_ZN7ee30461C1Ev),
  NSPAIR(_ZN7ee30461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee30461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30461[];
extern void _ZN7ee304613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee304613fooEv,_ZTv0_n12_N7ee304613fooEv)();
extern void ABISELECT(_ZThn16_N7ee304613fooEv,_ZThn8_N7ee304613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee30461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30461[0]),
  (VTBL_ENTRY)&_ZN7ee304613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee304613fooEv,_ZTv0_n12_N7ee304613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee30461[];
static  VTT_ENTRY vtt_ee30461[] = {
  {&(_ZTV7ee30461[3]),  3,10},
  {&(_ZTV7ee30461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30461[];
extern  VTBL_ENTRY _ZTV7ee30461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30461[];
static VTBL_ENTRY alt_thunk_names695[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee304613fooEv,_ZTv0_n12_N7ee304613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee304613fooEv,_ZThn8_N7ee304613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30461 = {  "ee30461", // class name
  bases_ee30461, 4,
  &(vtc_ee30461[0]), // expected_vtbl_contents
  &(vtt_ee30461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names695,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40461  : dd0461 {
  int e;
  virtual void  bar(); // _ZN7ee404613barEv
  ~ee40461(); // tgen
  ee40461(); // tgen
};
//SIG(1 ee40461) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee40461 ::bar(){vfunc_called(this, "_ZN7ee404613barEv");}
ee40461 ::~ee40461(){ note_dtor("ee40461", this);} // tgen
ee40461 ::ee40461(){ note_ctor("ee40461", this);} // tgen

static void Test_ee40461()
{
  extern Class_Descriptor cd_ee40461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40461, buf);
    ee40461 *dp, &lv = *(dp=new (buf) ee40461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), 0, "ee40461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), 0, "ee40461");
    check_base_class_offset(lv, (cc461*)(dd0461*), 0, "ee40461");
    check_base_class_offset(lv, (dd0461*), 0, "ee40461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40461.e");
    test_class_info(&lv, &cd_ee40461);
    dp->~ee40461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40461(Test_ee40461, "ee40461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40461C1Ev();
extern void _ZN7ee40461D1Ev();
Name_Map name_map_ee40461[] = {
  NSPAIR(_ZN7ee40461C1Ev),
  NSPAIR(_ZN7ee40461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee40461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40461[];
extern void _ZN4bb613fooEv();
extern void _ZN7ee404613barEv();
static  VTBL_ENTRY vtc_ee40461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN7ee404613barEv,
};
extern VTBL_ENTRY _ZTI7ee40461[];
extern  VTBL_ENTRY _ZTV7ee40461[];
Class_Descriptor cd_ee40461 = {  "ee40461", // class name
  bases_ee40461, 4,
  &(vtc_ee40461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40461),4, //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  ee50461  : virtual dd0461 {
  int e;
  virtual void  bar(); // _ZN7ee504613barEv
  ~ee50461(); // tgen
  ee50461(); // tgen
};
//SIG(1 ee50461) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee50461 ::bar(){vfunc_called(this, "_ZN7ee504613barEv");}
ee50461 ::~ee50461(){ note_dtor("ee50461", this);} // tgen
ee50461 ::ee50461(){ note_ctor("ee50461", this);} // tgen

static void Test_ee50461()
{
  extern Class_Descriptor cd_ee50461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50461, buf);
    ee50461 *dp, &lv = *(dp=new (buf) ee50461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee50461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee50461");
    check_base_class_offset(lv, (cc461*)(dd0461*), ABISELECT(16,8), "ee50461");
    check_base_class_offset(lv, (dd0461*), ABISELECT(16,8), "ee50461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50461.e");
    test_class_info(&lv, &cd_ee50461);
    dp->~ee50461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50461(Test_ee50461, "ee50461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50461C1Ev();
extern void _ZN7ee50461D1Ev();
Name_Map name_map_ee50461[] = {
  NSPAIR(_ZN7ee50461C1Ev),
  NSPAIR(_ZN7ee50461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee50461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50461[];
extern void _ZN7ee504613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee504613barEv,_ZTv0_n16_N7ee504613barEv)();
extern void ABISELECT(_ZThn16_N7ee504613barEv,_ZThn8_N7ee504613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50461[0]),
  (VTBL_ENTRY)&_ZN7ee504613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee504613barEv,_ZTv0_n16_N7ee504613barEv),
};
extern VTBL_ENTRY _ZTV7ee50461[];
static  VTT_ENTRY vtt_ee50461[] = {
  {&(_ZTV7ee50461[3]),  3,10},
  {&(_ZTV7ee50461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50461[];
extern  VTBL_ENTRY _ZTV7ee50461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50461[];
static VTBL_ENTRY alt_thunk_names696[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee504613barEv,_ZTv0_n16_N7ee504613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee504613barEv,_ZThn8_N7ee504613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50461 = {  "ee50461", // class name
  bases_ee50461, 4,
  &(vtc_ee50461[0]), // expected_vtbl_contents
  &(vtt_ee50461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names696,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60461  : dd0461 {
  int e;
  virtual void  foo(); // _ZN7ee604613fooEv
  virtual void  bar(); // _ZN7ee604613barEv
  ~ee60461(); // tgen
  ee60461(); // tgen
};
//SIG(1 ee60461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee60461 ::foo(){vfunc_called(this, "_ZN7ee604613fooEv");}
void  ee60461 ::bar(){vfunc_called(this, "_ZN7ee604613barEv");}
ee60461 ::~ee60461(){ note_dtor("ee60461", this);} // tgen
ee60461 ::ee60461(){ note_ctor("ee60461", this);} // tgen

static void Test_ee60461()
{
  extern Class_Descriptor cd_ee60461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60461, buf);
    ee60461 *dp, &lv = *(dp=new (buf) ee60461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), 0, "ee60461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), 0, "ee60461");
    check_base_class_offset(lv, (cc461*)(dd0461*), 0, "ee60461");
    check_base_class_offset(lv, (dd0461*), 0, "ee60461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60461.e");
    test_class_info(&lv, &cd_ee60461);
    dp->~ee60461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60461(Test_ee60461, "ee60461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60461C1Ev();
extern void _ZN7ee60461D1Ev();
Name_Map name_map_ee60461[] = {
  NSPAIR(_ZN7ee60461C1Ev),
  NSPAIR(_ZN7ee60461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee60461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60461[];
extern void _ZN7ee604613fooEv();
extern void _ZN7ee604613barEv();
static  VTBL_ENTRY vtc_ee60461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60461[0]),
  (VTBL_ENTRY)&_ZN7ee604613fooEv,
  (VTBL_ENTRY)&_ZN7ee604613barEv,
};
extern VTBL_ENTRY _ZTI7ee60461[];
extern  VTBL_ENTRY _ZTV7ee60461[];
Class_Descriptor cd_ee60461 = {  "ee60461", // class name
  bases_ee60461, 4,
  &(vtc_ee60461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60461),4, //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  ee70461  : virtual dd0461 {
  int e;
  virtual void  foo(); // _ZN7ee704613fooEv
  virtual void  bar(); // _ZN7ee704613barEv
  ~ee70461(); // tgen
  ee70461(); // tgen
};
//SIG(1 ee70461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee70461 ::foo(){vfunc_called(this, "_ZN7ee704613fooEv");}
void  ee70461 ::bar(){vfunc_called(this, "_ZN7ee704613barEv");}
ee70461 ::~ee70461(){ note_dtor("ee70461", this);} // tgen
ee70461 ::ee70461(){ note_ctor("ee70461", this);} // tgen

static void Test_ee70461()
{
  extern Class_Descriptor cd_ee70461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70461, buf);
    ee70461 *dp, &lv = *(dp=new (buf) ee70461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee70461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd0461*), ABISELECT(16,8), "ee70461");
    check_base_class_offset(lv, (cc461*)(dd0461*), ABISELECT(16,8), "ee70461");
    check_base_class_offset(lv, (dd0461*), ABISELECT(16,8), "ee70461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70461.e");
    test_class_info(&lv, &cd_ee70461);
    dp->~ee70461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70461(Test_ee70461, "ee70461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70461C1Ev();
extern void _ZN7ee70461D1Ev();
Name_Map name_map_ee70461[] = {
  NSPAIR(_ZN7ee70461C1Ev),
  NSPAIR(_ZN7ee70461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd0461;
extern VTBL_ENTRY _ZTI6dd0461[];
extern  VTBL_ENTRY _ZTV6dd0461[];
static Base_Class bases_ee70461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0461,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70461[];
extern void _ZN7ee704613fooEv();
extern void _ZN7ee704613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee704613fooEv,_ZTv0_n12_N7ee704613fooEv)();
extern void ABISELECT(_ZThn16_N7ee704613fooEv,_ZThn8_N7ee704613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee704613barEv,_ZTv0_n16_N7ee704613barEv)();
extern void ABISELECT(_ZThn16_N7ee704613barEv,_ZThn8_N7ee704613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70461[0]),
  (VTBL_ENTRY)&_ZN7ee704613fooEv,
  (VTBL_ENTRY)&_ZN7ee704613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee704613fooEv,_ZTv0_n12_N7ee704613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee704613barEv,_ZTv0_n16_N7ee704613barEv),
};
extern VTBL_ENTRY _ZTV7ee70461[];
static  VTT_ENTRY vtt_ee70461[] = {
  {&(_ZTV7ee70461[3]),  3,11},
  {&(_ZTV7ee70461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70461[];
extern  VTBL_ENTRY _ZTV7ee70461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70461[];
static VTBL_ENTRY alt_thunk_names697[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee704613barEv,_ZTv0_n16_N7ee704613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee704613barEv,_ZThn8_N7ee704613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee704613fooEv,_ZTv0_n12_N7ee704613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee704613fooEv,_ZThn8_N7ee704613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70461 = {  "ee70461", // class name
  bases_ee70461, 4,
  &(vtc_ee70461[0]), // expected_vtbl_contents
  &(vtt_ee70461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names697,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1461  : virtual cc461 {
  int d;
  ~dd1461(); // tgen
  dd1461(); // tgen
};
//SIG(-1 dd1461) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} Fi}


dd1461 ::~dd1461(){ note_dtor("dd1461", this);} // tgen
dd1461 ::dd1461(){ note_ctor("dd1461", this);} // tgen

static void Test_dd1461()
{
  extern Class_Descriptor cd_dd1461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1461, buf);
    dd1461 *dp, &lv = *(dp=new (buf) dd1461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,8), "dd1461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,8), "dd1461");
    check_base_class_offset(lv, (cc461*), ABISELECT(16,8), "dd1461");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1461.d");
    test_class_info(&lv, &cd_dd1461);
    dp->~dd1461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1461(Test_dd1461, "dd1461", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1461C1Ev();
extern void _ZN6dd1461D1Ev();
Name_Map name_map_dd1461[] = {
  NSPAIR(_ZN6dd1461C1Ev),
  NSPAIR(_ZN6dd1461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd1461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1461[];
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_dd1461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV6dd1461[];
static  VTT_ENTRY vtt_dd1461[] = {
  {&(_ZTV6dd1461[3]),  3,9},
  {&(_ZTV6dd1461[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
Class_Descriptor cd_dd1461 = {  "dd1461", // class name
  bases_dd1461, 3,
  &(vtc_dd1461[0]), // expected_vtbl_contents
  &(vtt_dd1461[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1461),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1461),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  ee01461  : dd1461 {
  int e;
  ~ee01461(); // tgen
  ee01461(); // tgen
};
//SIG(1 ee01461) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee01461 ::~ee01461(){ note_dtor("ee01461", this);} // tgen
ee01461 ::ee01461(){ note_ctor("ee01461", this);} // tgen

static void Test_ee01461()
{
  extern Class_Descriptor cd_ee01461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01461, buf);
    ee01461 *dp, &lv = *(dp=new (buf) ee01461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee01461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee01461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(16,12), "ee01461");
    check_base_class_offset(lv, (dd1461*), 0, "ee01461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01461.e");
    test_class_info(&lv, &cd_ee01461);
    dp->~ee01461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01461(Test_ee01461, "ee01461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01461C1Ev();
extern void _ZN7ee01461D1Ev();
Name_Map name_map_ee01461[] = {
  NSPAIR(_ZN7ee01461C1Ev),
  NSPAIR(_ZN7ee01461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee01461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01461[];
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee01461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01461[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee01461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee01461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee01461[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee01461[] = {
  {&(_ZTV7ee01461[3]),  3,9},
  {&(_tg__ZTV6dd1461__7ee01461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee01461[4]),  4,6},
  {&(_ZTV7ee01461[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01461[];
extern  VTBL_ENTRY _ZTV7ee01461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01461[];
Class_Descriptor cd_ee01461 = {  "ee01461", // class name
  bases_ee01461, 4,
  &(vtc_ee01461[0]), // expected_vtbl_contents
  &(vtt_ee01461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01461),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01461),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  ee11461  : virtual dd1461 {
  int e;
  ~ee11461(); // tgen
  ee11461(); // tgen
};
//SIG(1 ee11461) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee11461 ::~ee11461(){ note_dtor("ee11461", this);} // tgen
ee11461 ::ee11461(){ note_ctor("ee11461", this);} // tgen

static void Test_ee11461()
{
  extern Class_Descriptor cd_ee11461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11461, buf);
    ee11461 *dp, &lv = *(dp=new (buf) ee11461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee11461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee11461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(32,16), "ee11461");
    check_base_class_offset(lv, (dd1461*), ABISELECT(16,8), "ee11461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11461.e");
    test_class_info(&lv, &cd_ee11461);
    dp->~ee11461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11461(Test_ee11461, "ee11461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11461C1Ev();
extern void _ZN7ee11461D1Ev();
Name_Map name_map_ee11461[] = {
  NSPAIR(_ZN7ee11461C1Ev),
  NSPAIR(_ZN7ee11461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee11461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11461[];
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee11461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11461[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11461[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee11461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee11461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee11461[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee11461[] = {
  {&(_ZTV7ee11461[4]),  4,13},
  {&(_ZTV7ee11461[7]),  7,13},
  {&(_ZTV7ee11461[11]),  11,13},
  {&(_tg__ZTV6dd1461__7ee11461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee11461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11461[];
extern  VTBL_ENTRY _ZTV7ee11461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11461[];
Class_Descriptor cd_ee11461 = {  "ee11461", // class name
  bases_ee11461, 4,
  &(vtc_ee11461[0]), // expected_vtbl_contents
  &(vtt_ee11461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11461),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11461),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  ee21461  : dd1461 {
  int e;
  virtual void  foo(); // _ZN7ee214613fooEv
  ~ee21461(); // tgen
  ee21461(); // tgen
};
//SIG(1 ee21461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee21461 ::foo(){vfunc_called(this, "_ZN7ee214613fooEv");}
ee21461 ::~ee21461(){ note_dtor("ee21461", this);} // tgen
ee21461 ::ee21461(){ note_ctor("ee21461", this);} // tgen

static void Test_ee21461()
{
  extern Class_Descriptor cd_ee21461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21461, buf);
    ee21461 *dp, &lv = *(dp=new (buf) ee21461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee21461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee21461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(16,12), "ee21461");
    check_base_class_offset(lv, (dd1461*), 0, "ee21461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21461.e");
    test_class_info(&lv, &cd_ee21461);
    dp->~ee21461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21461(Test_ee21461, "ee21461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21461C1Ev();
extern void _ZN7ee21461D1Ev();
Name_Map name_map_ee21461[] = {
  NSPAIR(_ZN7ee21461C1Ev),
  NSPAIR(_ZN7ee21461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee21461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21461[];
extern void _ZN7ee214613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee214613fooEv,_ZTv0_n12_N7ee214613fooEv)();
extern void ABISELECT(_ZThn16_N7ee214613fooEv,_ZThn12_N7ee214613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee21461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21461[0]),
  (VTBL_ENTRY)&_ZN7ee214613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee214613fooEv,_ZTv0_n12_N7ee214613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee21461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee21461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee21461[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee21461[] = {
  {&(_ZTV7ee21461[3]),  3,10},
  {&(_tg__ZTV6dd1461__7ee21461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee21461[4]),  4,6},
  {&(_ZTV7ee21461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21461[];
extern  VTBL_ENTRY _ZTV7ee21461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21461[];
static VTBL_ENTRY alt_thunk_names698[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee214613fooEv,_ZTv0_n12_N7ee214613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee214613fooEv,_ZThn12_N7ee214613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21461 = {  "ee21461", // class name
  bases_ee21461, 4,
  &(vtc_ee21461[0]), // expected_vtbl_contents
  &(vtt_ee21461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names698,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31461  : virtual dd1461 {
  int e;
  virtual void  foo(); // _ZN7ee314613fooEv
  ~ee31461(); // tgen
  ee31461(); // tgen
};
//SIG(1 ee31461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee31461 ::foo(){vfunc_called(this, "_ZN7ee314613fooEv");}
ee31461 ::~ee31461(){ note_dtor("ee31461", this);} // tgen
ee31461 ::ee31461(){ note_ctor("ee31461", this);} // tgen

static void Test_ee31461()
{
  extern Class_Descriptor cd_ee31461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31461, buf);
    ee31461 *dp, &lv = *(dp=new (buf) ee31461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee31461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee31461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(32,16), "ee31461");
    check_base_class_offset(lv, (dd1461*), ABISELECT(16,8), "ee31461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31461.e");
    test_class_info(&lv, &cd_ee31461);
    dp->~ee31461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31461(Test_ee31461, "ee31461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31461C1Ev();
extern void _ZN7ee31461D1Ev();
Name_Map name_map_ee31461[] = {
  NSPAIR(_ZN7ee31461C1Ev),
  NSPAIR(_ZN7ee31461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee31461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31461[];
extern void _ZN7ee314613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee314613fooEv,_ZTv0_n12_N7ee314613fooEv)();
extern void ABISELECT(_ZThn32_N7ee314613fooEv,_ZThn16_N7ee314613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee31461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31461[0]),
  (VTBL_ENTRY)&_ZN7ee314613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31461[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee314613fooEv,_ZTv0_n12_N7ee314613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee31461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee31461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee31461[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee31461[] = {
  {&(_ZTV7ee31461[4]),  4,14},
  {&(_ZTV7ee31461[8]),  8,14},
  {&(_ZTV7ee31461[12]),  12,14},
  {&(_tg__ZTV6dd1461__7ee31461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee31461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31461[];
extern  VTBL_ENTRY _ZTV7ee31461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31461[];
static VTBL_ENTRY alt_thunk_names699[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee314613fooEv,_ZTv0_n12_N7ee314613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee314613fooEv,_ZThn16_N7ee314613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31461 = {  "ee31461", // class name
  bases_ee31461, 4,
  &(vtc_ee31461[0]), // expected_vtbl_contents
  &(vtt_ee31461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31461),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names699,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41461  : dd1461 {
  int e;
  virtual void  bar(); // _ZN7ee414613barEv
  ~ee41461(); // tgen
  ee41461(); // tgen
};
//SIG(1 ee41461) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee41461 ::bar(){vfunc_called(this, "_ZN7ee414613barEv");}
ee41461 ::~ee41461(){ note_dtor("ee41461", this);} // tgen
ee41461 ::ee41461(){ note_ctor("ee41461", this);} // tgen

static void Test_ee41461()
{
  extern Class_Descriptor cd_ee41461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41461, buf);
    ee41461 *dp, &lv = *(dp=new (buf) ee41461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee41461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee41461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(16,12), "ee41461");
    check_base_class_offset(lv, (dd1461*), 0, "ee41461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41461.e");
    test_class_info(&lv, &cd_ee41461);
    dp->~ee41461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41461(Test_ee41461, "ee41461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41461C1Ev();
extern void _ZN7ee41461D1Ev();
Name_Map name_map_ee41461[] = {
  NSPAIR(_ZN7ee41461C1Ev),
  NSPAIR(_ZN7ee41461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee41461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41461[];
extern void _ZN7ee414613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee414613barEv,_ZTv0_n16_N7ee414613barEv)();
extern void ABISELECT(_ZThn16_N7ee414613barEv,_ZThn12_N7ee414613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41461[0]),
  (VTBL_ENTRY)&_ZN7ee414613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee414613barEv,_ZTv0_n16_N7ee414613barEv),
};
extern VTBL_ENTRY _ZTV7ee41461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee41461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee41461[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee41461[] = {
  {&(_ZTV7ee41461[3]),  3,10},
  {&(_tg__ZTV6dd1461__7ee41461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee41461[4]),  4,6},
  {&(_ZTV7ee41461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41461[];
extern  VTBL_ENTRY _ZTV7ee41461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41461[];
static VTBL_ENTRY alt_thunk_names700[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee414613barEv,_ZTv0_n16_N7ee414613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee414613barEv,_ZThn12_N7ee414613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41461 = {  "ee41461", // class name
  bases_ee41461, 4,
  &(vtc_ee41461[0]), // expected_vtbl_contents
  &(vtt_ee41461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names700,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51461  : virtual dd1461 {
  int e;
  virtual void  bar(); // _ZN7ee514613barEv
  ~ee51461(); // tgen
  ee51461(); // tgen
};
//SIG(1 ee51461) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee51461 ::bar(){vfunc_called(this, "_ZN7ee514613barEv");}
ee51461 ::~ee51461(){ note_dtor("ee51461", this);} // tgen
ee51461 ::ee51461(){ note_ctor("ee51461", this);} // tgen

static void Test_ee51461()
{
  extern Class_Descriptor cd_ee51461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51461, buf);
    ee51461 *dp, &lv = *(dp=new (buf) ee51461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee51461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee51461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(32,16), "ee51461");
    check_base_class_offset(lv, (dd1461*), ABISELECT(16,8), "ee51461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51461.e");
    test_class_info(&lv, &cd_ee51461);
    dp->~ee51461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51461(Test_ee51461, "ee51461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51461C1Ev();
extern void _ZN7ee51461D1Ev();
Name_Map name_map_ee51461[] = {
  NSPAIR(_ZN7ee51461C1Ev),
  NSPAIR(_ZN7ee51461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee51461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51461[];
extern void _ZN7ee514613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee514613barEv,_ZTv0_n16_N7ee514613barEv)();
extern void ABISELECT(_ZThn32_N7ee514613barEv,_ZThn16_N7ee514613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51461[0]),
  (VTBL_ENTRY)&_ZN7ee514613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51461[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee514613barEv,_ZTv0_n16_N7ee514613barEv),
};
extern VTBL_ENTRY _ZTV7ee51461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee51461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee51461[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee51461[] = {
  {&(_ZTV7ee51461[4]),  4,14},
  {&(_ZTV7ee51461[8]),  8,14},
  {&(_ZTV7ee51461[12]),  12,14},
  {&(_tg__ZTV6dd1461__7ee51461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee51461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51461[];
extern  VTBL_ENTRY _ZTV7ee51461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51461[];
static VTBL_ENTRY alt_thunk_names701[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee514613barEv,_ZTv0_n16_N7ee514613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee514613barEv,_ZThn16_N7ee514613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51461 = {  "ee51461", // class name
  bases_ee51461, 4,
  &(vtc_ee51461[0]), // expected_vtbl_contents
  &(vtt_ee51461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51461),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names701,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61461  : dd1461 {
  int e;
  virtual void  foo(); // _ZN7ee614613fooEv
  virtual void  bar(); // _ZN7ee614613barEv
  ~ee61461(); // tgen
  ee61461(); // tgen
};
//SIG(1 ee61461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee61461 ::foo(){vfunc_called(this, "_ZN7ee614613fooEv");}
void  ee61461 ::bar(){vfunc_called(this, "_ZN7ee614613barEv");}
ee61461 ::~ee61461(){ note_dtor("ee61461", this);} // tgen
ee61461 ::ee61461(){ note_ctor("ee61461", this);} // tgen

static void Test_ee61461()
{
  extern Class_Descriptor cd_ee61461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61461, buf);
    ee61461 *dp, &lv = *(dp=new (buf) ee61461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee61461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee61461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(16,12), "ee61461");
    check_base_class_offset(lv, (dd1461*), 0, "ee61461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61461.e");
    test_class_info(&lv, &cd_ee61461);
    dp->~ee61461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61461(Test_ee61461, "ee61461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61461C1Ev();
extern void _ZN7ee61461D1Ev();
Name_Map name_map_ee61461[] = {
  NSPAIR(_ZN7ee61461C1Ev),
  NSPAIR(_ZN7ee61461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee61461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61461[];
extern void _ZN7ee614613fooEv();
extern void _ZN7ee614613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee614613fooEv,_ZTv0_n12_N7ee614613fooEv)();
extern void ABISELECT(_ZThn16_N7ee614613fooEv,_ZThn12_N7ee614613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee614613barEv,_ZTv0_n16_N7ee614613barEv)();
extern void ABISELECT(_ZThn16_N7ee614613barEv,_ZThn12_N7ee614613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61461[0]),
  (VTBL_ENTRY)&_ZN7ee614613fooEv,
  (VTBL_ENTRY)&_ZN7ee614613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee614613fooEv,_ZTv0_n12_N7ee614613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee614613barEv,_ZTv0_n16_N7ee614613barEv),
};
extern VTBL_ENTRY _ZTV7ee61461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee61461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee61461[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee61461[] = {
  {&(_ZTV7ee61461[3]),  3,11},
  {&(_tg__ZTV6dd1461__7ee61461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee61461[4]),  4,6},
  {&(_ZTV7ee61461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61461[];
extern  VTBL_ENTRY _ZTV7ee61461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61461[];
static VTBL_ENTRY alt_thunk_names702[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee614613barEv,_ZTv0_n16_N7ee614613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee614613barEv,_ZThn12_N7ee614613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee614613fooEv,_ZTv0_n12_N7ee614613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee614613fooEv,_ZThn12_N7ee614613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61461 = {  "ee61461", // class name
  bases_ee61461, 4,
  &(vtc_ee61461[0]), // expected_vtbl_contents
  &(vtt_ee61461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61461),4, //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  ee71461  : virtual dd1461 {
  int e;
  virtual void  foo(); // _ZN7ee714613fooEv
  virtual void  bar(); // _ZN7ee714613barEv
  ~ee71461(); // tgen
  ee71461(); // tgen
};
//SIG(1 ee71461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee71461 ::foo(){vfunc_called(this, "_ZN7ee714613fooEv");}
void  ee71461 ::bar(){vfunc_called(this, "_ZN7ee714613barEv");}
ee71461 ::~ee71461(){ note_dtor("ee71461", this);} // tgen
ee71461 ::ee71461(){ note_ctor("ee71461", this);} // tgen

static void Test_ee71461()
{
  extern Class_Descriptor cd_ee71461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71461, buf);
    ee71461 *dp, &lv = *(dp=new (buf) ee71461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee71461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee71461");
    check_base_class_offset(lv, (cc461*)(dd1461*), ABISELECT(32,16), "ee71461");
    check_base_class_offset(lv, (dd1461*), ABISELECT(16,8), "ee71461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71461.e");
    test_class_info(&lv, &cd_ee71461);
    dp->~ee71461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71461(Test_ee71461, "ee71461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71461C1Ev();
extern void _ZN7ee71461D1Ev();
Name_Map name_map_ee71461[] = {
  NSPAIR(_ZN7ee71461C1Ev),
  NSPAIR(_ZN7ee71461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd1461;
extern VTBL_ENTRY _ZTI6dd1461[];
extern  VTBL_ENTRY _ZTV6dd1461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1461[];
static Base_Class bases_ee71461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1461,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71461[];
extern void _ZN7ee714613fooEv();
extern void _ZN7ee714613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee714613fooEv,_ZTv0_n12_N7ee714613fooEv)();
extern void ABISELECT(_ZThn32_N7ee714613fooEv,_ZThn16_N7ee714613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee714613barEv,_ZTv0_n16_N7ee714613barEv)();
extern void ABISELECT(_ZThn32_N7ee714613barEv,_ZThn16_N7ee714613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71461[0]),
  (VTBL_ENTRY)&_ZN7ee714613fooEv,
  (VTBL_ENTRY)&_ZN7ee714613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71461[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee714613fooEv,_ZTv0_n12_N7ee714613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee714613barEv,_ZTv0_n16_N7ee714613barEv),
};
extern VTBL_ENTRY _ZTV7ee71461[];
static  VTBL_ENTRY _tg__ZTV6dd1461__7ee71461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
};
extern void _ZN4bb613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd1461__7ee71461[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee71461[] = {
  {&(_ZTV7ee71461[4]),  4,15},
  {&(_ZTV7ee71461[9]),  9,15},
  {&(_ZTV7ee71461[13]),  13,15},
  {&(_tg__ZTV6dd1461__7ee71461[3]),  3,3},
  {&(_tg__ZTV5cc461__6dd1461__7ee71461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71461[];
extern  VTBL_ENTRY _ZTV7ee71461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71461[];
static VTBL_ENTRY alt_thunk_names703[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee714613barEv,_ZTv0_n16_N7ee714613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee714613barEv,_ZThn16_N7ee714613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee714613fooEv,_ZTv0_n12_N7ee714613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee714613fooEv,_ZThn16_N7ee714613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71461 = {  "ee71461", // class name
  bases_ee71461, 4,
  &(vtc_ee71461[0]), // expected_vtbl_contents
  &(vtt_ee71461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71461),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71461),5, //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  dd2461  : cc461 {
  int d;
  virtual void  foo(); // _ZN6dd24613fooEv
  ~dd2461(); // tgen
  dd2461(); // tgen
};
//SIG(-1 dd2461) C1{ BC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd2461 ::foo(){vfunc_called(this, "_ZN6dd24613fooEv");}
dd2461 ::~dd2461(){ note_dtor("dd2461", this);} // tgen
dd2461 ::dd2461(){ note_ctor("dd2461", this);} // tgen

static void Test_dd2461()
{
  extern Class_Descriptor cd_dd2461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2461, buf);
    dd2461 *dp, &lv = *(dp=new (buf) dd2461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), 0, "dd2461");
    check_base_class_offset(lv, (bb61*)(cc461*), 0, "dd2461");
    check_base_class_offset(lv, (cc461*), 0, "dd2461");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2461.d");
    test_class_info(&lv, &cd_dd2461);
    dp->~dd2461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2461(Test_dd2461, "dd2461", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2461C1Ev();
extern void _ZN6dd2461D1Ev();
Name_Map name_map_dd2461[] = {
  NSPAIR(_ZN6dd2461C1Ev),
  NSPAIR(_ZN6dd2461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd2461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2461[];
extern void _ZN6dd24613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_dd2461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2461[0]),
  (VTBL_ENTRY)&_ZN6dd24613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
Class_Descriptor cd_dd2461 = {  "dd2461", // class name
  bases_dd2461, 3,
  &(vtc_dd2461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2461),4, //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  ee02461  : dd2461 {
  int e;
  ~ee02461(); // tgen
  ee02461(); // tgen
};
//SIG(1 ee02461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee02461 ::~ee02461(){ note_dtor("ee02461", this);} // tgen
ee02461 ::ee02461(){ note_ctor("ee02461", this);} // tgen

static void Test_ee02461()
{
  extern Class_Descriptor cd_ee02461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02461, buf);
    ee02461 *dp, &lv = *(dp=new (buf) ee02461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), 0, "ee02461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), 0, "ee02461");
    check_base_class_offset(lv, (cc461*)(dd2461*), 0, "ee02461");
    check_base_class_offset(lv, (dd2461*), 0, "ee02461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02461.e");
    test_class_info(&lv, &cd_ee02461);
    dp->~ee02461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02461(Test_ee02461, "ee02461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02461C1Ev();
extern void _ZN7ee02461D1Ev();
Name_Map name_map_ee02461[] = {
  NSPAIR(_ZN7ee02461C1Ev),
  NSPAIR(_ZN7ee02461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee02461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02461[];
extern void _ZN6dd24613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee02461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02461[0]),
  (VTBL_ENTRY)&_ZN6dd24613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTI7ee02461[];
extern  VTBL_ENTRY _ZTV7ee02461[];
Class_Descriptor cd_ee02461 = {  "ee02461", // class name
  bases_ee02461, 4,
  &(vtc_ee02461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02461),4, //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  ee12461  : virtual dd2461 {
  int e;
  ~ee12461(); // tgen
  ee12461(); // tgen
};
//SIG(1 ee12461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee12461 ::~ee12461(){ note_dtor("ee12461", this);} // tgen
ee12461 ::ee12461(){ note_ctor("ee12461", this);} // tgen

static void Test_ee12461()
{
  extern Class_Descriptor cd_ee12461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12461, buf);
    ee12461 *dp, &lv = *(dp=new (buf) ee12461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee12461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee12461");
    check_base_class_offset(lv, (cc461*)(dd2461*), ABISELECT(16,8), "ee12461");
    check_base_class_offset(lv, (dd2461*), ABISELECT(16,8), "ee12461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12461.e");
    test_class_info(&lv, &cd_ee12461);
    dp->~ee12461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12461(Test_ee12461, "ee12461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12461C1Ev();
extern void _ZN7ee12461D1Ev();
Name_Map name_map_ee12461[] = {
  NSPAIR(_ZN7ee12461C1Ev),
  NSPAIR(_ZN7ee12461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee12461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12461[];
extern void _ZN6dd24613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee12461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12461[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12461[0]),
  (VTBL_ENTRY)&_ZN6dd24613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee12461[];
static  VTT_ENTRY vtt_ee12461[] = {
  {&(_ZTV7ee12461[3]),  3,9},
  {&(_ZTV7ee12461[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12461[];
extern  VTBL_ENTRY _ZTV7ee12461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12461[];
Class_Descriptor cd_ee12461 = {  "ee12461", // class name
  bases_ee12461, 4,
  &(vtc_ee12461[0]), // expected_vtbl_contents
  &(vtt_ee12461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12461),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12461),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  ee22461  : dd2461 {
  int e;
  virtual void  foo(); // _ZN7ee224613fooEv
  ~ee22461(); // tgen
  ee22461(); // tgen
};
//SIG(1 ee22461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee22461 ::foo(){vfunc_called(this, "_ZN7ee224613fooEv");}
ee22461 ::~ee22461(){ note_dtor("ee22461", this);} // tgen
ee22461 ::ee22461(){ note_ctor("ee22461", this);} // tgen

static void Test_ee22461()
{
  extern Class_Descriptor cd_ee22461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22461, buf);
    ee22461 *dp, &lv = *(dp=new (buf) ee22461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), 0, "ee22461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), 0, "ee22461");
    check_base_class_offset(lv, (cc461*)(dd2461*), 0, "ee22461");
    check_base_class_offset(lv, (dd2461*), 0, "ee22461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22461.e");
    test_class_info(&lv, &cd_ee22461);
    dp->~ee22461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22461(Test_ee22461, "ee22461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22461C1Ev();
extern void _ZN7ee22461D1Ev();
Name_Map name_map_ee22461[] = {
  NSPAIR(_ZN7ee22461C1Ev),
  NSPAIR(_ZN7ee22461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee22461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22461[];
extern void _ZN7ee224613fooEv();
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee22461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22461[0]),
  (VTBL_ENTRY)&_ZN7ee224613fooEv,
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTI7ee22461[];
extern  VTBL_ENTRY _ZTV7ee22461[];
Class_Descriptor cd_ee22461 = {  "ee22461", // class name
  bases_ee22461, 4,
  &(vtc_ee22461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22461),4, //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  ee32461  : virtual dd2461 {
  int e;
  virtual void  foo(); // _ZN7ee324613fooEv
  ~ee32461(); // tgen
  ee32461(); // tgen
};
//SIG(1 ee32461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee32461 ::foo(){vfunc_called(this, "_ZN7ee324613fooEv");}
ee32461 ::~ee32461(){ note_dtor("ee32461", this);} // tgen
ee32461 ::ee32461(){ note_ctor("ee32461", this);} // tgen

static void Test_ee32461()
{
  extern Class_Descriptor cd_ee32461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32461, buf);
    ee32461 *dp, &lv = *(dp=new (buf) ee32461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee32461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee32461");
    check_base_class_offset(lv, (cc461*)(dd2461*), ABISELECT(16,8), "ee32461");
    check_base_class_offset(lv, (dd2461*), ABISELECT(16,8), "ee32461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32461.e");
    test_class_info(&lv, &cd_ee32461);
    dp->~ee32461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32461(Test_ee32461, "ee32461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32461C1Ev();
extern void _ZN7ee32461D1Ev();
Name_Map name_map_ee32461[] = {
  NSPAIR(_ZN7ee32461C1Ev),
  NSPAIR(_ZN7ee32461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee32461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32461[];
extern void _ZN7ee324613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee324613fooEv,_ZTv0_n12_N7ee324613fooEv)();
extern void ABISELECT(_ZThn16_N7ee324613fooEv,_ZThn8_N7ee324613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee32461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32461[0]),
  (VTBL_ENTRY)&_ZN7ee324613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee324613fooEv,_ZTv0_n12_N7ee324613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee32461[];
static  VTT_ENTRY vtt_ee32461[] = {
  {&(_ZTV7ee32461[3]),  3,10},
  {&(_ZTV7ee32461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32461[];
extern  VTBL_ENTRY _ZTV7ee32461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32461[];
static VTBL_ENTRY alt_thunk_names704[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee324613fooEv,_ZTv0_n12_N7ee324613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee324613fooEv,_ZThn8_N7ee324613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32461 = {  "ee32461", // class name
  bases_ee32461, 4,
  &(vtc_ee32461[0]), // expected_vtbl_contents
  &(vtt_ee32461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32461),2, //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  ee42461  : dd2461 {
  int e;
  virtual void  bar(); // _ZN7ee424613barEv
  ~ee42461(); // tgen
  ee42461(); // tgen
};
//SIG(1 ee42461) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee42461 ::bar(){vfunc_called(this, "_ZN7ee424613barEv");}
ee42461 ::~ee42461(){ note_dtor("ee42461", this);} // tgen
ee42461 ::ee42461(){ note_ctor("ee42461", this);} // tgen

static void Test_ee42461()
{
  extern Class_Descriptor cd_ee42461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42461, buf);
    ee42461 *dp, &lv = *(dp=new (buf) ee42461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), 0, "ee42461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), 0, "ee42461");
    check_base_class_offset(lv, (cc461*)(dd2461*), 0, "ee42461");
    check_base_class_offset(lv, (dd2461*), 0, "ee42461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42461.e");
    test_class_info(&lv, &cd_ee42461);
    dp->~ee42461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42461(Test_ee42461, "ee42461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42461C1Ev();
extern void _ZN7ee42461D1Ev();
Name_Map name_map_ee42461[] = {
  NSPAIR(_ZN7ee42461C1Ev),
  NSPAIR(_ZN7ee42461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee42461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42461[];
extern void _ZN6dd24613fooEv();
extern void _ZN7ee424613barEv();
static  VTBL_ENTRY vtc_ee42461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42461[0]),
  (VTBL_ENTRY)&_ZN6dd24613fooEv,
  (VTBL_ENTRY)&_ZN7ee424613barEv,
};
extern VTBL_ENTRY _ZTI7ee42461[];
extern  VTBL_ENTRY _ZTV7ee42461[];
Class_Descriptor cd_ee42461 = {  "ee42461", // class name
  bases_ee42461, 4,
  &(vtc_ee42461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42461),4, //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  ee52461  : virtual dd2461 {
  int e;
  virtual void  bar(); // _ZN7ee524613barEv
  ~ee52461(); // tgen
  ee52461(); // tgen
};
//SIG(1 ee52461) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee52461 ::bar(){vfunc_called(this, "_ZN7ee524613barEv");}
ee52461 ::~ee52461(){ note_dtor("ee52461", this);} // tgen
ee52461 ::ee52461(){ note_ctor("ee52461", this);} // tgen

static void Test_ee52461()
{
  extern Class_Descriptor cd_ee52461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52461, buf);
    ee52461 *dp, &lv = *(dp=new (buf) ee52461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee52461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee52461");
    check_base_class_offset(lv, (cc461*)(dd2461*), ABISELECT(16,8), "ee52461");
    check_base_class_offset(lv, (dd2461*), ABISELECT(16,8), "ee52461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52461.e");
    test_class_info(&lv, &cd_ee52461);
    dp->~ee52461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52461(Test_ee52461, "ee52461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52461C1Ev();
extern void _ZN7ee52461D1Ev();
Name_Map name_map_ee52461[] = {
  NSPAIR(_ZN7ee52461C1Ev),
  NSPAIR(_ZN7ee52461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee52461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52461[];
extern void _ZN7ee524613barEv();
extern void _ZN6dd24613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee524613barEv,_ZTv0_n16_N7ee524613barEv)();
extern void ABISELECT(_ZThn16_N7ee524613barEv,_ZThn8_N7ee524613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52461[0]),
  (VTBL_ENTRY)&_ZN7ee524613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52461[0]),
  (VTBL_ENTRY)&_ZN6dd24613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee524613barEv,_ZTv0_n16_N7ee524613barEv),
};
extern VTBL_ENTRY _ZTV7ee52461[];
static  VTT_ENTRY vtt_ee52461[] = {
  {&(_ZTV7ee52461[3]),  3,10},
  {&(_ZTV7ee52461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52461[];
extern  VTBL_ENTRY _ZTV7ee52461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52461[];
static VTBL_ENTRY alt_thunk_names705[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee524613barEv,_ZTv0_n16_N7ee524613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee524613barEv,_ZThn8_N7ee524613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52461 = {  "ee52461", // class name
  bases_ee52461, 4,
  &(vtc_ee52461[0]), // expected_vtbl_contents
  &(vtt_ee52461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52461),2, //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  ee62461  : dd2461 {
  int e;
  virtual void  foo(); // _ZN7ee624613fooEv
  virtual void  bar(); // _ZN7ee624613barEv
  ~ee62461(); // tgen
  ee62461(); // tgen
};
//SIG(1 ee62461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62461 ::foo(){vfunc_called(this, "_ZN7ee624613fooEv");}
void  ee62461 ::bar(){vfunc_called(this, "_ZN7ee624613barEv");}
ee62461 ::~ee62461(){ note_dtor("ee62461", this);} // tgen
ee62461 ::ee62461(){ note_ctor("ee62461", this);} // tgen

static void Test_ee62461()
{
  extern Class_Descriptor cd_ee62461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62461, buf);
    ee62461 *dp, &lv = *(dp=new (buf) ee62461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), 0, "ee62461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), 0, "ee62461");
    check_base_class_offset(lv, (cc461*)(dd2461*), 0, "ee62461");
    check_base_class_offset(lv, (dd2461*), 0, "ee62461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62461.e");
    test_class_info(&lv, &cd_ee62461);
    dp->~ee62461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62461(Test_ee62461, "ee62461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62461C1Ev();
extern void _ZN7ee62461D1Ev();
Name_Map name_map_ee62461[] = {
  NSPAIR(_ZN7ee62461C1Ev),
  NSPAIR(_ZN7ee62461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee62461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62461[];
extern void _ZN7ee624613fooEv();
extern void _ZN7ee624613barEv();
static  VTBL_ENTRY vtc_ee62461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62461[0]),
  (VTBL_ENTRY)&_ZN7ee624613fooEv,
  (VTBL_ENTRY)&_ZN7ee624613barEv,
};
extern VTBL_ENTRY _ZTI7ee62461[];
extern  VTBL_ENTRY _ZTV7ee62461[];
Class_Descriptor cd_ee62461 = {  "ee62461", // class name
  bases_ee62461, 4,
  &(vtc_ee62461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62461),4, //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  ee72461  : virtual dd2461 {
  int e;
  virtual void  foo(); // _ZN7ee724613fooEv
  virtual void  bar(); // _ZN7ee724613barEv
  ~ee72461(); // tgen
  ee72461(); // tgen
};
//SIG(1 ee72461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72461 ::foo(){vfunc_called(this, "_ZN7ee724613fooEv");}
void  ee72461 ::bar(){vfunc_called(this, "_ZN7ee724613barEv");}
ee72461 ::~ee72461(){ note_dtor("ee72461", this);} // tgen
ee72461 ::ee72461(){ note_ctor("ee72461", this);} // tgen

static void Test_ee72461()
{
  extern Class_Descriptor cd_ee72461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72461, buf);
    ee72461 *dp, &lv = *(dp=new (buf) ee72461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee72461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd2461*), ABISELECT(16,8), "ee72461");
    check_base_class_offset(lv, (cc461*)(dd2461*), ABISELECT(16,8), "ee72461");
    check_base_class_offset(lv, (dd2461*), ABISELECT(16,8), "ee72461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72461.e");
    test_class_info(&lv, &cd_ee72461);
    dp->~ee72461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72461(Test_ee72461, "ee72461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72461C1Ev();
extern void _ZN7ee72461D1Ev();
Name_Map name_map_ee72461[] = {
  NSPAIR(_ZN7ee72461C1Ev),
  NSPAIR(_ZN7ee72461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd2461;
extern VTBL_ENTRY _ZTI6dd2461[];
extern  VTBL_ENTRY _ZTV6dd2461[];
static Base_Class bases_ee72461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2461,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72461[];
extern void _ZN7ee724613fooEv();
extern void _ZN7ee724613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee724613fooEv,_ZTv0_n12_N7ee724613fooEv)();
extern void ABISELECT(_ZThn16_N7ee724613fooEv,_ZThn8_N7ee724613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee724613barEv,_ZTv0_n16_N7ee724613barEv)();
extern void ABISELECT(_ZThn16_N7ee724613barEv,_ZThn8_N7ee724613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72461[0]),
  (VTBL_ENTRY)&_ZN7ee724613fooEv,
  (VTBL_ENTRY)&_ZN7ee724613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee724613fooEv,_ZTv0_n12_N7ee724613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee724613barEv,_ZTv0_n16_N7ee724613barEv),
};
extern VTBL_ENTRY _ZTV7ee72461[];
static  VTT_ENTRY vtt_ee72461[] = {
  {&(_ZTV7ee72461[3]),  3,11},
  {&(_ZTV7ee72461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72461[];
extern  VTBL_ENTRY _ZTV7ee72461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72461[];
static VTBL_ENTRY alt_thunk_names706[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee724613barEv,_ZTv0_n16_N7ee724613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee724613barEv,_ZThn8_N7ee724613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee724613fooEv,_ZTv0_n12_N7ee724613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee724613fooEv,_ZThn8_N7ee724613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72461 = {  "ee72461", // class name
  bases_ee72461, 4,
  &(vtc_ee72461[0]), // expected_vtbl_contents
  &(vtt_ee72461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names706,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3461  : virtual cc461 {
  int d;
  virtual void  foo(); // _ZN6dd34613fooEv
  ~dd3461(); // tgen
  dd3461(); // tgen
};
//SIG(-1 dd3461) C1{ VBC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd3461 ::foo(){vfunc_called(this, "_ZN6dd34613fooEv");}
dd3461 ::~dd3461(){ note_dtor("dd3461", this);} // tgen
dd3461 ::dd3461(){ note_ctor("dd3461", this);} // tgen

static void Test_dd3461()
{
  extern Class_Descriptor cd_dd3461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3461, buf);
    dd3461 *dp, &lv = *(dp=new (buf) dd3461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,8), "dd3461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,8), "dd3461");
    check_base_class_offset(lv, (cc461*), ABISELECT(16,8), "dd3461");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3461.d");
    test_class_info(&lv, &cd_dd3461);
    dp->~dd3461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3461(Test_dd3461, "dd3461", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3461C1Ev();
extern void _ZN6dd3461D1Ev();
Name_Map name_map_dd3461[] = {
  NSPAIR(_ZN6dd3461C1Ev),
  NSPAIR(_ZN6dd3461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd3461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3461[];
extern void _ZN6dd34613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_dd3461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV6dd3461[];
static  VTT_ENTRY vtt_dd3461[] = {
  {&(_ZTV6dd3461[3]),  3,10},
  {&(_ZTV6dd3461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static VTBL_ENTRY alt_thunk_names707[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3461 = {  "dd3461", // class name
  bases_dd3461, 3,
  &(vtc_dd3461[0]), // expected_vtbl_contents
  &(vtt_dd3461[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3461),2, //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  ee03461  : dd3461 {
  int e;
  ~ee03461(); // tgen
  ee03461(); // tgen
};
//SIG(1 ee03461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee03461 ::~ee03461(){ note_dtor("ee03461", this);} // tgen
ee03461 ::ee03461(){ note_ctor("ee03461", this);} // tgen

static void Test_ee03461()
{
  extern Class_Descriptor cd_ee03461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03461, buf);
    ee03461 *dp, &lv = *(dp=new (buf) ee03461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee03461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee03461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(16,12), "ee03461");
    check_base_class_offset(lv, (dd3461*), 0, "ee03461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03461.e");
    test_class_info(&lv, &cd_ee03461);
    dp->~ee03461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03461(Test_ee03461, "ee03461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03461C1Ev();
extern void _ZN7ee03461D1Ev();
Name_Map name_map_ee03461[] = {
  NSPAIR(_ZN7ee03461C1Ev),
  NSPAIR(_ZN7ee03461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee03461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03461[];
extern void _ZN6dd34613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee03461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee03461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee03461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee03461[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee03461[] = {
  {&(_ZTV7ee03461[3]),  3,10},
  {&(_tg__ZTV6dd3461__7ee03461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee03461[4]),  4,6},
  {&(_ZTV7ee03461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03461[];
extern  VTBL_ENTRY _ZTV7ee03461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03461[];
static VTBL_ENTRY alt_thunk_names708[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03461 = {  "ee03461", // class name
  bases_ee03461, 4,
  &(vtc_ee03461[0]), // expected_vtbl_contents
  &(vtt_ee03461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names708,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13461  : virtual dd3461 {
  int e;
  ~ee13461(); // tgen
  ee13461(); // tgen
};
//SIG(1 ee13461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee13461 ::~ee13461(){ note_dtor("ee13461", this);} // tgen
ee13461 ::ee13461(){ note_ctor("ee13461", this);} // tgen

static void Test_ee13461()
{
  extern Class_Descriptor cd_ee13461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13461, buf);
    ee13461 *dp, &lv = *(dp=new (buf) ee13461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee13461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee13461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(32,16), "ee13461");
    check_base_class_offset(lv, (dd3461*), ABISELECT(16,8), "ee13461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13461.e");
    test_class_info(&lv, &cd_ee13461);
    dp->~ee13461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13461(Test_ee13461, "ee13461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13461C1Ev();
extern void _ZN7ee13461D1Ev();
Name_Map name_map_ee13461[] = {
  NSPAIR(_ZN7ee13461C1Ev),
  NSPAIR(_ZN7ee13461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee13461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13461[];
extern void _ZN6dd34613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee13461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13461[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee13461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee13461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee13461[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee13461[] = {
  {&(_ZTV7ee13461[4]),  4,15},
  {&(_ZTV7ee13461[8]),  8,15},
  {&(_ZTV7ee13461[13]),  13,15},
  {&(_tg__ZTV6dd3461__7ee13461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee13461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13461[];
extern  VTBL_ENTRY _ZTV7ee13461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13461[];
static VTBL_ENTRY alt_thunk_names709[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13461 = {  "ee13461", // class name
  bases_ee13461, 4,
  &(vtc_ee13461[0]), // expected_vtbl_contents
  &(vtt_ee13461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13461),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names709,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23461  : dd3461 {
  int e;
  virtual void  foo(); // _ZN7ee234613fooEv
  ~ee23461(); // tgen
  ee23461(); // tgen
};
//SIG(1 ee23461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee23461 ::foo(){vfunc_called(this, "_ZN7ee234613fooEv");}
ee23461 ::~ee23461(){ note_dtor("ee23461", this);} // tgen
ee23461 ::ee23461(){ note_ctor("ee23461", this);} // tgen

static void Test_ee23461()
{
  extern Class_Descriptor cd_ee23461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23461, buf);
    ee23461 *dp, &lv = *(dp=new (buf) ee23461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee23461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee23461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(16,12), "ee23461");
    check_base_class_offset(lv, (dd3461*), 0, "ee23461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23461.e");
    test_class_info(&lv, &cd_ee23461);
    dp->~ee23461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23461(Test_ee23461, "ee23461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23461C1Ev();
extern void _ZN7ee23461D1Ev();
Name_Map name_map_ee23461[] = {
  NSPAIR(_ZN7ee23461C1Ev),
  NSPAIR(_ZN7ee23461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee23461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23461[];
extern void _ZN7ee234613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee234613fooEv,_ZTv0_n12_N7ee234613fooEv)();
extern void ABISELECT(_ZThn16_N7ee234613fooEv,_ZThn12_N7ee234613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee23461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23461[0]),
  (VTBL_ENTRY)&_ZN7ee234613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee234613fooEv,_ZTv0_n12_N7ee234613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee23461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee23461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee23461[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee23461[] = {
  {&(_ZTV7ee23461[3]),  3,10},
  {&(_tg__ZTV6dd3461__7ee23461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee23461[4]),  4,6},
  {&(_ZTV7ee23461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23461[];
extern  VTBL_ENTRY _ZTV7ee23461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23461[];
static VTBL_ENTRY alt_thunk_names710[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee234613fooEv,_ZTv0_n12_N7ee234613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee234613fooEv,_ZThn12_N7ee234613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23461 = {  "ee23461", // class name
  bases_ee23461, 4,
  &(vtc_ee23461[0]), // expected_vtbl_contents
  &(vtt_ee23461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names710,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33461  : virtual dd3461 {
  int e;
  virtual void  foo(); // _ZN7ee334613fooEv
  ~ee33461(); // tgen
  ee33461(); // tgen
};
//SIG(1 ee33461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee33461 ::foo(){vfunc_called(this, "_ZN7ee334613fooEv");}
ee33461 ::~ee33461(){ note_dtor("ee33461", this);} // tgen
ee33461 ::ee33461(){ note_ctor("ee33461", this);} // tgen

static void Test_ee33461()
{
  extern Class_Descriptor cd_ee33461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33461, buf);
    ee33461 *dp, &lv = *(dp=new (buf) ee33461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee33461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee33461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(32,16), "ee33461");
    check_base_class_offset(lv, (dd3461*), ABISELECT(16,8), "ee33461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33461.e");
    test_class_info(&lv, &cd_ee33461);
    dp->~ee33461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33461(Test_ee33461, "ee33461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33461C1Ev();
extern void _ZN7ee33461D1Ev();
Name_Map name_map_ee33461[] = {
  NSPAIR(_ZN7ee33461C1Ev),
  NSPAIR(_ZN7ee33461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee33461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33461[];
extern void _ZN7ee334613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee334613fooEv,_ZTv0_n16_N7ee334613fooEv)();
extern void ABISELECT(_ZThn16_N7ee334613fooEv,_ZThn8_N7ee334613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee334613fooEv,_ZTv0_n12_N7ee334613fooEv)();
extern void ABISELECT(_ZThn32_N7ee334613fooEv,_ZThn16_N7ee334613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY vtc_ee33461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33461[0]),
  (VTBL_ENTRY)&_ZN7ee334613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee334613fooEv,_ZTv0_n16_N7ee334613fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee334613fooEv,_ZTv0_n12_N7ee334613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
extern VTBL_ENTRY _ZTV7ee33461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee33461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee33461[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee33461[] = {
  {&(_ZTV7ee33461[4]),  4,16},
  {&(_ZTV7ee33461[9]),  9,16},
  {&(_ZTV7ee33461[14]),  14,16},
  {&(_tg__ZTV6dd3461__7ee33461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee33461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33461[];
extern  VTBL_ENTRY _ZTV7ee33461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33461[];
static VTBL_ENTRY alt_thunk_names711[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee334613fooEv,_ZTv0_n12_N7ee334613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee334613fooEv,_ZThn16_N7ee334613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee334613fooEv,_ZTv0_n16_N7ee334613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee334613fooEv,_ZThn8_N7ee334613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33461 = {  "ee33461", // class name
  bases_ee33461, 4,
  &(vtc_ee33461[0]), // expected_vtbl_contents
  &(vtt_ee33461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33461),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names711,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43461  : dd3461 {
  int e;
  virtual void  bar(); // _ZN7ee434613barEv
  ~ee43461(); // tgen
  ee43461(); // tgen
};
//SIG(1 ee43461) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee43461 ::bar(){vfunc_called(this, "_ZN7ee434613barEv");}
ee43461 ::~ee43461(){ note_dtor("ee43461", this);} // tgen
ee43461 ::ee43461(){ note_ctor("ee43461", this);} // tgen

static void Test_ee43461()
{
  extern Class_Descriptor cd_ee43461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43461, buf);
    ee43461 *dp, &lv = *(dp=new (buf) ee43461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee43461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee43461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(16,12), "ee43461");
    check_base_class_offset(lv, (dd3461*), 0, "ee43461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43461.e");
    test_class_info(&lv, &cd_ee43461);
    dp->~ee43461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43461(Test_ee43461, "ee43461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43461C1Ev();
extern void _ZN7ee43461D1Ev();
Name_Map name_map_ee43461[] = {
  NSPAIR(_ZN7ee43461C1Ev),
  NSPAIR(_ZN7ee43461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee43461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43461[];
extern void _ZN6dd34613fooEv();
extern void _ZN7ee434613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee434613barEv,_ZTv0_n16_N7ee434613barEv)();
extern void ABISELECT(_ZThn16_N7ee434613barEv,_ZThn12_N7ee434613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
  (VTBL_ENTRY)&_ZN7ee434613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee434613barEv,_ZTv0_n16_N7ee434613barEv),
};
extern VTBL_ENTRY _ZTV7ee43461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee43461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee43461[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee43461[] = {
  {&(_ZTV7ee43461[3]),  3,11},
  {&(_tg__ZTV6dd3461__7ee43461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee43461[4]),  4,6},
  {&(_ZTV7ee43461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43461[];
extern  VTBL_ENTRY _ZTV7ee43461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43461[];
static VTBL_ENTRY alt_thunk_names712[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee434613barEv,_ZTv0_n16_N7ee434613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee434613barEv,_ZThn12_N7ee434613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43461 = {  "ee43461", // class name
  bases_ee43461, 4,
  &(vtc_ee43461[0]), // expected_vtbl_contents
  &(vtt_ee43461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names712,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53461  : virtual dd3461 {
  int e;
  virtual void  bar(); // _ZN7ee534613barEv
  ~ee53461(); // tgen
  ee53461(); // tgen
};
//SIG(1 ee53461) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee53461 ::bar(){vfunc_called(this, "_ZN7ee534613barEv");}
ee53461 ::~ee53461(){ note_dtor("ee53461", this);} // tgen
ee53461 ::ee53461(){ note_ctor("ee53461", this);} // tgen

static void Test_ee53461()
{
  extern Class_Descriptor cd_ee53461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53461, buf);
    ee53461 *dp, &lv = *(dp=new (buf) ee53461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee53461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee53461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(32,16), "ee53461");
    check_base_class_offset(lv, (dd3461*), ABISELECT(16,8), "ee53461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53461.e");
    test_class_info(&lv, &cd_ee53461);
    dp->~ee53461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53461(Test_ee53461, "ee53461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53461C1Ev();
extern void _ZN7ee53461D1Ev();
Name_Map name_map_ee53461[] = {
  NSPAIR(_ZN7ee53461C1Ev),
  NSPAIR(_ZN7ee53461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee53461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53461[];
extern void _ZN7ee534613barEv();
extern void _ZN6dd34613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee534613barEv,_ZTv0_n16_N7ee534613barEv)();
extern void ABISELECT(_ZThn32_N7ee534613barEv,_ZThn16_N7ee534613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53461[0]),
  (VTBL_ENTRY)&_ZN7ee534613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee534613barEv,_ZTv0_n16_N7ee534613barEv),
};
extern VTBL_ENTRY _ZTV7ee53461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee53461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee53461[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee53461[] = {
  {&(_ZTV7ee53461[4]),  4,16},
  {&(_ZTV7ee53461[9]),  9,16},
  {&(_ZTV7ee53461[14]),  14,16},
  {&(_tg__ZTV6dd3461__7ee53461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee53461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53461[];
extern  VTBL_ENTRY _ZTV7ee53461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53461[];
static VTBL_ENTRY alt_thunk_names713[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee534613barEv,_ZTv0_n16_N7ee534613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee534613barEv,_ZThn16_N7ee534613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53461 = {  "ee53461", // class name
  bases_ee53461, 4,
  &(vtc_ee53461[0]), // expected_vtbl_contents
  &(vtt_ee53461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53461),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names713,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63461  : dd3461 {
  int e;
  virtual void  foo(); // _ZN7ee634613fooEv
  virtual void  bar(); // _ZN7ee634613barEv
  ~ee63461(); // tgen
  ee63461(); // tgen
};
//SIG(1 ee63461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63461 ::foo(){vfunc_called(this, "_ZN7ee634613fooEv");}
void  ee63461 ::bar(){vfunc_called(this, "_ZN7ee634613barEv");}
ee63461 ::~ee63461(){ note_dtor("ee63461", this);} // tgen
ee63461 ::ee63461(){ note_ctor("ee63461", this);} // tgen

static void Test_ee63461()
{
  extern Class_Descriptor cd_ee63461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63461, buf);
    ee63461 *dp, &lv = *(dp=new (buf) ee63461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee63461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee63461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(16,12), "ee63461");
    check_base_class_offset(lv, (dd3461*), 0, "ee63461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63461.e");
    test_class_info(&lv, &cd_ee63461);
    dp->~ee63461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63461(Test_ee63461, "ee63461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63461C1Ev();
extern void _ZN7ee63461D1Ev();
Name_Map name_map_ee63461[] = {
  NSPAIR(_ZN7ee63461C1Ev),
  NSPAIR(_ZN7ee63461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee63461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63461[];
extern void _ZN7ee634613fooEv();
extern void _ZN7ee634613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee634613fooEv,_ZTv0_n12_N7ee634613fooEv)();
extern void ABISELECT(_ZThn16_N7ee634613fooEv,_ZThn12_N7ee634613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee634613barEv,_ZTv0_n16_N7ee634613barEv)();
extern void ABISELECT(_ZThn16_N7ee634613barEv,_ZThn12_N7ee634613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63461[0]),
  (VTBL_ENTRY)&_ZN7ee634613fooEv,
  (VTBL_ENTRY)&_ZN7ee634613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee634613fooEv,_ZTv0_n12_N7ee634613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee634613barEv,_ZTv0_n16_N7ee634613barEv),
};
extern VTBL_ENTRY _ZTV7ee63461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee63461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee63461[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee63461[] = {
  {&(_ZTV7ee63461[3]),  3,11},
  {&(_tg__ZTV6dd3461__7ee63461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee63461[4]),  4,6},
  {&(_ZTV7ee63461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63461[];
extern  VTBL_ENTRY _ZTV7ee63461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63461[];
static VTBL_ENTRY alt_thunk_names714[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn12_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee634613barEv,_ZTv0_n16_N7ee634613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee634613barEv,_ZThn12_N7ee634613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee634613fooEv,_ZTv0_n12_N7ee634613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee634613fooEv,_ZThn12_N7ee634613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63461 = {  "ee63461", // class name
  bases_ee63461, 4,
  &(vtc_ee63461[0]), // expected_vtbl_contents
  &(vtt_ee63461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names714,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73461  : virtual dd3461 {
  int e;
  virtual void  foo(); // _ZN7ee734613fooEv
  virtual void  bar(); // _ZN7ee734613barEv
  ~ee73461(); // tgen
  ee73461(); // tgen
};
//SIG(1 ee73461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73461 ::foo(){vfunc_called(this, "_ZN7ee734613fooEv");}
void  ee73461 ::bar(){vfunc_called(this, "_ZN7ee734613barEv");}
ee73461 ::~ee73461(){ note_dtor("ee73461", this);} // tgen
ee73461 ::ee73461(){ note_ctor("ee73461", this);} // tgen

static void Test_ee73461()
{
  extern Class_Descriptor cd_ee73461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73461, buf);
    ee73461 *dp, &lv = *(dp=new (buf) ee73461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee73461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee73461");
    check_base_class_offset(lv, (cc461*)(dd3461*), ABISELECT(32,16), "ee73461");
    check_base_class_offset(lv, (dd3461*), ABISELECT(16,8), "ee73461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73461.e");
    test_class_info(&lv, &cd_ee73461);
    dp->~ee73461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73461(Test_ee73461, "ee73461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73461C1Ev();
extern void _ZN7ee73461D1Ev();
Name_Map name_map_ee73461[] = {
  NSPAIR(_ZN7ee73461C1Ev),
  NSPAIR(_ZN7ee73461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd3461;
extern VTBL_ENTRY _ZTI6dd3461[];
extern  VTBL_ENTRY _ZTV6dd3461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3461[];
static Base_Class bases_ee73461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3461,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73461[];
extern void _ZN7ee734613fooEv();
extern void _ZN7ee734613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee734613fooEv,_ZTv0_n16_N7ee734613fooEv)();
extern void ABISELECT(_ZThn16_N7ee734613fooEv,_ZThn8_N7ee734613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee734613fooEv,_ZTv0_n12_N7ee734613fooEv)();
extern void ABISELECT(_ZThn32_N7ee734613fooEv,_ZThn16_N7ee734613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee734613barEv,_ZTv0_n16_N7ee734613barEv)();
extern void ABISELECT(_ZThn32_N7ee734613barEv,_ZThn16_N7ee734613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73461[0]),
  (VTBL_ENTRY)&_ZN7ee734613fooEv,
  (VTBL_ENTRY)&_ZN7ee734613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee734613fooEv,_ZTv0_n16_N7ee734613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee734613fooEv,_ZTv0_n12_N7ee734613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee734613barEv,_ZTv0_n16_N7ee734613barEv),
};
extern VTBL_ENTRY _ZTV7ee73461[];
extern void _ZN6dd34613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3461__7ee73461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&_ZN6dd34613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv)();
extern void ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv)() __attribute__((weak));
extern void _ZN5cc4613barEv();
static  VTBL_ENTRY _tg__ZTV5cc461__6dd3461__7ee73461[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv),
  (VTBL_ENTRY)&_ZN5cc4613barEv,
};
static  VTT_ENTRY vtt_ee73461[] = {
  {&(_ZTV7ee73461[4]),  4,17},
  {&(_ZTV7ee73461[10]),  10,17},
  {&(_ZTV7ee73461[15]),  15,17},
  {&(_tg__ZTV6dd3461__7ee73461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd3461__7ee73461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73461[];
extern  VTBL_ENTRY _ZTV7ee73461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73461[];
static VTBL_ENTRY alt_thunk_names715[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34613fooEv,_ZTv0_n12_N6dd34613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34613fooEv,_ZThn8_N6dd34613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee734613barEv,_ZTv0_n16_N7ee734613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee734613barEv,_ZThn16_N7ee734613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee734613fooEv,_ZTv0_n12_N7ee734613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee734613fooEv,_ZThn16_N7ee734613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee734613fooEv,_ZTv0_n16_N7ee734613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee734613fooEv,_ZThn8_N7ee734613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73461 = {  "ee73461", // class name
  bases_ee73461, 4,
  &(vtc_ee73461[0]), // expected_vtbl_contents
  &(vtt_ee73461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73461),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names715,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4461  : cc461 {
  int d;
  virtual void  bar(); // _ZN6dd44613barEv
  ~dd4461(); // tgen
  dd4461(); // tgen
};
//SIG(-1 dd4461) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd4461 ::bar(){vfunc_called(this, "_ZN6dd44613barEv");}
dd4461 ::~dd4461(){ note_dtor("dd4461", this);} // tgen
dd4461 ::dd4461(){ note_ctor("dd4461", this);} // tgen

static void Test_dd4461()
{
  extern Class_Descriptor cd_dd4461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4461, buf);
    dd4461 *dp, &lv = *(dp=new (buf) dd4461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), 0, "dd4461");
    check_base_class_offset(lv, (bb61*)(cc461*), 0, "dd4461");
    check_base_class_offset(lv, (cc461*), 0, "dd4461");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4461.d");
    test_class_info(&lv, &cd_dd4461);
    dp->~dd4461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4461(Test_dd4461, "dd4461", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4461C1Ev();
extern void _ZN6dd4461D1Ev();
Name_Map name_map_dd4461[] = {
  NSPAIR(_ZN6dd4461C1Ev),
  NSPAIR(_ZN6dd4461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd4461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4461[];
extern void _ZN4bb613fooEv();
extern void _ZN6dd44613barEv();
static  VTBL_ENTRY vtc_dd4461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN6dd44613barEv,
};
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
Class_Descriptor cd_dd4461 = {  "dd4461", // class name
  bases_dd4461, 3,
  &(vtc_dd4461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4461),4, //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  ee04461  : dd4461 {
  int e;
  ~ee04461(); // tgen
  ee04461(); // tgen
};
//SIG(1 ee04461) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee04461 ::~ee04461(){ note_dtor("ee04461", this);} // tgen
ee04461 ::ee04461(){ note_ctor("ee04461", this);} // tgen

static void Test_ee04461()
{
  extern Class_Descriptor cd_ee04461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04461, buf);
    ee04461 *dp, &lv = *(dp=new (buf) ee04461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), 0, "ee04461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), 0, "ee04461");
    check_base_class_offset(lv, (cc461*)(dd4461*), 0, "ee04461");
    check_base_class_offset(lv, (dd4461*), 0, "ee04461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04461.e");
    test_class_info(&lv, &cd_ee04461);
    dp->~ee04461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04461(Test_ee04461, "ee04461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04461C1Ev();
extern void _ZN7ee04461D1Ev();
Name_Map name_map_ee04461[] = {
  NSPAIR(_ZN7ee04461C1Ev),
  NSPAIR(_ZN7ee04461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee04461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04461[];
extern void _ZN4bb613fooEv();
extern void _ZN6dd44613barEv();
static  VTBL_ENTRY vtc_ee04461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN6dd44613barEv,
};
extern VTBL_ENTRY _ZTI7ee04461[];
extern  VTBL_ENTRY _ZTV7ee04461[];
Class_Descriptor cd_ee04461 = {  "ee04461", // class name
  bases_ee04461, 4,
  &(vtc_ee04461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04461),4, //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  ee14461  : virtual dd4461 {
  int e;
  ~ee14461(); // tgen
  ee14461(); // tgen
};
//SIG(1 ee14461) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee14461 ::~ee14461(){ note_dtor("ee14461", this);} // tgen
ee14461 ::ee14461(){ note_ctor("ee14461", this);} // tgen

static void Test_ee14461()
{
  extern Class_Descriptor cd_ee14461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14461, buf);
    ee14461 *dp, &lv = *(dp=new (buf) ee14461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee14461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee14461");
    check_base_class_offset(lv, (cc461*)(dd4461*), ABISELECT(16,8), "ee14461");
    check_base_class_offset(lv, (dd4461*), ABISELECT(16,8), "ee14461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14461.e");
    test_class_info(&lv, &cd_ee14461);
    dp->~ee14461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14461(Test_ee14461, "ee14461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14461C1Ev();
extern void _ZN7ee14461D1Ev();
Name_Map name_map_ee14461[] = {
  NSPAIR(_ZN7ee14461C1Ev),
  NSPAIR(_ZN7ee14461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee14461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14461[];
extern void _ZN4bb613fooEv();
extern void _ZN6dd44613barEv();
static  VTBL_ENTRY vtc_ee14461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14461[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN6dd44613barEv,
};
extern VTBL_ENTRY _ZTV7ee14461[];
static  VTT_ENTRY vtt_ee14461[] = {
  {&(_ZTV7ee14461[3]),  3,9},
  {&(_ZTV7ee14461[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14461[];
extern  VTBL_ENTRY _ZTV7ee14461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14461[];
Class_Descriptor cd_ee14461 = {  "ee14461", // class name
  bases_ee14461, 4,
  &(vtc_ee14461[0]), // expected_vtbl_contents
  &(vtt_ee14461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14461),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14461),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  ee24461  : dd4461 {
  int e;
  virtual void  foo(); // _ZN7ee244613fooEv
  ~ee24461(); // tgen
  ee24461(); // tgen
};
//SIG(1 ee24461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee24461 ::foo(){vfunc_called(this, "_ZN7ee244613fooEv");}
ee24461 ::~ee24461(){ note_dtor("ee24461", this);} // tgen
ee24461 ::ee24461(){ note_ctor("ee24461", this);} // tgen

static void Test_ee24461()
{
  extern Class_Descriptor cd_ee24461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24461, buf);
    ee24461 *dp, &lv = *(dp=new (buf) ee24461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), 0, "ee24461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), 0, "ee24461");
    check_base_class_offset(lv, (cc461*)(dd4461*), 0, "ee24461");
    check_base_class_offset(lv, (dd4461*), 0, "ee24461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24461.e");
    test_class_info(&lv, &cd_ee24461);
    dp->~ee24461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24461(Test_ee24461, "ee24461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24461C1Ev();
extern void _ZN7ee24461D1Ev();
Name_Map name_map_ee24461[] = {
  NSPAIR(_ZN7ee24461C1Ev),
  NSPAIR(_ZN7ee24461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee24461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24461[];
extern void _ZN7ee244613fooEv();
extern void _ZN6dd44613barEv();
static  VTBL_ENTRY vtc_ee24461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24461[0]),
  (VTBL_ENTRY)&_ZN7ee244613fooEv,
  (VTBL_ENTRY)&_ZN6dd44613barEv,
};
extern VTBL_ENTRY _ZTI7ee24461[];
extern  VTBL_ENTRY _ZTV7ee24461[];
Class_Descriptor cd_ee24461 = {  "ee24461", // class name
  bases_ee24461, 4,
  &(vtc_ee24461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24461),4, //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  ee34461  : virtual dd4461 {
  int e;
  virtual void  foo(); // _ZN7ee344613fooEv
  ~ee34461(); // tgen
  ee34461(); // tgen
};
//SIG(1 ee34461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee34461 ::foo(){vfunc_called(this, "_ZN7ee344613fooEv");}
ee34461 ::~ee34461(){ note_dtor("ee34461", this);} // tgen
ee34461 ::ee34461(){ note_ctor("ee34461", this);} // tgen

static void Test_ee34461()
{
  extern Class_Descriptor cd_ee34461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34461, buf);
    ee34461 *dp, &lv = *(dp=new (buf) ee34461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee34461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee34461");
    check_base_class_offset(lv, (cc461*)(dd4461*), ABISELECT(16,8), "ee34461");
    check_base_class_offset(lv, (dd4461*), ABISELECT(16,8), "ee34461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34461.e");
    test_class_info(&lv, &cd_ee34461);
    dp->~ee34461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34461(Test_ee34461, "ee34461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34461C1Ev();
extern void _ZN7ee34461D1Ev();
Name_Map name_map_ee34461[] = {
  NSPAIR(_ZN7ee34461C1Ev),
  NSPAIR(_ZN7ee34461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee34461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34461[];
extern void _ZN7ee344613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee344613fooEv,_ZTv0_n12_N7ee344613fooEv)();
extern void ABISELECT(_ZThn16_N7ee344613fooEv,_ZThn8_N7ee344613fooEv)() __attribute__((weak));
extern void _ZN6dd44613barEv();
static  VTBL_ENTRY vtc_ee34461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34461[0]),
  (VTBL_ENTRY)&_ZN7ee344613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee344613fooEv,_ZTv0_n12_N7ee344613fooEv),
  (VTBL_ENTRY)&_ZN6dd44613barEv,
};
extern VTBL_ENTRY _ZTV7ee34461[];
static  VTT_ENTRY vtt_ee34461[] = {
  {&(_ZTV7ee34461[3]),  3,10},
  {&(_ZTV7ee34461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34461[];
extern  VTBL_ENTRY _ZTV7ee34461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34461[];
static VTBL_ENTRY alt_thunk_names716[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee344613fooEv,_ZTv0_n12_N7ee344613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee344613fooEv,_ZThn8_N7ee344613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34461 = {  "ee34461", // class name
  bases_ee34461, 4,
  &(vtc_ee34461[0]), // expected_vtbl_contents
  &(vtt_ee34461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names716,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44461  : dd4461 {
  int e;
  virtual void  bar(); // _ZN7ee444613barEv
  ~ee44461(); // tgen
  ee44461(); // tgen
};
//SIG(1 ee44461) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee44461 ::bar(){vfunc_called(this, "_ZN7ee444613barEv");}
ee44461 ::~ee44461(){ note_dtor("ee44461", this);} // tgen
ee44461 ::ee44461(){ note_ctor("ee44461", this);} // tgen

static void Test_ee44461()
{
  extern Class_Descriptor cd_ee44461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44461, buf);
    ee44461 *dp, &lv = *(dp=new (buf) ee44461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), 0, "ee44461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), 0, "ee44461");
    check_base_class_offset(lv, (cc461*)(dd4461*), 0, "ee44461");
    check_base_class_offset(lv, (dd4461*), 0, "ee44461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44461.e");
    test_class_info(&lv, &cd_ee44461);
    dp->~ee44461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44461(Test_ee44461, "ee44461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44461C1Ev();
extern void _ZN7ee44461D1Ev();
Name_Map name_map_ee44461[] = {
  NSPAIR(_ZN7ee44461C1Ev),
  NSPAIR(_ZN7ee44461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee44461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44461[];
extern void _ZN4bb613fooEv();
extern void _ZN7ee444613barEv();
static  VTBL_ENTRY vtc_ee44461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&_ZN7ee444613barEv,
};
extern VTBL_ENTRY _ZTI7ee44461[];
extern  VTBL_ENTRY _ZTV7ee44461[];
Class_Descriptor cd_ee44461 = {  "ee44461", // class name
  bases_ee44461, 4,
  &(vtc_ee44461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44461),4, //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  ee54461  : virtual dd4461 {
  int e;
  virtual void  bar(); // _ZN7ee544613barEv
  ~ee54461(); // tgen
  ee54461(); // tgen
};
//SIG(1 ee54461) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee54461 ::bar(){vfunc_called(this, "_ZN7ee544613barEv");}
ee54461 ::~ee54461(){ note_dtor("ee54461", this);} // tgen
ee54461 ::ee54461(){ note_ctor("ee54461", this);} // tgen

static void Test_ee54461()
{
  extern Class_Descriptor cd_ee54461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54461, buf);
    ee54461 *dp, &lv = *(dp=new (buf) ee54461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee54461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee54461");
    check_base_class_offset(lv, (cc461*)(dd4461*), ABISELECT(16,8), "ee54461");
    check_base_class_offset(lv, (dd4461*), ABISELECT(16,8), "ee54461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54461.e");
    test_class_info(&lv, &cd_ee54461);
    dp->~ee54461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54461(Test_ee54461, "ee54461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54461C1Ev();
extern void _ZN7ee54461D1Ev();
Name_Map name_map_ee54461[] = {
  NSPAIR(_ZN7ee54461C1Ev),
  NSPAIR(_ZN7ee54461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee54461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54461[];
extern void _ZN7ee544613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee544613barEv,_ZTv0_n16_N7ee544613barEv)();
extern void ABISELECT(_ZThn16_N7ee544613barEv,_ZThn8_N7ee544613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54461[0]),
  (VTBL_ENTRY)&_ZN7ee544613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee544613barEv,_ZTv0_n16_N7ee544613barEv),
};
extern VTBL_ENTRY _ZTV7ee54461[];
static  VTT_ENTRY vtt_ee54461[] = {
  {&(_ZTV7ee54461[3]),  3,10},
  {&(_ZTV7ee54461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54461[];
extern  VTBL_ENTRY _ZTV7ee54461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54461[];
static VTBL_ENTRY alt_thunk_names717[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee544613barEv,_ZTv0_n16_N7ee544613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee544613barEv,_ZThn8_N7ee544613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54461 = {  "ee54461", // class name
  bases_ee54461, 4,
  &(vtc_ee54461[0]), // expected_vtbl_contents
  &(vtt_ee54461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names717,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64461  : dd4461 {
  int e;
  virtual void  foo(); // _ZN7ee644613fooEv
  virtual void  bar(); // _ZN7ee644613barEv
  ~ee64461(); // tgen
  ee64461(); // tgen
};
//SIG(1 ee64461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64461 ::foo(){vfunc_called(this, "_ZN7ee644613fooEv");}
void  ee64461 ::bar(){vfunc_called(this, "_ZN7ee644613barEv");}
ee64461 ::~ee64461(){ note_dtor("ee64461", this);} // tgen
ee64461 ::ee64461(){ note_ctor("ee64461", this);} // tgen

static void Test_ee64461()
{
  extern Class_Descriptor cd_ee64461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64461, buf);
    ee64461 *dp, &lv = *(dp=new (buf) ee64461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), 0, "ee64461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), 0, "ee64461");
    check_base_class_offset(lv, (cc461*)(dd4461*), 0, "ee64461");
    check_base_class_offset(lv, (dd4461*), 0, "ee64461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64461.e");
    test_class_info(&lv, &cd_ee64461);
    dp->~ee64461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64461(Test_ee64461, "ee64461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64461C1Ev();
extern void _ZN7ee64461D1Ev();
Name_Map name_map_ee64461[] = {
  NSPAIR(_ZN7ee64461C1Ev),
  NSPAIR(_ZN7ee64461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee64461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64461[];
extern void _ZN7ee644613fooEv();
extern void _ZN7ee644613barEv();
static  VTBL_ENTRY vtc_ee64461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64461[0]),
  (VTBL_ENTRY)&_ZN7ee644613fooEv,
  (VTBL_ENTRY)&_ZN7ee644613barEv,
};
extern VTBL_ENTRY _ZTI7ee64461[];
extern  VTBL_ENTRY _ZTV7ee64461[];
Class_Descriptor cd_ee64461 = {  "ee64461", // class name
  bases_ee64461, 4,
  &(vtc_ee64461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64461),4, //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  ee74461  : virtual dd4461 {
  int e;
  virtual void  foo(); // _ZN7ee744613fooEv
  virtual void  bar(); // _ZN7ee744613barEv
  ~ee74461(); // tgen
  ee74461(); // tgen
};
//SIG(1 ee74461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74461 ::foo(){vfunc_called(this, "_ZN7ee744613fooEv");}
void  ee74461 ::bar(){vfunc_called(this, "_ZN7ee744613barEv");}
ee74461 ::~ee74461(){ note_dtor("ee74461", this);} // tgen
ee74461 ::ee74461(){ note_ctor("ee74461", this);} // tgen

static void Test_ee74461()
{
  extern Class_Descriptor cd_ee74461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74461, buf);
    ee74461 *dp, &lv = *(dp=new (buf) ee74461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee74461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd4461*), ABISELECT(16,8), "ee74461");
    check_base_class_offset(lv, (cc461*)(dd4461*), ABISELECT(16,8), "ee74461");
    check_base_class_offset(lv, (dd4461*), ABISELECT(16,8), "ee74461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74461.e");
    test_class_info(&lv, &cd_ee74461);
    dp->~ee74461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74461(Test_ee74461, "ee74461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74461C1Ev();
extern void _ZN7ee74461D1Ev();
Name_Map name_map_ee74461[] = {
  NSPAIR(_ZN7ee74461C1Ev),
  NSPAIR(_ZN7ee74461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd4461;
extern VTBL_ENTRY _ZTI6dd4461[];
extern  VTBL_ENTRY _ZTV6dd4461[];
static Base_Class bases_ee74461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4461,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74461[];
extern void _ZN7ee744613fooEv();
extern void _ZN7ee744613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee744613fooEv,_ZTv0_n12_N7ee744613fooEv)();
extern void ABISELECT(_ZThn16_N7ee744613fooEv,_ZThn8_N7ee744613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee744613barEv,_ZTv0_n16_N7ee744613barEv)();
extern void ABISELECT(_ZThn16_N7ee744613barEv,_ZThn8_N7ee744613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74461[0]),
  (VTBL_ENTRY)&_ZN7ee744613fooEv,
  (VTBL_ENTRY)&_ZN7ee744613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee744613fooEv,_ZTv0_n12_N7ee744613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee744613barEv,_ZTv0_n16_N7ee744613barEv),
};
extern VTBL_ENTRY _ZTV7ee74461[];
static  VTT_ENTRY vtt_ee74461[] = {
  {&(_ZTV7ee74461[3]),  3,11},
  {&(_ZTV7ee74461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74461[];
extern  VTBL_ENTRY _ZTV7ee74461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74461[];
static VTBL_ENTRY alt_thunk_names718[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee744613barEv,_ZTv0_n16_N7ee744613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee744613barEv,_ZThn8_N7ee744613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee744613fooEv,_ZTv0_n12_N7ee744613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee744613fooEv,_ZThn8_N7ee744613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74461 = {  "ee74461", // class name
  bases_ee74461, 4,
  &(vtc_ee74461[0]), // expected_vtbl_contents
  &(vtt_ee74461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names718,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5461  : virtual cc461 {
  int d;
  virtual void  bar(); // _ZN6dd54613barEv
  ~dd5461(); // tgen
  dd5461(); // tgen
};
//SIG(-1 dd5461) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd5461 ::bar(){vfunc_called(this, "_ZN6dd54613barEv");}
dd5461 ::~dd5461(){ note_dtor("dd5461", this);} // tgen
dd5461 ::dd5461(){ note_ctor("dd5461", this);} // tgen

static void Test_dd5461()
{
  extern Class_Descriptor cd_dd5461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5461, buf);
    dd5461 *dp, &lv = *(dp=new (buf) dd5461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,8), "dd5461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,8), "dd5461");
    check_base_class_offset(lv, (cc461*), ABISELECT(16,8), "dd5461");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5461.d");
    test_class_info(&lv, &cd_dd5461);
    dp->~dd5461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5461(Test_dd5461, "dd5461", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5461C1Ev();
extern void _ZN6dd5461D1Ev();
Name_Map name_map_dd5461[] = {
  NSPAIR(_ZN6dd5461C1Ev),
  NSPAIR(_ZN6dd5461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd5461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5461[];
extern void _ZN6dd54613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
extern VTBL_ENTRY _ZTV6dd5461[];
static  VTT_ENTRY vtt_dd5461[] = {
  {&(_ZTV6dd5461[3]),  3,10},
  {&(_ZTV6dd5461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static VTBL_ENTRY alt_thunk_names719[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5461 = {  "dd5461", // class name
  bases_dd5461, 3,
  &(vtc_dd5461[0]), // expected_vtbl_contents
  &(vtt_dd5461[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5461),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names719,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05461  : dd5461 {
  int e;
  ~ee05461(); // tgen
  ee05461(); // tgen
};
//SIG(1 ee05461) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee05461 ::~ee05461(){ note_dtor("ee05461", this);} // tgen
ee05461 ::ee05461(){ note_ctor("ee05461", this);} // tgen

static void Test_ee05461()
{
  extern Class_Descriptor cd_ee05461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05461, buf);
    ee05461 *dp, &lv = *(dp=new (buf) ee05461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee05461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee05461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(16,12), "ee05461");
    check_base_class_offset(lv, (dd5461*), 0, "ee05461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05461.e");
    test_class_info(&lv, &cd_ee05461);
    dp->~ee05461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05461(Test_ee05461, "ee05461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05461C1Ev();
extern void _ZN7ee05461D1Ev();
Name_Map name_map_ee05461[] = {
  NSPAIR(_ZN7ee05461C1Ev),
  NSPAIR(_ZN7ee05461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee05461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05461[];
extern void _ZN6dd54613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
extern VTBL_ENTRY _ZTV7ee05461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee05461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee05461[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee05461[] = {
  {&(_ZTV7ee05461[3]),  3,10},
  {&(_tg__ZTV6dd5461__7ee05461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee05461[4]),  4,6},
  {&(_ZTV7ee05461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05461[];
extern  VTBL_ENTRY _ZTV7ee05461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05461[];
static VTBL_ENTRY alt_thunk_names720[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05461 = {  "ee05461", // class name
  bases_ee05461, 4,
  &(vtc_ee05461[0]), // expected_vtbl_contents
  &(vtt_ee05461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05461),4, //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  ee15461  : virtual dd5461 {
  int e;
  ~ee15461(); // tgen
  ee15461(); // tgen
};
//SIG(1 ee15461) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee15461 ::~ee15461(){ note_dtor("ee15461", this);} // tgen
ee15461 ::ee15461(){ note_ctor("ee15461", this);} // tgen

static void Test_ee15461()
{
  extern Class_Descriptor cd_ee15461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15461, buf);
    ee15461 *dp, &lv = *(dp=new (buf) ee15461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee15461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee15461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(32,16), "ee15461");
    check_base_class_offset(lv, (dd5461*), ABISELECT(16,8), "ee15461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15461.e");
    test_class_info(&lv, &cd_ee15461);
    dp->~ee15461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15461(Test_ee15461, "ee15461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15461C1Ev();
extern void _ZN7ee15461D1Ev();
Name_Map name_map_ee15461[] = {
  NSPAIR(_ZN7ee15461C1Ev),
  NSPAIR(_ZN7ee15461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee15461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15461[];
extern void _ZN6dd54613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15461[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
extern VTBL_ENTRY _ZTV7ee15461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee15461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee15461[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee15461[] = {
  {&(_ZTV7ee15461[4]),  4,15},
  {&(_ZTV7ee15461[8]),  8,15},
  {&(_ZTV7ee15461[13]),  13,15},
  {&(_tg__ZTV6dd5461__7ee15461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee15461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15461[];
extern  VTBL_ENTRY _ZTV7ee15461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15461[];
static VTBL_ENTRY alt_thunk_names721[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15461 = {  "ee15461", // class name
  bases_ee15461, 4,
  &(vtc_ee15461[0]), // expected_vtbl_contents
  &(vtt_ee15461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15461),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15461),5, //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  ee25461  : dd5461 {
  int e;
  virtual void  foo(); // _ZN7ee254613fooEv
  ~ee25461(); // tgen
  ee25461(); // tgen
};
//SIG(1 ee25461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee25461 ::foo(){vfunc_called(this, "_ZN7ee254613fooEv");}
ee25461 ::~ee25461(){ note_dtor("ee25461", this);} // tgen
ee25461 ::ee25461(){ note_ctor("ee25461", this);} // tgen

static void Test_ee25461()
{
  extern Class_Descriptor cd_ee25461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25461, buf);
    ee25461 *dp, &lv = *(dp=new (buf) ee25461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee25461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee25461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(16,12), "ee25461");
    check_base_class_offset(lv, (dd5461*), 0, "ee25461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25461.e");
    test_class_info(&lv, &cd_ee25461);
    dp->~ee25461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25461(Test_ee25461, "ee25461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25461C1Ev();
extern void _ZN7ee25461D1Ev();
Name_Map name_map_ee25461[] = {
  NSPAIR(_ZN7ee25461C1Ev),
  NSPAIR(_ZN7ee25461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee25461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25461[];
extern void _ZN6dd54613barEv();
extern void _ZN7ee254613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee254613fooEv,_ZTv0_n12_N7ee254613fooEv)();
extern void ABISELECT(_ZThn16_N7ee254613fooEv,_ZThn12_N7ee254613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
  (VTBL_ENTRY)&_ZN7ee254613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee254613fooEv,_ZTv0_n12_N7ee254613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
extern VTBL_ENTRY _ZTV7ee25461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee25461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee25461[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee25461[] = {
  {&(_ZTV7ee25461[3]),  3,11},
  {&(_tg__ZTV6dd5461__7ee25461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee25461[4]),  4,6},
  {&(_ZTV7ee25461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25461[];
extern  VTBL_ENTRY _ZTV7ee25461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25461[];
static VTBL_ENTRY alt_thunk_names722[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee254613fooEv,_ZTv0_n12_N7ee254613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee254613fooEv,_ZThn12_N7ee254613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25461 = {  "ee25461", // class name
  bases_ee25461, 4,
  &(vtc_ee25461[0]), // expected_vtbl_contents
  &(vtt_ee25461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25461),4, //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  ee35461  : virtual dd5461 {
  int e;
  virtual void  foo(); // _ZN7ee354613fooEv
  ~ee35461(); // tgen
  ee35461(); // tgen
};
//SIG(1 ee35461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee35461 ::foo(){vfunc_called(this, "_ZN7ee354613fooEv");}
ee35461 ::~ee35461(){ note_dtor("ee35461", this);} // tgen
ee35461 ::ee35461(){ note_ctor("ee35461", this);} // tgen

static void Test_ee35461()
{
  extern Class_Descriptor cd_ee35461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35461, buf);
    ee35461 *dp, &lv = *(dp=new (buf) ee35461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee35461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee35461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(32,16), "ee35461");
    check_base_class_offset(lv, (dd5461*), ABISELECT(16,8), "ee35461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35461.e");
    test_class_info(&lv, &cd_ee35461);
    dp->~ee35461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35461(Test_ee35461, "ee35461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35461C1Ev();
extern void _ZN7ee35461D1Ev();
Name_Map name_map_ee35461[] = {
  NSPAIR(_ZN7ee35461C1Ev),
  NSPAIR(_ZN7ee35461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee35461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35461[];
extern void _ZN7ee354613fooEv();
extern void _ZN6dd54613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee354613fooEv,_ZTv0_n12_N7ee354613fooEv)();
extern void ABISELECT(_ZThn32_N7ee354613fooEv,_ZThn16_N7ee354613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35461[0]),
  (VTBL_ENTRY)&_ZN7ee354613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee354613fooEv,_ZTv0_n12_N7ee354613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
extern VTBL_ENTRY _ZTV7ee35461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee35461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee35461[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee35461[] = {
  {&(_ZTV7ee35461[4]),  4,16},
  {&(_ZTV7ee35461[9]),  9,16},
  {&(_ZTV7ee35461[14]),  14,16},
  {&(_tg__ZTV6dd5461__7ee35461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee35461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35461[];
extern  VTBL_ENTRY _ZTV7ee35461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35461[];
static VTBL_ENTRY alt_thunk_names723[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee354613fooEv,_ZTv0_n12_N7ee354613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee354613fooEv,_ZThn16_N7ee354613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35461 = {  "ee35461", // class name
  bases_ee35461, 4,
  &(vtc_ee35461[0]), // expected_vtbl_contents
  &(vtt_ee35461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35461),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35461),5, //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  ee45461  : dd5461 {
  int e;
  virtual void  bar(); // _ZN7ee454613barEv
  ~ee45461(); // tgen
  ee45461(); // tgen
};
//SIG(1 ee45461) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee45461 ::bar(){vfunc_called(this, "_ZN7ee454613barEv");}
ee45461 ::~ee45461(){ note_dtor("ee45461", this);} // tgen
ee45461 ::ee45461(){ note_ctor("ee45461", this);} // tgen

static void Test_ee45461()
{
  extern Class_Descriptor cd_ee45461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45461, buf);
    ee45461 *dp, &lv = *(dp=new (buf) ee45461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee45461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee45461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(16,12), "ee45461");
    check_base_class_offset(lv, (dd5461*), 0, "ee45461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45461.e");
    test_class_info(&lv, &cd_ee45461);
    dp->~ee45461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45461(Test_ee45461, "ee45461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45461C1Ev();
extern void _ZN7ee45461D1Ev();
Name_Map name_map_ee45461[] = {
  NSPAIR(_ZN7ee45461C1Ev),
  NSPAIR(_ZN7ee45461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee45461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45461[];
extern void _ZN7ee454613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee454613barEv,_ZTv0_n16_N7ee454613barEv)();
extern void ABISELECT(_ZThn16_N7ee454613barEv,_ZThn12_N7ee454613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45461[0]),
  (VTBL_ENTRY)&_ZN7ee454613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee454613barEv,_ZTv0_n16_N7ee454613barEv),
};
extern VTBL_ENTRY _ZTV7ee45461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee45461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee45461[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee45461[] = {
  {&(_ZTV7ee45461[3]),  3,10},
  {&(_tg__ZTV6dd5461__7ee45461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee45461[4]),  4,6},
  {&(_ZTV7ee45461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45461[];
extern  VTBL_ENTRY _ZTV7ee45461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45461[];
static VTBL_ENTRY alt_thunk_names724[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee454613barEv,_ZTv0_n16_N7ee454613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee454613barEv,_ZThn12_N7ee454613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45461 = {  "ee45461", // class name
  bases_ee45461, 4,
  &(vtc_ee45461[0]), // expected_vtbl_contents
  &(vtt_ee45461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names724,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55461  : virtual dd5461 {
  int e;
  virtual void  bar(); // _ZN7ee554613barEv
  ~ee55461(); // tgen
  ee55461(); // tgen
};
//SIG(1 ee55461) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee55461 ::bar(){vfunc_called(this, "_ZN7ee554613barEv");}
ee55461 ::~ee55461(){ note_dtor("ee55461", this);} // tgen
ee55461 ::ee55461(){ note_ctor("ee55461", this);} // tgen

static void Test_ee55461()
{
  extern Class_Descriptor cd_ee55461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55461, buf);
    ee55461 *dp, &lv = *(dp=new (buf) ee55461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee55461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee55461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(32,16), "ee55461");
    check_base_class_offset(lv, (dd5461*), ABISELECT(16,8), "ee55461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55461.e");
    test_class_info(&lv, &cd_ee55461);
    dp->~ee55461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55461(Test_ee55461, "ee55461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55461C1Ev();
extern void _ZN7ee55461D1Ev();
Name_Map name_map_ee55461[] = {
  NSPAIR(_ZN7ee55461C1Ev),
  NSPAIR(_ZN7ee55461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee55461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55461[];
extern void _ZN7ee554613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee554613barEv,_ZTv0_n16_N7ee554613barEv)();
extern void ABISELECT(_ZThn16_N7ee554613barEv,_ZThn8_N7ee554613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee554613barEv,_ZTv0_n16_N7ee554613barEv)();
extern void ABISELECT(_ZThn32_N7ee554613barEv,_ZThn16_N7ee554613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55461[0]),
  (VTBL_ENTRY)&_ZN7ee554613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee554613barEv,_ZTv0_n16_N7ee554613barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee554613barEv,_ZTv0_n16_N7ee554613barEv),
};
extern VTBL_ENTRY _ZTV7ee55461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee55461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee55461[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee55461[] = {
  {&(_ZTV7ee55461[4]),  4,16},
  {&(_ZTV7ee55461[9]),  9,16},
  {&(_ZTV7ee55461[14]),  14,16},
  {&(_tg__ZTV6dd5461__7ee55461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee55461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55461[];
extern  VTBL_ENTRY _ZTV7ee55461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55461[];
static VTBL_ENTRY alt_thunk_names725[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee554613barEv,_ZTv0_n16_N7ee554613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee554613barEv,_ZThn16_N7ee554613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee554613barEv,_ZThn8_N7ee554613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55461 = {  "ee55461", // class name
  bases_ee55461, 4,
  &(vtc_ee55461[0]), // expected_vtbl_contents
  &(vtt_ee55461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55461),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names725,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65461  : dd5461 {
  int e;
  virtual void  foo(); // _ZN7ee654613fooEv
  virtual void  bar(); // _ZN7ee654613barEv
  ~ee65461(); // tgen
  ee65461(); // tgen
};
//SIG(1 ee65461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65461 ::foo(){vfunc_called(this, "_ZN7ee654613fooEv");}
void  ee65461 ::bar(){vfunc_called(this, "_ZN7ee654613barEv");}
ee65461 ::~ee65461(){ note_dtor("ee65461", this);} // tgen
ee65461 ::ee65461(){ note_ctor("ee65461", this);} // tgen

static void Test_ee65461()
{
  extern Class_Descriptor cd_ee65461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65461, buf);
    ee65461 *dp, &lv = *(dp=new (buf) ee65461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee65461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee65461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(16,12), "ee65461");
    check_base_class_offset(lv, (dd5461*), 0, "ee65461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65461.e");
    test_class_info(&lv, &cd_ee65461);
    dp->~ee65461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65461(Test_ee65461, "ee65461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65461C1Ev();
extern void _ZN7ee65461D1Ev();
Name_Map name_map_ee65461[] = {
  NSPAIR(_ZN7ee65461C1Ev),
  NSPAIR(_ZN7ee65461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee65461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65461[];
extern void _ZN7ee654613barEv();
extern void _ZN7ee654613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee654613fooEv,_ZTv0_n12_N7ee654613fooEv)();
extern void ABISELECT(_ZThn16_N7ee654613fooEv,_ZThn12_N7ee654613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee654613barEv,_ZTv0_n16_N7ee654613barEv)();
extern void ABISELECT(_ZThn16_N7ee654613barEv,_ZThn12_N7ee654613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65461[0]),
  (VTBL_ENTRY)&_ZN7ee654613barEv,
  (VTBL_ENTRY)&_ZN7ee654613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee654613fooEv,_ZTv0_n12_N7ee654613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee654613barEv,_ZTv0_n16_N7ee654613barEv),
};
extern VTBL_ENTRY _ZTV7ee65461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee65461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee65461[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee65461[] = {
  {&(_ZTV7ee65461[3]),  3,11},
  {&(_tg__ZTV6dd5461__7ee65461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee65461[4]),  4,6},
  {&(_ZTV7ee65461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65461[];
extern  VTBL_ENTRY _ZTV7ee65461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65461[];
static VTBL_ENTRY alt_thunk_names726[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn12_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee654613barEv,_ZTv0_n16_N7ee654613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee654613barEv,_ZThn12_N7ee654613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee654613fooEv,_ZTv0_n12_N7ee654613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee654613fooEv,_ZThn12_N7ee654613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65461 = {  "ee65461", // class name
  bases_ee65461, 4,
  &(vtc_ee65461[0]), // expected_vtbl_contents
  &(vtt_ee65461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names726,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75461  : virtual dd5461 {
  int e;
  virtual void  foo(); // _ZN7ee754613fooEv
  virtual void  bar(); // _ZN7ee754613barEv
  ~ee75461(); // tgen
  ee75461(); // tgen
};
//SIG(1 ee75461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75461 ::foo(){vfunc_called(this, "_ZN7ee754613fooEv");}
void  ee75461 ::bar(){vfunc_called(this, "_ZN7ee754613barEv");}
ee75461 ::~ee75461(){ note_dtor("ee75461", this);} // tgen
ee75461 ::ee75461(){ note_ctor("ee75461", this);} // tgen

static void Test_ee75461()
{
  extern Class_Descriptor cd_ee75461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75461, buf);
    ee75461 *dp, &lv = *(dp=new (buf) ee75461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee75461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee75461");
    check_base_class_offset(lv, (cc461*)(dd5461*), ABISELECT(32,16), "ee75461");
    check_base_class_offset(lv, (dd5461*), ABISELECT(16,8), "ee75461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75461.e");
    test_class_info(&lv, &cd_ee75461);
    dp->~ee75461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75461(Test_ee75461, "ee75461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75461C1Ev();
extern void _ZN7ee75461D1Ev();
Name_Map name_map_ee75461[] = {
  NSPAIR(_ZN7ee75461C1Ev),
  NSPAIR(_ZN7ee75461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd5461;
extern VTBL_ENTRY _ZTI6dd5461[];
extern  VTBL_ENTRY _ZTV6dd5461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5461[];
static Base_Class bases_ee75461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5461,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75461[];
extern void _ZN7ee754613fooEv();
extern void _ZN7ee754613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee754613barEv,_ZTv0_n16_N7ee754613barEv)();
extern void ABISELECT(_ZThn16_N7ee754613barEv,_ZThn8_N7ee754613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee754613fooEv,_ZTv0_n12_N7ee754613fooEv)();
extern void ABISELECT(_ZThn32_N7ee754613fooEv,_ZThn16_N7ee754613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee754613barEv,_ZTv0_n16_N7ee754613barEv)();
extern void ABISELECT(_ZThn32_N7ee754613barEv,_ZThn16_N7ee754613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75461[0]),
  (VTBL_ENTRY)&_ZN7ee754613fooEv,
  (VTBL_ENTRY)&_ZN7ee754613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee754613barEv,_ZTv0_n16_N7ee754613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee754613fooEv,_ZTv0_n12_N7ee754613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee754613barEv,_ZTv0_n16_N7ee754613barEv),
};
extern VTBL_ENTRY _ZTV7ee75461[];
extern void _ZN6dd54613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5461__7ee75461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN6dd54613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv)();
extern void ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd5461__7ee75461[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5461[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv),
};
static  VTT_ENTRY vtt_ee75461[] = {
  {&(_ZTV7ee75461[4]),  4,17},
  {&(_ZTV7ee75461[10]),  10,17},
  {&(_ZTV7ee75461[15]),  15,17},
  {&(_tg__ZTV6dd5461__7ee75461[3]),  3,4},
  {&(_tg__ZTV5cc461__6dd5461__7ee75461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75461[];
extern  VTBL_ENTRY _ZTV7ee75461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75461[];
static VTBL_ENTRY alt_thunk_names727[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54613barEv,_ZTv0_n16_N6dd54613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54613barEv,_ZThn8_N6dd54613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee754613fooEv,_ZTv0_n12_N7ee754613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee754613fooEv,_ZThn16_N7ee754613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee754613barEv,_ZTv0_n16_N7ee754613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee754613barEv,_ZThn16_N7ee754613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee754613barEv,_ZThn8_N7ee754613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75461 = {  "ee75461", // class name
  bases_ee75461, 4,
  &(vtc_ee75461[0]), // expected_vtbl_contents
  &(vtt_ee75461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75461),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names727,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6461  : cc461 {
  int d;
  virtual void  bar(); // _ZN6dd64613barEv
  virtual void  foo(); // _ZN6dd64613fooEv
  ~dd6461(); // tgen
  dd6461(); // tgen
};
//SIG(-1 dd6461) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd6461 ::bar(){vfunc_called(this, "_ZN6dd64613barEv");}
void  dd6461 ::foo(){vfunc_called(this, "_ZN6dd64613fooEv");}
dd6461 ::~dd6461(){ note_dtor("dd6461", this);} // tgen
dd6461 ::dd6461(){ note_ctor("dd6461", this);} // tgen

static void Test_dd6461()
{
  extern Class_Descriptor cd_dd6461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6461, buf);
    dd6461 *dp, &lv = *(dp=new (buf) dd6461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), 0, "dd6461");
    check_base_class_offset(lv, (bb61*)(cc461*), 0, "dd6461");
    check_base_class_offset(lv, (cc461*), 0, "dd6461");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6461.d");
    test_class_info(&lv, &cd_dd6461);
    dp->~dd6461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6461(Test_dd6461, "dd6461", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6461C1Ev();
extern void _ZN6dd6461D1Ev();
Name_Map name_map_dd6461[] = {
  NSPAIR(_ZN6dd6461C1Ev),
  NSPAIR(_ZN6dd6461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd6461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6461[];
extern void _ZN6dd64613fooEv();
extern void _ZN6dd64613barEv();
static  VTBL_ENTRY vtc_dd6461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6461[0]),
  (VTBL_ENTRY)&_ZN6dd64613fooEv,
  (VTBL_ENTRY)&_ZN6dd64613barEv,
};
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
Class_Descriptor cd_dd6461 = {  "dd6461", // class name
  bases_dd6461, 3,
  &(vtc_dd6461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6461),4, //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  ee06461  : dd6461 {
  int e;
  ~ee06461(); // tgen
  ee06461(); // tgen
};
//SIG(1 ee06461) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee06461 ::~ee06461(){ note_dtor("ee06461", this);} // tgen
ee06461 ::ee06461(){ note_ctor("ee06461", this);} // tgen

static void Test_ee06461()
{
  extern Class_Descriptor cd_ee06461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06461, buf);
    ee06461 *dp, &lv = *(dp=new (buf) ee06461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), 0, "ee06461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), 0, "ee06461");
    check_base_class_offset(lv, (cc461*)(dd6461*), 0, "ee06461");
    check_base_class_offset(lv, (dd6461*), 0, "ee06461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06461.e");
    test_class_info(&lv, &cd_ee06461);
    dp->~ee06461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06461(Test_ee06461, "ee06461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06461C1Ev();
extern void _ZN7ee06461D1Ev();
Name_Map name_map_ee06461[] = {
  NSPAIR(_ZN7ee06461C1Ev),
  NSPAIR(_ZN7ee06461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee06461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06461[];
extern void _ZN6dd64613fooEv();
extern void _ZN6dd64613barEv();
static  VTBL_ENTRY vtc_ee06461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06461[0]),
  (VTBL_ENTRY)&_ZN6dd64613fooEv,
  (VTBL_ENTRY)&_ZN6dd64613barEv,
};
extern VTBL_ENTRY _ZTI7ee06461[];
extern  VTBL_ENTRY _ZTV7ee06461[];
Class_Descriptor cd_ee06461 = {  "ee06461", // class name
  bases_ee06461, 4,
  &(vtc_ee06461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06461),4, //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  ee16461  : virtual dd6461 {
  int e;
  ~ee16461(); // tgen
  ee16461(); // tgen
};
//SIG(1 ee16461) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee16461 ::~ee16461(){ note_dtor("ee16461", this);} // tgen
ee16461 ::ee16461(){ note_ctor("ee16461", this);} // tgen

static void Test_ee16461()
{
  extern Class_Descriptor cd_ee16461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16461, buf);
    ee16461 *dp, &lv = *(dp=new (buf) ee16461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee16461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee16461");
    check_base_class_offset(lv, (cc461*)(dd6461*), ABISELECT(16,8), "ee16461");
    check_base_class_offset(lv, (dd6461*), ABISELECT(16,8), "ee16461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16461.e");
    test_class_info(&lv, &cd_ee16461);
    dp->~ee16461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16461(Test_ee16461, "ee16461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16461C1Ev();
extern void _ZN7ee16461D1Ev();
Name_Map name_map_ee16461[] = {
  NSPAIR(_ZN7ee16461C1Ev),
  NSPAIR(_ZN7ee16461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee16461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16461[];
extern void _ZN6dd64613fooEv();
extern void _ZN6dd64613barEv();
static  VTBL_ENTRY vtc_ee16461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16461[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16461[0]),
  (VTBL_ENTRY)&_ZN6dd64613fooEv,
  (VTBL_ENTRY)&_ZN6dd64613barEv,
};
extern VTBL_ENTRY _ZTV7ee16461[];
static  VTT_ENTRY vtt_ee16461[] = {
  {&(_ZTV7ee16461[3]),  3,9},
  {&(_ZTV7ee16461[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16461[];
extern  VTBL_ENTRY _ZTV7ee16461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16461[];
Class_Descriptor cd_ee16461 = {  "ee16461", // class name
  bases_ee16461, 4,
  &(vtc_ee16461[0]), // expected_vtbl_contents
  &(vtt_ee16461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16461),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16461),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  ee26461  : dd6461 {
  int e;
  virtual void  foo(); // _ZN7ee264613fooEv
  ~ee26461(); // tgen
  ee26461(); // tgen
};
//SIG(1 ee26461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26461 ::foo(){vfunc_called(this, "_ZN7ee264613fooEv");}
ee26461 ::~ee26461(){ note_dtor("ee26461", this);} // tgen
ee26461 ::ee26461(){ note_ctor("ee26461", this);} // tgen

static void Test_ee26461()
{
  extern Class_Descriptor cd_ee26461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26461, buf);
    ee26461 *dp, &lv = *(dp=new (buf) ee26461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), 0, "ee26461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), 0, "ee26461");
    check_base_class_offset(lv, (cc461*)(dd6461*), 0, "ee26461");
    check_base_class_offset(lv, (dd6461*), 0, "ee26461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26461.e");
    test_class_info(&lv, &cd_ee26461);
    dp->~ee26461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26461(Test_ee26461, "ee26461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26461C1Ev();
extern void _ZN7ee26461D1Ev();
Name_Map name_map_ee26461[] = {
  NSPAIR(_ZN7ee26461C1Ev),
  NSPAIR(_ZN7ee26461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee26461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26461[];
extern void _ZN7ee264613fooEv();
extern void _ZN6dd64613barEv();
static  VTBL_ENTRY vtc_ee26461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26461[0]),
  (VTBL_ENTRY)&_ZN7ee264613fooEv,
  (VTBL_ENTRY)&_ZN6dd64613barEv,
};
extern VTBL_ENTRY _ZTI7ee26461[];
extern  VTBL_ENTRY _ZTV7ee26461[];
Class_Descriptor cd_ee26461 = {  "ee26461", // class name
  bases_ee26461, 4,
  &(vtc_ee26461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26461),4, //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  ee36461  : virtual dd6461 {
  int e;
  virtual void  foo(); // _ZN7ee364613fooEv
  ~ee36461(); // tgen
  ee36461(); // tgen
};
//SIG(1 ee36461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36461 ::foo(){vfunc_called(this, "_ZN7ee364613fooEv");}
ee36461 ::~ee36461(){ note_dtor("ee36461", this);} // tgen
ee36461 ::ee36461(){ note_ctor("ee36461", this);} // tgen

static void Test_ee36461()
{
  extern Class_Descriptor cd_ee36461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36461, buf);
    ee36461 *dp, &lv = *(dp=new (buf) ee36461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee36461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee36461");
    check_base_class_offset(lv, (cc461*)(dd6461*), ABISELECT(16,8), "ee36461");
    check_base_class_offset(lv, (dd6461*), ABISELECT(16,8), "ee36461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36461.e");
    test_class_info(&lv, &cd_ee36461);
    dp->~ee36461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36461(Test_ee36461, "ee36461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36461C1Ev();
extern void _ZN7ee36461D1Ev();
Name_Map name_map_ee36461[] = {
  NSPAIR(_ZN7ee36461C1Ev),
  NSPAIR(_ZN7ee36461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee36461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36461[];
extern void _ZN7ee364613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee364613fooEv,_ZTv0_n12_N7ee364613fooEv)();
extern void ABISELECT(_ZThn16_N7ee364613fooEv,_ZThn8_N7ee364613fooEv)() __attribute__((weak));
extern void _ZN6dd64613barEv();
static  VTBL_ENTRY vtc_ee36461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36461[0]),
  (VTBL_ENTRY)&_ZN7ee364613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee364613fooEv,_ZTv0_n12_N7ee364613fooEv),
  (VTBL_ENTRY)&_ZN6dd64613barEv,
};
extern VTBL_ENTRY _ZTV7ee36461[];
static  VTT_ENTRY vtt_ee36461[] = {
  {&(_ZTV7ee36461[3]),  3,10},
  {&(_ZTV7ee36461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36461[];
extern  VTBL_ENTRY _ZTV7ee36461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36461[];
static VTBL_ENTRY alt_thunk_names728[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee364613fooEv,_ZTv0_n12_N7ee364613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee364613fooEv,_ZThn8_N7ee364613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36461 = {  "ee36461", // class name
  bases_ee36461, 4,
  &(vtc_ee36461[0]), // expected_vtbl_contents
  &(vtt_ee36461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36461),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names728,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46461  : dd6461 {
  int e;
  virtual void  bar(); // _ZN7ee464613barEv
  ~ee46461(); // tgen
  ee46461(); // tgen
};
//SIG(1 ee46461) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46461 ::bar(){vfunc_called(this, "_ZN7ee464613barEv");}
ee46461 ::~ee46461(){ note_dtor("ee46461", this);} // tgen
ee46461 ::ee46461(){ note_ctor("ee46461", this);} // tgen

static void Test_ee46461()
{
  extern Class_Descriptor cd_ee46461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46461, buf);
    ee46461 *dp, &lv = *(dp=new (buf) ee46461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), 0, "ee46461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), 0, "ee46461");
    check_base_class_offset(lv, (cc461*)(dd6461*), 0, "ee46461");
    check_base_class_offset(lv, (dd6461*), 0, "ee46461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46461.e");
    test_class_info(&lv, &cd_ee46461);
    dp->~ee46461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46461(Test_ee46461, "ee46461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46461C1Ev();
extern void _ZN7ee46461D1Ev();
Name_Map name_map_ee46461[] = {
  NSPAIR(_ZN7ee46461C1Ev),
  NSPAIR(_ZN7ee46461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee46461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46461[];
extern void _ZN6dd64613fooEv();
extern void _ZN7ee464613barEv();
static  VTBL_ENTRY vtc_ee46461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46461[0]),
  (VTBL_ENTRY)&_ZN6dd64613fooEv,
  (VTBL_ENTRY)&_ZN7ee464613barEv,
};
extern VTBL_ENTRY _ZTI7ee46461[];
extern  VTBL_ENTRY _ZTV7ee46461[];
Class_Descriptor cd_ee46461 = {  "ee46461", // class name
  bases_ee46461, 4,
  &(vtc_ee46461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46461),4, //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  ee56461  : virtual dd6461 {
  int e;
  virtual void  bar(); // _ZN7ee564613barEv
  ~ee56461(); // tgen
  ee56461(); // tgen
};
//SIG(1 ee56461) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56461 ::bar(){vfunc_called(this, "_ZN7ee564613barEv");}
ee56461 ::~ee56461(){ note_dtor("ee56461", this);} // tgen
ee56461 ::ee56461(){ note_ctor("ee56461", this);} // tgen

static void Test_ee56461()
{
  extern Class_Descriptor cd_ee56461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56461, buf);
    ee56461 *dp, &lv = *(dp=new (buf) ee56461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee56461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee56461");
    check_base_class_offset(lv, (cc461*)(dd6461*), ABISELECT(16,8), "ee56461");
    check_base_class_offset(lv, (dd6461*), ABISELECT(16,8), "ee56461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56461.e");
    test_class_info(&lv, &cd_ee56461);
    dp->~ee56461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56461(Test_ee56461, "ee56461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56461C1Ev();
extern void _ZN7ee56461D1Ev();
Name_Map name_map_ee56461[] = {
  NSPAIR(_ZN7ee56461C1Ev),
  NSPAIR(_ZN7ee56461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee56461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56461[];
extern void _ZN7ee564613barEv();
extern void _ZN6dd64613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee564613barEv,_ZTv0_n16_N7ee564613barEv)();
extern void ABISELECT(_ZThn16_N7ee564613barEv,_ZThn8_N7ee564613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56461[0]),
  (VTBL_ENTRY)&_ZN7ee564613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56461[0]),
  (VTBL_ENTRY)&_ZN6dd64613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee564613barEv,_ZTv0_n16_N7ee564613barEv),
};
extern VTBL_ENTRY _ZTV7ee56461[];
static  VTT_ENTRY vtt_ee56461[] = {
  {&(_ZTV7ee56461[3]),  3,10},
  {&(_ZTV7ee56461[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56461[];
extern  VTBL_ENTRY _ZTV7ee56461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56461[];
static VTBL_ENTRY alt_thunk_names729[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee564613barEv,_ZTv0_n16_N7ee564613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee564613barEv,_ZThn8_N7ee564613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56461 = {  "ee56461", // class name
  bases_ee56461, 4,
  &(vtc_ee56461[0]), // expected_vtbl_contents
  &(vtt_ee56461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56461),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56461),2, //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  ee66461  : dd6461 {
  int e;
  virtual void  foo(); // _ZN7ee664613fooEv
  virtual void  bar(); // _ZN7ee664613barEv
  ~ee66461(); // tgen
  ee66461(); // tgen
};
//SIG(1 ee66461) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66461 ::foo(){vfunc_called(this, "_ZN7ee664613fooEv");}
void  ee66461 ::bar(){vfunc_called(this, "_ZN7ee664613barEv");}
ee66461 ::~ee66461(){ note_dtor("ee66461", this);} // tgen
ee66461 ::ee66461(){ note_ctor("ee66461", this);} // tgen

static void Test_ee66461()
{
  extern Class_Descriptor cd_ee66461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66461, buf);
    ee66461 *dp, &lv = *(dp=new (buf) ee66461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), 0, "ee66461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), 0, "ee66461");
    check_base_class_offset(lv, (cc461*)(dd6461*), 0, "ee66461");
    check_base_class_offset(lv, (dd6461*), 0, "ee66461");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66461.e");
    test_class_info(&lv, &cd_ee66461);
    dp->~ee66461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66461(Test_ee66461, "ee66461", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66461C1Ev();
extern void _ZN7ee66461D1Ev();
Name_Map name_map_ee66461[] = {
  NSPAIR(_ZN7ee66461C1Ev),
  NSPAIR(_ZN7ee66461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee66461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66461[];
extern void _ZN7ee664613fooEv();
extern void _ZN7ee664613barEv();
static  VTBL_ENTRY vtc_ee66461[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66461[0]),
  (VTBL_ENTRY)&_ZN7ee664613fooEv,
  (VTBL_ENTRY)&_ZN7ee664613barEv,
};
extern VTBL_ENTRY _ZTI7ee66461[];
extern  VTBL_ENTRY _ZTV7ee66461[];
Class_Descriptor cd_ee66461 = {  "ee66461", // class name
  bases_ee66461, 4,
  &(vtc_ee66461[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66461),4, //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  ee76461  : virtual dd6461 {
  int e;
  virtual void  foo(); // _ZN7ee764613fooEv
  virtual void  bar(); // _ZN7ee764613barEv
  ~ee76461(); // tgen
  ee76461(); // tgen
};
//SIG(1 ee76461) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76461 ::foo(){vfunc_called(this, "_ZN7ee764613fooEv");}
void  ee76461 ::bar(){vfunc_called(this, "_ZN7ee764613barEv");}
ee76461 ::~ee76461(){ note_dtor("ee76461", this);} // tgen
ee76461 ::ee76461(){ note_ctor("ee76461", this);} // tgen

static void Test_ee76461()
{
  extern Class_Descriptor cd_ee76461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76461, buf);
    ee76461 *dp, &lv = *(dp=new (buf) ee76461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee76461");
    check_base_class_offset(lv, (bb61*)(cc461*)(dd6461*), ABISELECT(16,8), "ee76461");
    check_base_class_offset(lv, (cc461*)(dd6461*), ABISELECT(16,8), "ee76461");
    check_base_class_offset(lv, (dd6461*), ABISELECT(16,8), "ee76461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76461.e");
    test_class_info(&lv, &cd_ee76461);
    dp->~ee76461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76461(Test_ee76461, "ee76461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76461C1Ev();
extern void _ZN7ee76461D1Ev();
Name_Map name_map_ee76461[] = {
  NSPAIR(_ZN7ee76461C1Ev),
  NSPAIR(_ZN7ee76461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd6461;
extern VTBL_ENTRY _ZTI6dd6461[];
extern  VTBL_ENTRY _ZTV6dd6461[];
static Base_Class bases_ee76461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6461,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76461[];
extern void _ZN7ee764613fooEv();
extern void _ZN7ee764613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee764613fooEv,_ZTv0_n12_N7ee764613fooEv)();
extern void ABISELECT(_ZThn16_N7ee764613fooEv,_ZThn8_N7ee764613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee764613barEv,_ZTv0_n16_N7ee764613barEv)();
extern void ABISELECT(_ZThn16_N7ee764613barEv,_ZThn8_N7ee764613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76461[0]),
  (VTBL_ENTRY)&_ZN7ee764613fooEv,
  (VTBL_ENTRY)&_ZN7ee764613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee764613fooEv,_ZTv0_n12_N7ee764613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee764613barEv,_ZTv0_n16_N7ee764613barEv),
};
extern VTBL_ENTRY _ZTV7ee76461[];
static  VTT_ENTRY vtt_ee76461[] = {
  {&(_ZTV7ee76461[3]),  3,11},
  {&(_ZTV7ee76461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76461[];
extern  VTBL_ENTRY _ZTV7ee76461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76461[];
static VTBL_ENTRY alt_thunk_names730[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee764613barEv,_ZTv0_n16_N7ee764613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee764613barEv,_ZThn8_N7ee764613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee764613fooEv,_ZTv0_n12_N7ee764613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee764613fooEv,_ZThn8_N7ee764613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76461 = {  "ee76461", // class name
  bases_ee76461, 4,
  &(vtc_ee76461[0]), // expected_vtbl_contents
  &(vtt_ee76461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76461),2, //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  dd7461  : virtual cc461 {
  int d;
  virtual void  bar(); // _ZN6dd74613barEv
  virtual void  foo(); // _ZN6dd74613fooEv
  ~dd7461(); // tgen
  dd7461(); // tgen
};
//SIG(-1 dd7461) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd7461 ::bar(){vfunc_called(this, "_ZN6dd74613barEv");}
void  dd7461 ::foo(){vfunc_called(this, "_ZN6dd74613fooEv");}
dd7461 ::~dd7461(){ note_dtor("dd7461", this);} // tgen
dd7461 ::dd7461(){ note_ctor("dd7461", this);} // tgen

static void Test_dd7461()
{
  extern Class_Descriptor cd_dd7461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7461, buf);
    dd7461 *dp, &lv = *(dp=new (buf) dd7461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,8), "dd7461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,8), "dd7461");
    check_base_class_offset(lv, (cc461*), ABISELECT(16,8), "dd7461");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7461.d");
    test_class_info(&lv, &cd_dd7461);
    dp->~dd7461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7461(Test_dd7461, "dd7461", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7461C1Ev();
extern void _ZN6dd7461D1Ev();
Name_Map name_map_dd7461[] = {
  NSPAIR(_ZN6dd7461C1Ev),
  NSPAIR(_ZN6dd7461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
static Base_Class bases_dd7461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
extern VTBL_ENTRY _ZTV6dd7461[];
static  VTT_ENTRY vtt_dd7461[] = {
  {&(_ZTV6dd7461[3]),  3,11},
  {&(_ZTV6dd7461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static VTBL_ENTRY alt_thunk_names731[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7461 = {  "dd7461", // class name
  bases_dd7461, 3,
  &(vtc_dd7461[0]), // expected_vtbl_contents
  &(vtt_dd7461[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7461),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names731,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07461  : dd7461 {
  int e;
  ~ee07461(); // tgen
  ee07461(); // tgen
};
//SIG(1 ee07461) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee07461 ::~ee07461(){ note_dtor("ee07461", this);} // tgen
ee07461 ::ee07461(){ note_ctor("ee07461", this);} // tgen

static void Test_ee07461()
{
  extern Class_Descriptor cd_ee07461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07461, buf);
    ee07461 *dp, &lv = *(dp=new (buf) ee07461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee07461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee07461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(16,12), "ee07461");
    check_base_class_offset(lv, (dd7461*), 0, "ee07461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07461.e");
    test_class_info(&lv, &cd_ee07461);
    dp->~ee07461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07461(Test_ee07461, "ee07461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07461C1Ev();
extern void _ZN7ee07461D1Ev();
Name_Map name_map_ee07461[] = {
  NSPAIR(_ZN7ee07461C1Ev),
  NSPAIR(_ZN7ee07461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee07461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
extern VTBL_ENTRY _ZTV7ee07461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee07461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee07461[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee07461[] = {
  {&(_ZTV7ee07461[3]),  3,11},
  {&(_tg__ZTV6dd7461__7ee07461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee07461[4]),  4,6},
  {&(_ZTV7ee07461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07461[];
extern  VTBL_ENTRY _ZTV7ee07461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07461[];
static VTBL_ENTRY alt_thunk_names732[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07461 = {  "ee07461", // class name
  bases_ee07461, 4,
  &(vtc_ee07461[0]), // expected_vtbl_contents
  &(vtt_ee07461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07461),4, //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  ee17461  : virtual dd7461 {
  int e;
  ~ee17461(); // tgen
  ee17461(); // tgen
};
//SIG(1 ee17461) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee17461 ::~ee17461(){ note_dtor("ee17461", this);} // tgen
ee17461 ::ee17461(){ note_ctor("ee17461", this);} // tgen

static void Test_ee17461()
{
  extern Class_Descriptor cd_ee17461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17461, buf);
    ee17461 *dp, &lv = *(dp=new (buf) ee17461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee17461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee17461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(32,16), "ee17461");
    check_base_class_offset(lv, (dd7461*), ABISELECT(16,8), "ee17461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17461.e");
    test_class_info(&lv, &cd_ee17461);
    dp->~ee17461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17461(Test_ee17461, "ee17461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17461C1Ev();
extern void _ZN7ee17461D1Ev();
Name_Map name_map_ee17461[] = {
  NSPAIR(_ZN7ee17461C1Ev),
  NSPAIR(_ZN7ee17461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee17461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17461[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
extern VTBL_ENTRY _ZTV7ee17461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee17461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee17461[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee17461[] = {
  {&(_ZTV7ee17461[4]),  4,17},
  {&(_ZTV7ee17461[9]),  9,17},
  {&(_ZTV7ee17461[15]),  15,17},
  {&(_tg__ZTV6dd7461__7ee17461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee17461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17461[];
extern  VTBL_ENTRY _ZTV7ee17461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17461[];
static VTBL_ENTRY alt_thunk_names733[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17461 = {  "ee17461", // class name
  bases_ee17461, 4,
  &(vtc_ee17461[0]), // expected_vtbl_contents
  &(vtt_ee17461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17461),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names733,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27461  : dd7461 {
  int e;
  virtual void  foo(); // _ZN7ee274613fooEv
  ~ee27461(); // tgen
  ee27461(); // tgen
};
//SIG(1 ee27461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27461 ::foo(){vfunc_called(this, "_ZN7ee274613fooEv");}
ee27461 ::~ee27461(){ note_dtor("ee27461", this);} // tgen
ee27461 ::ee27461(){ note_ctor("ee27461", this);} // tgen

static void Test_ee27461()
{
  extern Class_Descriptor cd_ee27461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27461, buf);
    ee27461 *dp, &lv = *(dp=new (buf) ee27461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee27461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee27461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(16,12), "ee27461");
    check_base_class_offset(lv, (dd7461*), 0, "ee27461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27461.e");
    test_class_info(&lv, &cd_ee27461);
    dp->~ee27461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27461(Test_ee27461, "ee27461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27461C1Ev();
extern void _ZN7ee27461D1Ev();
Name_Map name_map_ee27461[] = {
  NSPAIR(_ZN7ee27461C1Ev),
  NSPAIR(_ZN7ee27461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee27461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27461[];
extern void _ZN6dd74613barEv();
extern void _ZN7ee274613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee274613fooEv,_ZTv0_n12_N7ee274613fooEv)();
extern void ABISELECT(_ZThn16_N7ee274613fooEv,_ZThn12_N7ee274613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN7ee274613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee274613fooEv,_ZTv0_n12_N7ee274613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
extern VTBL_ENTRY _ZTV7ee27461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee27461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee27461[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee27461[] = {
  {&(_ZTV7ee27461[3]),  3,11},
  {&(_tg__ZTV6dd7461__7ee27461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee27461[4]),  4,6},
  {&(_ZTV7ee27461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27461[];
extern  VTBL_ENTRY _ZTV7ee27461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27461[];
static VTBL_ENTRY alt_thunk_names734[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee274613fooEv,_ZTv0_n12_N7ee274613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee274613fooEv,_ZThn12_N7ee274613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27461 = {  "ee27461", // class name
  bases_ee27461, 4,
  &(vtc_ee27461[0]), // expected_vtbl_contents
  &(vtt_ee27461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names734,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37461  : virtual dd7461 {
  int e;
  virtual void  foo(); // _ZN7ee374613fooEv
  ~ee37461(); // tgen
  ee37461(); // tgen
};
//SIG(1 ee37461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37461 ::foo(){vfunc_called(this, "_ZN7ee374613fooEv");}
ee37461 ::~ee37461(){ note_dtor("ee37461", this);} // tgen
ee37461 ::ee37461(){ note_ctor("ee37461", this);} // tgen

static void Test_ee37461()
{
  extern Class_Descriptor cd_ee37461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37461, buf);
    ee37461 *dp, &lv = *(dp=new (buf) ee37461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee37461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee37461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(32,16), "ee37461");
    check_base_class_offset(lv, (dd7461*), ABISELECT(16,8), "ee37461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37461.e");
    test_class_info(&lv, &cd_ee37461);
    dp->~ee37461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37461(Test_ee37461, "ee37461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37461C1Ev();
extern void _ZN7ee37461D1Ev();
Name_Map name_map_ee37461[] = {
  NSPAIR(_ZN7ee37461C1Ev),
  NSPAIR(_ZN7ee37461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee37461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37461[];
extern void _ZN7ee374613fooEv();
extern void _ZN6dd74613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee374613fooEv,_ZTv0_n20_N7ee374613fooEv)();
extern void ABISELECT(_ZThn16_N7ee374613fooEv,_ZThn8_N7ee374613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee374613fooEv,_ZTv0_n12_N7ee374613fooEv)();
extern void ABISELECT(_ZThn32_N7ee374613fooEv,_ZThn16_N7ee374613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37461[0]),
  (VTBL_ENTRY)&_ZN7ee374613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee374613fooEv,_ZTv0_n20_N7ee374613fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee374613fooEv,_ZTv0_n12_N7ee374613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
extern VTBL_ENTRY _ZTV7ee37461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee37461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee37461[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee37461[] = {
  {&(_ZTV7ee37461[4]),  4,18},
  {&(_ZTV7ee37461[10]),  10,18},
  {&(_ZTV7ee37461[16]),  16,18},
  {&(_tg__ZTV6dd7461__7ee37461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee37461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37461[];
extern  VTBL_ENTRY _ZTV7ee37461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37461[];
static VTBL_ENTRY alt_thunk_names735[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee374613fooEv,_ZTv0_n12_N7ee374613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee374613fooEv,_ZThn16_N7ee374613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee374613fooEv,_ZTv0_n20_N7ee374613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee374613fooEv,_ZThn8_N7ee374613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37461 = {  "ee37461", // class name
  bases_ee37461, 4,
  &(vtc_ee37461[0]), // expected_vtbl_contents
  &(vtt_ee37461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37461),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names735,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47461  : dd7461 {
  int e;
  virtual void  bar(); // _ZN7ee474613barEv
  ~ee47461(); // tgen
  ee47461(); // tgen
};
//SIG(1 ee47461) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47461 ::bar(){vfunc_called(this, "_ZN7ee474613barEv");}
ee47461 ::~ee47461(){ note_dtor("ee47461", this);} // tgen
ee47461 ::ee47461(){ note_ctor("ee47461", this);} // tgen

static void Test_ee47461()
{
  extern Class_Descriptor cd_ee47461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47461, buf);
    ee47461 *dp, &lv = *(dp=new (buf) ee47461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee47461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee47461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(16,12), "ee47461");
    check_base_class_offset(lv, (dd7461*), 0, "ee47461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47461.e");
    test_class_info(&lv, &cd_ee47461);
    dp->~ee47461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47461(Test_ee47461, "ee47461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47461C1Ev();
extern void _ZN7ee47461D1Ev();
Name_Map name_map_ee47461[] = {
  NSPAIR(_ZN7ee47461C1Ev),
  NSPAIR(_ZN7ee47461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee47461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47461[];
extern void _ZN7ee474613barEv();
extern void _ZN6dd74613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee474613barEv,_ZTv0_n16_N7ee474613barEv)();
extern void ABISELECT(_ZThn16_N7ee474613barEv,_ZThn12_N7ee474613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47461[0]),
  (VTBL_ENTRY)&_ZN7ee474613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee474613barEv,_ZTv0_n16_N7ee474613barEv),
};
extern VTBL_ENTRY _ZTV7ee47461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee47461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee47461[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee47461[] = {
  {&(_ZTV7ee47461[3]),  3,11},
  {&(_tg__ZTV6dd7461__7ee47461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee47461[4]),  4,6},
  {&(_ZTV7ee47461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47461[];
extern  VTBL_ENTRY _ZTV7ee47461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47461[];
static VTBL_ENTRY alt_thunk_names736[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee474613barEv,_ZTv0_n16_N7ee474613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee474613barEv,_ZThn12_N7ee474613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47461 = {  "ee47461", // class name
  bases_ee47461, 4,
  &(vtc_ee47461[0]), // expected_vtbl_contents
  &(vtt_ee47461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names736,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57461  : virtual dd7461 {
  int e;
  virtual void  bar(); // _ZN7ee574613barEv
  ~ee57461(); // tgen
  ee57461(); // tgen
};
//SIG(1 ee57461) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57461 ::bar(){vfunc_called(this, "_ZN7ee574613barEv");}
ee57461 ::~ee57461(){ note_dtor("ee57461", this);} // tgen
ee57461 ::ee57461(){ note_ctor("ee57461", this);} // tgen

static void Test_ee57461()
{
  extern Class_Descriptor cd_ee57461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57461, buf);
    ee57461 *dp, &lv = *(dp=new (buf) ee57461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee57461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee57461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(32,16), "ee57461");
    check_base_class_offset(lv, (dd7461*), ABISELECT(16,8), "ee57461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57461.e");
    test_class_info(&lv, &cd_ee57461);
    dp->~ee57461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57461(Test_ee57461, "ee57461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57461C1Ev();
extern void _ZN7ee57461D1Ev();
Name_Map name_map_ee57461[] = {
  NSPAIR(_ZN7ee57461C1Ev),
  NSPAIR(_ZN7ee57461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee57461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57461[];
extern void _ZN7ee574613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee574613barEv,_ZTv0_n16_N7ee574613barEv)();
extern void ABISELECT(_ZThn16_N7ee574613barEv,_ZThn8_N7ee574613barEv)() __attribute__((weak));
extern void _ZN6dd74613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee574613barEv,_ZTv0_n16_N7ee574613barEv)();
extern void ABISELECT(_ZThn32_N7ee574613barEv,_ZThn16_N7ee574613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57461[0]),
  (VTBL_ENTRY)&_ZN7ee574613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee574613barEv,_ZTv0_n16_N7ee574613barEv),
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee574613barEv,_ZTv0_n16_N7ee574613barEv),
};
extern VTBL_ENTRY _ZTV7ee57461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee57461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee57461[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee57461[] = {
  {&(_ZTV7ee57461[4]),  4,18},
  {&(_ZTV7ee57461[10]),  10,18},
  {&(_ZTV7ee57461[16]),  16,18},
  {&(_tg__ZTV6dd7461__7ee57461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee57461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57461[];
extern  VTBL_ENTRY _ZTV7ee57461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57461[];
static VTBL_ENTRY alt_thunk_names737[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee574613barEv,_ZTv0_n16_N7ee574613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee574613barEv,_ZThn16_N7ee574613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee574613barEv,_ZThn8_N7ee574613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57461 = {  "ee57461", // class name
  bases_ee57461, 4,
  &(vtc_ee57461[0]), // expected_vtbl_contents
  &(vtt_ee57461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57461),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names737,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67461  : dd7461 {
  int e;
  virtual void  foo(); // _ZN7ee674613fooEv
  virtual void  bar(); // _ZN7ee674613barEv
  ~ee67461(); // tgen
  ee67461(); // tgen
};
//SIG(1 ee67461) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67461 ::foo(){vfunc_called(this, "_ZN7ee674613fooEv");}
void  ee67461 ::bar(){vfunc_called(this, "_ZN7ee674613barEv");}
ee67461 ::~ee67461(){ note_dtor("ee67461", this);} // tgen
ee67461 ::ee67461(){ note_ctor("ee67461", this);} // tgen

static void Test_ee67461()
{
  extern Class_Descriptor cd_ee67461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67461, buf);
    ee67461 *dp, &lv = *(dp=new (buf) ee67461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(16,12), "ee67461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(16,12), "ee67461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(16,12), "ee67461");
    check_base_class_offset(lv, (dd7461*), 0, "ee67461");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67461.e");
    test_class_info(&lv, &cd_ee67461);
    dp->~ee67461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67461(Test_ee67461, "ee67461", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67461C1Ev();
extern void _ZN7ee67461D1Ev();
Name_Map name_map_ee67461[] = {
  NSPAIR(_ZN7ee67461C1Ev),
  NSPAIR(_ZN7ee67461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee67461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc461,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67461[];
extern void _ZN7ee674613barEv();
extern void _ZN7ee674613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee674613fooEv,_ZTv0_n12_N7ee674613fooEv)();
extern void ABISELECT(_ZThn16_N7ee674613fooEv,_ZThn12_N7ee674613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee674613barEv,_ZTv0_n16_N7ee674613barEv)();
extern void ABISELECT(_ZThn16_N7ee674613barEv,_ZThn12_N7ee674613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67461[0]),
  (VTBL_ENTRY)&_ZN7ee674613barEv,
  (VTBL_ENTRY)&_ZN7ee674613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee674613fooEv,_ZTv0_n12_N7ee674613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee674613barEv,_ZTv0_n16_N7ee674613barEv),
};
extern VTBL_ENTRY _ZTV7ee67461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee67461[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee67461[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee67461[] = {
  {&(_ZTV7ee67461[3]),  3,11},
  {&(_tg__ZTV6dd7461__7ee67461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee67461[4]),  4,6},
  {&(_ZTV7ee67461[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67461[];
extern  VTBL_ENTRY _ZTV7ee67461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67461[];
static VTBL_ENTRY alt_thunk_names738[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn12_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn12_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee674613barEv,_ZTv0_n16_N7ee674613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee674613barEv,_ZThn12_N7ee674613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee674613fooEv,_ZTv0_n12_N7ee674613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee674613fooEv,_ZThn12_N7ee674613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67461 = {  "ee67461", // class name
  bases_ee67461, 4,
  &(vtc_ee67461[0]), // expected_vtbl_contents
  &(vtt_ee67461[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67461),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67461),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67461),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names738,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77461  : virtual dd7461 {
  int e;
  virtual void  foo(); // _ZN7ee774613fooEv
  virtual void  bar(); // _ZN7ee774613barEv
  ~ee77461(); // tgen
  ee77461(); // tgen
};
//SIG(1 ee77461) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77461 ::foo(){vfunc_called(this, "_ZN7ee774613fooEv");}
void  ee77461 ::bar(){vfunc_called(this, "_ZN7ee774613barEv");}
ee77461 ::~ee77461(){ note_dtor("ee77461", this);} // tgen
ee77461 ::ee77461(){ note_ctor("ee77461", this);} // tgen

static void Test_ee77461()
{
  extern Class_Descriptor cd_ee77461;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77461, buf);
    ee77461 *dp, &lv = *(dp=new (buf) ee77461());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77461)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77461)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc461*), ABISELECT(32,16), "ee77461");
    check_base_class_offset(lv, (bb61*)(cc461*), ABISELECT(32,16), "ee77461");
    check_base_class_offset(lv, (cc461*)(dd7461*), ABISELECT(32,16), "ee77461");
    check_base_class_offset(lv, (dd7461*), ABISELECT(16,8), "ee77461");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77461.e");
    test_class_info(&lv, &cd_ee77461);
    dp->~ee77461();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77461(Test_ee77461, "ee77461", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77461C1Ev();
extern void _ZN7ee77461D1Ev();
Name_Map name_map_ee77461[] = {
  NSPAIR(_ZN7ee77461C1Ev),
  NSPAIR(_ZN7ee77461D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc461;
extern VTBL_ENTRY _ZTI5cc461[];
extern  VTBL_ENTRY _ZTV5cc461[];
extern Class_Descriptor cd_dd7461;
extern VTBL_ENTRY _ZTI6dd7461[];
extern  VTBL_ENTRY _ZTV6dd7461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7461[];
static Base_Class bases_ee77461[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc461,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7461,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77461[];
extern void _ZN7ee774613fooEv();
extern void _ZN7ee774613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee774613barEv,_ZTv0_n16_N7ee774613barEv)();
extern void ABISELECT(_ZThn16_N7ee774613barEv,_ZThn8_N7ee774613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee774613fooEv,_ZTv0_n20_N7ee774613fooEv)();
extern void ABISELECT(_ZThn16_N7ee774613fooEv,_ZThn8_N7ee774613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee774613fooEv,_ZTv0_n12_N7ee774613fooEv)();
extern void ABISELECT(_ZThn32_N7ee774613fooEv,_ZThn16_N7ee774613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee774613barEv,_ZTv0_n16_N7ee774613barEv)();
extern void ABISELECT(_ZThn32_N7ee774613barEv,_ZThn16_N7ee774613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77461[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77461[0]),
  (VTBL_ENTRY)&_ZN7ee774613fooEv,
  (VTBL_ENTRY)&_ZN7ee774613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee774613barEv,_ZTv0_n16_N7ee774613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee774613fooEv,_ZTv0_n20_N7ee774613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee774613fooEv,_ZTv0_n12_N7ee774613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee774613barEv,_ZTv0_n16_N7ee774613barEv),
};
extern VTBL_ENTRY _ZTV7ee77461[];
extern void _ZN6dd74613barEv();
extern void _ZN6dd74613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7461__7ee77461[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&_ZN6dd74613barEv,
  (VTBL_ENTRY)&_ZN6dd74613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv)();
extern void ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv)();
extern void ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc461__6dd7461__7ee77461[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7461[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv),
};
static  VTT_ENTRY vtt_ee77461[] = {
  {&(_ZTV7ee77461[4]),  4,19},
  {&(_ZTV7ee77461[11]),  11,19},
  {&(_ZTV7ee77461[17]),  17,19},
  {&(_tg__ZTV6dd7461__7ee77461[3]),  3,5},
  {&(_tg__ZTV5cc461__6dd7461__7ee77461[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77461[];
extern  VTBL_ENTRY _ZTV7ee77461[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77461[];
static VTBL_ENTRY alt_thunk_names739[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74613barEv,_ZTv0_n16_N6dd74613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613barEv,_ZThn8_N6dd74613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74613fooEv,_ZTv0_n12_N6dd74613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74613fooEv,_ZThn8_N6dd74613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee774613fooEv,_ZTv0_n12_N7ee774613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee774613fooEv,_ZThn16_N7ee774613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee774613fooEv,_ZTv0_n20_N7ee774613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee774613fooEv,_ZThn8_N7ee774613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee774613barEv,_ZTv0_n16_N7ee774613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee774613barEv,_ZThn16_N7ee774613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee774613barEv,_ZThn8_N7ee774613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77461 = {  "ee77461", // class name
  bases_ee77461, 4,
  &(vtc_ee77461[0]), // expected_vtbl_contents
  &(vtt_ee77461[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77461),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77461),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77461),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names739,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc561  : virtual bb61 {
  int c;
  virtual void  bar(); // _ZN5cc5613barEv
  ~cc561(); // tgen
  cc561(); // tgen
};
//SIG(-1 cc561) C1{ VBC2{ BC3{ v2 Fi} v1 v2 Fi} v1 Fi}


void  cc561 ::bar(){vfunc_called(this, "_ZN5cc5613barEv");}
cc561 ::~cc561(){ note_dtor("cc561", this);} // tgen
cc561 ::cc561(){ note_ctor("cc561", this);} // tgen

static void Test_cc561()
{
  extern Class_Descriptor cd_cc561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc561, buf);
    cc561 *dp, &lv = *(dp=new (buf) cc561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,8), "cc561");
    check_base_class_offset(lv, (bb61*), ABISELECT(16,8), "cc561");
    check_field_offset(lv, c, ABISELECT(8,4), "cc561.c");
    test_class_info(&lv, &cd_cc561);
    dp->~cc561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc561(Test_cc561, "cc561", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc561C1Ev();
extern void _ZN5cc561D1Ev();
Name_Map name_map_cc561[] = {
  NSPAIR(_ZN5cc561C1Ev),
  NSPAIR(_ZN5cc561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI5cc561[];
extern void _ZN5cc5613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_cc561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV5cc561[];
static  VTT_ENTRY vtt_cc561[] = {
  {&(_ZTV5cc561[3]),  3,10},
  {&(_ZTV5cc561[8]),  8,10},
};
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static VTBL_ENTRY alt_thunk_names740[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc561 = {  "cc561", // class name
  bases_cc561, 2,
  &(vtc_cc561[0]), // expected_vtbl_contents
  &(vtt_cc561[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc561),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc561),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names740,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0561  : cc561 {
  int d;
  ~dd0561(); // tgen
  dd0561(); // tgen
};
//SIG(-1 dd0561) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} Fi}


dd0561 ::~dd0561(){ note_dtor("dd0561", this);} // tgen
dd0561 ::dd0561(){ note_ctor("dd0561", this);} // tgen

static void Test_dd0561()
{
  extern Class_Descriptor cd_dd0561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0561, buf);
    dd0561 *dp, &lv = *(dp=new (buf) dd0561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd0561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(16,12), "dd0561");
    check_base_class_offset(lv, (cc561*), 0, "dd0561");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0561.d");
    test_class_info(&lv, &cd_dd0561);
    dp->~dd0561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0561(Test_dd0561, "dd0561", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0561C1Ev();
extern void _ZN6dd0561D1Ev();
Name_Map name_map_dd0561[] = {
  NSPAIR(_ZN6dd0561C1Ev),
  NSPAIR(_ZN6dd0561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd0561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0561[];
extern void _ZN5cc5613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd0561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV6dd0561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd0561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd0561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd0561[] = {
  {&(_ZTV6dd0561[3]),  3,10},
  {&(_tg__ZTV5cc561__6dd0561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd0561[4]),  4,6},
  {&(_ZTV6dd0561[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static VTBL_ENTRY alt_thunk_names741[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0561 = {  "dd0561", // class name
  bases_dd0561, 3,
  &(vtc_dd0561[0]), // expected_vtbl_contents
  &(vtt_dd0561[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0561),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0561),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names741,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00561  : dd0561 {
  int e;
  ~ee00561(); // tgen
  ee00561(); // tgen
};
//SIG(1 ee00561) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee00561 ::~ee00561(){ note_dtor("ee00561", this);} // tgen
ee00561 ::ee00561(){ note_ctor("ee00561", this);} // tgen

static void Test_ee00561()
{
  extern Class_Descriptor cd_ee00561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00561, buf);
    ee00561 *dp, &lv = *(dp=new (buf) ee00561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee00561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(24,16), "ee00561");
    check_base_class_offset(lv, (cc561*)(dd0561*), 0, "ee00561");
    check_base_class_offset(lv, (dd0561*), 0, "ee00561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00561.e");
    test_class_info(&lv, &cd_ee00561);
    dp->~ee00561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00561(Test_ee00561, "ee00561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00561C1Ev();
extern void _ZN7ee00561D1Ev();
Name_Map name_map_ee00561[] = {
  NSPAIR(_ZN7ee00561C1Ev),
  NSPAIR(_ZN7ee00561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee00561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00561[];
extern void _ZN5cc5613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee00561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee00561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee00561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee00561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee00561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee00561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee00561[] = {
  {&(_ZTV7ee00561[3]),  3,10},
  {&(_tg__ZTV6dd0561__7ee00561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee00561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee00561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee00561[4]),  4,6},
  {&(_ZTV7ee00561[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee00561[];
extern  VTBL_ENTRY _ZTV7ee00561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00561[];
static VTBL_ENTRY alt_thunk_names742[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00561 = {  "ee00561", // class name
  bases_ee00561, 4,
  &(vtc_ee00561[0]), // expected_vtbl_contents
  &(vtt_ee00561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00561),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00561),6, //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  ee10561  : virtual dd0561 {
  int e;
  ~ee10561(); // tgen
  ee10561(); // tgen
};
//SIG(1 ee10561) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee10561 ::~ee10561(){ note_dtor("ee10561", this);} // tgen
ee10561 ::ee10561(){ note_ctor("ee10561", this);} // tgen

static void Test_ee10561()
{
  extern Class_Descriptor cd_ee10561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10561, buf);
    ee10561 *dp, &lv = *(dp=new (buf) ee10561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee10561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(32,20), "ee10561");
    check_base_class_offset(lv, (cc561*)(dd0561*), ABISELECT(16,8), "ee10561");
    check_base_class_offset(lv, (dd0561*), ABISELECT(16,8), "ee10561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10561.e");
    test_class_info(&lv, &cd_ee10561);
    dp->~ee10561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10561(Test_ee10561, "ee10561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10561C1Ev();
extern void _ZN7ee10561D1Ev();
Name_Map name_map_ee10561[] = {
  NSPAIR(_ZN7ee10561C1Ev),
  NSPAIR(_ZN7ee10561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee10561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10561[];
extern void _ZN5cc5613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee10561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10561[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee10561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee10561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee10561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee10561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee10561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee10561[] = {
  {&(_ZTV7ee10561[4]),  4,15},
  {&(_ZTV7ee10561[8]),  8,15},
  {&(_ZTV7ee10561[13]),  13,15},
  {&(_tg__ZTV6dd0561__7ee10561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee10561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee10561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee10561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10561[];
extern  VTBL_ENTRY _ZTV7ee10561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10561[];
static VTBL_ENTRY alt_thunk_names743[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10561 = {  "ee10561", // class name
  bases_ee10561, 4,
  &(vtc_ee10561[0]), // expected_vtbl_contents
  &(vtt_ee10561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10561),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10561),7, //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  ee20561  : dd0561 {
  int e;
  virtual void  foo(); // _ZN7ee205613fooEv
  ~ee20561(); // tgen
  ee20561(); // tgen
};
//SIG(1 ee20561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee20561 ::foo(){vfunc_called(this, "_ZN7ee205613fooEv");}
ee20561 ::~ee20561(){ note_dtor("ee20561", this);} // tgen
ee20561 ::ee20561(){ note_ctor("ee20561", this);} // tgen

static void Test_ee20561()
{
  extern Class_Descriptor cd_ee20561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20561, buf);
    ee20561 *dp, &lv = *(dp=new (buf) ee20561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee20561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(24,16), "ee20561");
    check_base_class_offset(lv, (cc561*)(dd0561*), 0, "ee20561");
    check_base_class_offset(lv, (dd0561*), 0, "ee20561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20561.e");
    test_class_info(&lv, &cd_ee20561);
    dp->~ee20561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20561(Test_ee20561, "ee20561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20561C1Ev();
extern void _ZN7ee20561D1Ev();
Name_Map name_map_ee20561[] = {
  NSPAIR(_ZN7ee20561C1Ev),
  NSPAIR(_ZN7ee20561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee20561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20561[];
extern void _ZN5cc5613barEv();
extern void _ZN7ee205613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee205613fooEv,_ZTv0_n12_N7ee205613fooEv)();
extern void ABISELECT(_ZThn24_N7ee205613fooEv,_ZThn16_N7ee205613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN7ee205613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee205613fooEv,_ZTv0_n12_N7ee205613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee20561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee20561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee20561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee20561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee20561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee20561[] = {
  {&(_ZTV7ee20561[3]),  3,11},
  {&(_tg__ZTV6dd0561__7ee20561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee20561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee20561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee20561[4]),  4,6},
  {&(_ZTV7ee20561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee20561[];
extern  VTBL_ENTRY _ZTV7ee20561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20561[];
static VTBL_ENTRY alt_thunk_names744[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee205613fooEv,_ZTv0_n12_N7ee205613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee205613fooEv,_ZThn16_N7ee205613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20561 = {  "ee20561", // class name
  bases_ee20561, 4,
  &(vtc_ee20561[0]), // expected_vtbl_contents
  &(vtt_ee20561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20561),6, //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  ee30561  : virtual dd0561 {
  int e;
  virtual void  foo(); // _ZN7ee305613fooEv
  ~ee30561(); // tgen
  ee30561(); // tgen
};
//SIG(1 ee30561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee30561 ::foo(){vfunc_called(this, "_ZN7ee305613fooEv");}
ee30561 ::~ee30561(){ note_dtor("ee30561", this);} // tgen
ee30561 ::ee30561(){ note_ctor("ee30561", this);} // tgen

static void Test_ee30561()
{
  extern Class_Descriptor cd_ee30561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30561, buf);
    ee30561 *dp, &lv = *(dp=new (buf) ee30561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee30561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(32,20), "ee30561");
    check_base_class_offset(lv, (cc561*)(dd0561*), ABISELECT(16,8), "ee30561");
    check_base_class_offset(lv, (dd0561*), ABISELECT(16,8), "ee30561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30561.e");
    test_class_info(&lv, &cd_ee30561);
    dp->~ee30561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30561(Test_ee30561, "ee30561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30561C1Ev();
extern void _ZN7ee30561D1Ev();
Name_Map name_map_ee30561[] = {
  NSPAIR(_ZN7ee30561C1Ev),
  NSPAIR(_ZN7ee30561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee30561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30561[];
extern void _ZN7ee305613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee305613fooEv,_ZTv0_n12_N7ee305613fooEv)();
extern void ABISELECT(_ZThn32_N7ee305613fooEv,_ZThn20_N7ee305613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30561[0]),
  (VTBL_ENTRY)&_ZN7ee305613fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee305613fooEv,_ZTv0_n12_N7ee305613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee30561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee30561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee30561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee30561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee30561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee30561[] = {
  {&(_ZTV7ee30561[4]),  4,16},
  {&(_ZTV7ee30561[9]),  9,16},
  {&(_ZTV7ee30561[14]),  14,16},
  {&(_tg__ZTV6dd0561__7ee30561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee30561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee30561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee30561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30561[];
extern  VTBL_ENTRY _ZTV7ee30561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30561[];
static VTBL_ENTRY alt_thunk_names745[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee305613fooEv,_ZTv0_n12_N7ee305613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee305613fooEv,_ZThn20_N7ee305613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30561 = {  "ee30561", // class name
  bases_ee30561, 4,
  &(vtc_ee30561[0]), // expected_vtbl_contents
  &(vtt_ee30561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30561),7, //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  ee40561  : dd0561 {
  int e;
  virtual void  bar(); // _ZN7ee405613barEv
  ~ee40561(); // tgen
  ee40561(); // tgen
};
//SIG(1 ee40561) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee40561 ::bar(){vfunc_called(this, "_ZN7ee405613barEv");}
ee40561 ::~ee40561(){ note_dtor("ee40561", this);} // tgen
ee40561 ::ee40561(){ note_ctor("ee40561", this);} // tgen

static void Test_ee40561()
{
  extern Class_Descriptor cd_ee40561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40561, buf);
    ee40561 *dp, &lv = *(dp=new (buf) ee40561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee40561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(24,16), "ee40561");
    check_base_class_offset(lv, (cc561*)(dd0561*), 0, "ee40561");
    check_base_class_offset(lv, (dd0561*), 0, "ee40561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40561.e");
    test_class_info(&lv, &cd_ee40561);
    dp->~ee40561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40561(Test_ee40561, "ee40561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40561C1Ev();
extern void _ZN7ee40561D1Ev();
Name_Map name_map_ee40561[] = {
  NSPAIR(_ZN7ee40561C1Ev),
  NSPAIR(_ZN7ee40561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee40561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40561[];
extern void _ZN7ee405613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee405613barEv,_ZTv0_n16_N7ee405613barEv)();
extern void ABISELECT(_ZThn24_N7ee405613barEv,_ZThn16_N7ee405613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40561[0]),
  (VTBL_ENTRY)&_ZN7ee405613barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee405613barEv,_ZTv0_n16_N7ee405613barEv),
};
extern VTBL_ENTRY _ZTV7ee40561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee40561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee40561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee40561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee40561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee40561[] = {
  {&(_ZTV7ee40561[3]),  3,10},
  {&(_tg__ZTV6dd0561__7ee40561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee40561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee40561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee40561[4]),  4,6},
  {&(_ZTV7ee40561[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee40561[];
extern  VTBL_ENTRY _ZTV7ee40561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40561[];
static VTBL_ENTRY alt_thunk_names746[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee405613barEv,_ZTv0_n16_N7ee405613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee405613barEv,_ZThn16_N7ee405613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40561 = {  "ee40561", // class name
  bases_ee40561, 4,
  &(vtc_ee40561[0]), // expected_vtbl_contents
  &(vtt_ee40561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40561),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names746,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50561  : virtual dd0561 {
  int e;
  virtual void  bar(); // _ZN7ee505613barEv
  ~ee50561(); // tgen
  ee50561(); // tgen
};
//SIG(1 ee50561) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee50561 ::bar(){vfunc_called(this, "_ZN7ee505613barEv");}
ee50561 ::~ee50561(){ note_dtor("ee50561", this);} // tgen
ee50561 ::ee50561(){ note_ctor("ee50561", this);} // tgen

static void Test_ee50561()
{
  extern Class_Descriptor cd_ee50561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50561, buf);
    ee50561 *dp, &lv = *(dp=new (buf) ee50561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee50561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(32,20), "ee50561");
    check_base_class_offset(lv, (cc561*)(dd0561*), ABISELECT(16,8), "ee50561");
    check_base_class_offset(lv, (dd0561*), ABISELECT(16,8), "ee50561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50561.e");
    test_class_info(&lv, &cd_ee50561);
    dp->~ee50561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50561(Test_ee50561, "ee50561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50561C1Ev();
extern void _ZN7ee50561D1Ev();
Name_Map name_map_ee50561[] = {
  NSPAIR(_ZN7ee50561C1Ev),
  NSPAIR(_ZN7ee50561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee50561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50561[];
extern void _ZN7ee505613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee505613barEv,_ZTv0_n16_N7ee505613barEv)();
extern void ABISELECT(_ZThn16_N7ee505613barEv,_ZThn8_N7ee505613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee505613barEv,_ZTv0_n16_N7ee505613barEv)();
extern void ABISELECT(_ZThn32_N7ee505613barEv,_ZThn20_N7ee505613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50561[0]),
  (VTBL_ENTRY)&_ZN7ee505613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee505613barEv,_ZTv0_n16_N7ee505613barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee505613barEv,_ZTv0_n16_N7ee505613barEv),
};
extern VTBL_ENTRY _ZTV7ee50561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee50561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee50561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee50561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee50561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee50561[] = {
  {&(_ZTV7ee50561[4]),  4,16},
  {&(_ZTV7ee50561[9]),  9,16},
  {&(_ZTV7ee50561[14]),  14,16},
  {&(_tg__ZTV6dd0561__7ee50561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee50561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee50561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee50561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50561[];
extern  VTBL_ENTRY _ZTV7ee50561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50561[];
static VTBL_ENTRY alt_thunk_names747[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee505613barEv,_ZTv0_n16_N7ee505613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee505613barEv,_ZThn20_N7ee505613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee505613barEv,_ZThn8_N7ee505613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50561 = {  "ee50561", // class name
  bases_ee50561, 4,
  &(vtc_ee50561[0]), // expected_vtbl_contents
  &(vtt_ee50561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50561),7, //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  ee60561  : dd0561 {
  int e;
  virtual void  foo(); // _ZN7ee605613fooEv
  virtual void  bar(); // _ZN7ee605613barEv
  ~ee60561(); // tgen
  ee60561(); // tgen
};
//SIG(1 ee60561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee60561 ::foo(){vfunc_called(this, "_ZN7ee605613fooEv");}
void  ee60561 ::bar(){vfunc_called(this, "_ZN7ee605613barEv");}
ee60561 ::~ee60561(){ note_dtor("ee60561", this);} // tgen
ee60561 ::ee60561(){ note_ctor("ee60561", this);} // tgen

static void Test_ee60561()
{
  extern Class_Descriptor cd_ee60561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60561, buf);
    ee60561 *dp, &lv = *(dp=new (buf) ee60561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee60561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(24,16), "ee60561");
    check_base_class_offset(lv, (cc561*)(dd0561*), 0, "ee60561");
    check_base_class_offset(lv, (dd0561*), 0, "ee60561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60561.e");
    test_class_info(&lv, &cd_ee60561);
    dp->~ee60561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60561(Test_ee60561, "ee60561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60561C1Ev();
extern void _ZN7ee60561D1Ev();
Name_Map name_map_ee60561[] = {
  NSPAIR(_ZN7ee60561C1Ev),
  NSPAIR(_ZN7ee60561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee60561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60561[];
extern void _ZN7ee605613barEv();
extern void _ZN7ee605613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee605613fooEv,_ZTv0_n12_N7ee605613fooEv)();
extern void ABISELECT(_ZThn24_N7ee605613fooEv,_ZThn16_N7ee605613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee605613barEv,_ZTv0_n16_N7ee605613barEv)();
extern void ABISELECT(_ZThn24_N7ee605613barEv,_ZThn16_N7ee605613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60561[0]),
  (VTBL_ENTRY)&_ZN7ee605613barEv,
  (VTBL_ENTRY)&_ZN7ee605613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee605613fooEv,_ZTv0_n12_N7ee605613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee605613barEv,_ZTv0_n16_N7ee605613barEv),
};
extern VTBL_ENTRY _ZTV7ee60561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee60561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee60561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee60561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee60561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee60561[] = {
  {&(_ZTV7ee60561[3]),  3,11},
  {&(_tg__ZTV6dd0561__7ee60561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee60561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee60561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee60561[4]),  4,6},
  {&(_ZTV7ee60561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60561[];
extern  VTBL_ENTRY _ZTV7ee60561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60561[];
static VTBL_ENTRY alt_thunk_names748[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee605613barEv,_ZTv0_n16_N7ee605613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee605613barEv,_ZThn16_N7ee605613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee605613fooEv,_ZTv0_n12_N7ee605613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee605613fooEv,_ZThn16_N7ee605613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60561 = {  "ee60561", // class name
  bases_ee60561, 4,
  &(vtc_ee60561[0]), // expected_vtbl_contents
  &(vtt_ee60561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60561),6, //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  ee70561  : virtual dd0561 {
  int e;
  virtual void  foo(); // _ZN7ee705613fooEv
  virtual void  bar(); // _ZN7ee705613barEv
  ~ee70561(); // tgen
  ee70561(); // tgen
};
//SIG(1 ee70561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee70561 ::foo(){vfunc_called(this, "_ZN7ee705613fooEv");}
void  ee70561 ::bar(){vfunc_called(this, "_ZN7ee705613barEv");}
ee70561 ::~ee70561(){ note_dtor("ee70561", this);} // tgen
ee70561 ::ee70561(){ note_ctor("ee70561", this);} // tgen

static void Test_ee70561()
{
  extern Class_Descriptor cd_ee70561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70561, buf);
    ee70561 *dp, &lv = *(dp=new (buf) ee70561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee70561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd0561*), ABISELECT(32,20), "ee70561");
    check_base_class_offset(lv, (cc561*)(dd0561*), ABISELECT(16,8), "ee70561");
    check_base_class_offset(lv, (dd0561*), ABISELECT(16,8), "ee70561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70561.e");
    test_class_info(&lv, &cd_ee70561);
    dp->~ee70561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70561(Test_ee70561, "ee70561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70561C1Ev();
extern void _ZN7ee70561D1Ev();
Name_Map name_map_ee70561[] = {
  NSPAIR(_ZN7ee70561C1Ev),
  NSPAIR(_ZN7ee70561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd0561;
extern VTBL_ENTRY _ZTI6dd0561[];
extern  VTBL_ENTRY _ZTV6dd0561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0561[];
static Base_Class bases_ee70561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0561,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee70561[];
extern void _ZN7ee705613fooEv();
extern void _ZN7ee705613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee705613barEv,_ZTv0_n16_N7ee705613barEv)();
extern void ABISELECT(_ZThn16_N7ee705613barEv,_ZThn8_N7ee705613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee705613fooEv,_ZTv0_n12_N7ee705613fooEv)();
extern void ABISELECT(_ZThn32_N7ee705613fooEv,_ZThn20_N7ee705613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee705613barEv,_ZTv0_n16_N7ee705613barEv)();
extern void ABISELECT(_ZThn32_N7ee705613barEv,_ZThn20_N7ee705613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70561[0]),
  (VTBL_ENTRY)&_ZN7ee705613fooEv,
  (VTBL_ENTRY)&_ZN7ee705613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee705613barEv,_ZTv0_n16_N7ee705613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee705613fooEv,_ZTv0_n12_N7ee705613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee705613barEv,_ZTv0_n16_N7ee705613barEv),
};
extern VTBL_ENTRY _ZTV7ee70561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0561__7ee70561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd0561__7ee70561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd0561__7ee70561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0561__7ee70561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee70561[] = {
  {&(_ZTV7ee70561[4]),  4,17},
  {&(_ZTV7ee70561[10]),  10,17},
  {&(_ZTV7ee70561[15]),  15,17},
  {&(_tg__ZTV6dd0561__7ee70561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd0561__7ee70561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd0561__7ee70561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0561__7ee70561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70561[];
extern  VTBL_ENTRY _ZTV7ee70561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70561[];
static VTBL_ENTRY alt_thunk_names749[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee705613fooEv,_ZTv0_n12_N7ee705613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee705613fooEv,_ZThn20_N7ee705613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee705613barEv,_ZTv0_n16_N7ee705613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee705613barEv,_ZThn20_N7ee705613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee705613barEv,_ZThn8_N7ee705613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70561 = {  "ee70561", // class name
  bases_ee70561, 4,
  &(vtc_ee70561[0]), // expected_vtbl_contents
  &(vtt_ee70561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70561),7, //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  dd1561  : virtual cc561 {
  int d;
  ~dd1561(); // tgen
  dd1561(); // tgen
};
//SIG(-1 dd1561) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} Fi}


dd1561 ::~dd1561(){ note_dtor("dd1561", this);} // tgen
dd1561 ::dd1561(){ note_ctor("dd1561", this);} // tgen

static void Test_dd1561()
{
  extern Class_Descriptor cd_dd1561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1561, buf);
    dd1561 *dp, &lv = *(dp=new (buf) dd1561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd1561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,16), "dd1561");
    check_base_class_offset(lv, (cc561*), ABISELECT(16,8), "dd1561");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1561.d");
    test_class_info(&lv, &cd_dd1561);
    dp->~dd1561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1561(Test_dd1561, "dd1561", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1561C1Ev();
extern void _ZN6dd1561D1Ev();
Name_Map name_map_dd1561[] = {
  NSPAIR(_ZN6dd1561C1Ev),
  NSPAIR(_ZN6dd1561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd1561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1561[];
extern void _ZN5cc5613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd1561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV6dd1561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd1561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd1561[] = {
  {&(_ZTV6dd1561[4]),  4,15},
  {&(_ZTV6dd1561[8]),  8,15},
  {&(_ZTV6dd1561[13]),  13,15},
  {&(_tg__ZTV5cc561__6dd1561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd1561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static VTBL_ENTRY alt_thunk_names750[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1561 = {  "dd1561", // class name
  bases_dd1561, 3,
  &(vtc_dd1561[0]), // expected_vtbl_contents
  &(vtt_dd1561[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1561),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1561),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names750,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01561  : dd1561 {
  int e;
  ~ee01561(); // tgen
  ee01561(); // tgen
};
//SIG(1 ee01561) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee01561 ::~ee01561(){ note_dtor("ee01561", this);} // tgen
ee01561 ::ee01561(){ note_ctor("ee01561", this);} // tgen

static void Test_ee01561()
{
  extern Class_Descriptor cd_ee01561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01561, buf);
    ee01561 *dp, &lv = *(dp=new (buf) ee01561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee01561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee01561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(16,12), "ee01561");
    check_base_class_offset(lv, (dd1561*), 0, "ee01561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01561.e");
    test_class_info(&lv, &cd_ee01561);
    dp->~ee01561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01561(Test_ee01561, "ee01561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01561C1Ev();
extern void _ZN7ee01561D1Ev();
Name_Map name_map_ee01561[] = {
  NSPAIR(_ZN7ee01561C1Ev),
  NSPAIR(_ZN7ee01561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee01561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01561[];
extern void _ZN5cc5613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee01561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01561[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee01561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee01561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee01561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee01561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee01561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee01561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee01561[] = {
  {&(_ZTV7ee01561[4]),  4,15},
  {&(_tg__ZTV6dd1561__7ee01561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee01561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee01561[4]),  4,6},
  {&(_ZTV7ee01561[8]),  8,15},
  {&(_ZTV7ee01561[13]),  13,15},
  {&(_tg__ZTV5cc561__7ee01561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee01561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01561[];
extern  VTBL_ENTRY _ZTV7ee01561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01561[];
static VTBL_ENTRY alt_thunk_names751[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01561 = {  "ee01561", // class name
  bases_ee01561, 4,
  &(vtc_ee01561[0]), // expected_vtbl_contents
  &(vtt_ee01561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01561),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names751,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11561  : virtual dd1561 {
  int e;
  ~ee11561(); // tgen
  ee11561(); // tgen
};
//SIG(1 ee11561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee11561 ::~ee11561(){ note_dtor("ee11561", this);} // tgen
ee11561 ::ee11561(){ note_ctor("ee11561", this);} // tgen

static void Test_ee11561()
{
  extern Class_Descriptor cd_ee11561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11561, buf);
    ee11561 *dp, &lv = *(dp=new (buf) ee11561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee11561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee11561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(32,16), "ee11561");
    check_base_class_offset(lv, (dd1561*), ABISELECT(16,8), "ee11561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11561.e");
    test_class_info(&lv, &cd_ee11561);
    dp->~ee11561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11561(Test_ee11561, "ee11561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11561C1Ev();
extern void _ZN7ee11561D1Ev();
Name_Map name_map_ee11561[] = {
  NSPAIR(_ZN7ee11561C1Ev),
  NSPAIR(_ZN7ee11561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee11561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11561[];
extern void _ZN5cc5613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee11561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11561[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11561[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee11561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee11561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee11561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee11561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee11561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee11561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee11561[] = {
  {&(_ZTV7ee11561[5]),  5,20},
  {&(_ZTV7ee11561[9]),  9,20},
  {&(_ZTV7ee11561[13]),  13,20},
  {&(_ZTV7ee11561[18]),  18,20},
  {&(_tg__ZTV6dd1561__7ee11561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee11561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee11561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee11561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee11561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11561[];
extern  VTBL_ENTRY _ZTV7ee11561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11561[];
static VTBL_ENTRY alt_thunk_names752[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11561 = {  "ee11561", // class name
  bases_ee11561, 4,
  &(vtc_ee11561[0]), // expected_vtbl_contents
  &(vtt_ee11561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11561),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names752,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21561  : dd1561 {
  int e;
  virtual void  foo(); // _ZN7ee215613fooEv
  ~ee21561(); // tgen
  ee21561(); // tgen
};
//SIG(1 ee21561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee21561 ::foo(){vfunc_called(this, "_ZN7ee215613fooEv");}
ee21561 ::~ee21561(){ note_dtor("ee21561", this);} // tgen
ee21561 ::ee21561(){ note_ctor("ee21561", this);} // tgen

static void Test_ee21561()
{
  extern Class_Descriptor cd_ee21561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21561, buf);
    ee21561 *dp, &lv = *(dp=new (buf) ee21561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee21561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee21561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(16,12), "ee21561");
    check_base_class_offset(lv, (dd1561*), 0, "ee21561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21561.e");
    test_class_info(&lv, &cd_ee21561);
    dp->~ee21561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21561(Test_ee21561, "ee21561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21561C1Ev();
extern void _ZN7ee21561D1Ev();
Name_Map name_map_ee21561[] = {
  NSPAIR(_ZN7ee21561C1Ev),
  NSPAIR(_ZN7ee21561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee21561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21561[];
extern void _ZN7ee215613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee215613fooEv,_ZTv0_n12_N7ee215613fooEv)();
extern void ABISELECT(_ZThn32_N7ee215613fooEv,_ZThn20_N7ee215613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21561[0]),
  (VTBL_ENTRY)&_ZN7ee215613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee215613fooEv,_ZTv0_n12_N7ee215613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee21561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee21561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee21561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee21561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee21561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee21561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee21561[] = {
  {&(_ZTV7ee21561[4]),  4,16},
  {&(_tg__ZTV6dd1561__7ee21561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee21561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee21561[4]),  4,6},
  {&(_ZTV7ee21561[9]),  9,16},
  {&(_ZTV7ee21561[14]),  14,16},
  {&(_tg__ZTV5cc561__7ee21561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee21561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21561[];
extern  VTBL_ENTRY _ZTV7ee21561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21561[];
static VTBL_ENTRY alt_thunk_names753[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee215613fooEv,_ZTv0_n12_N7ee215613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee215613fooEv,_ZThn20_N7ee215613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21561 = {  "ee21561", // class name
  bases_ee21561, 4,
  &(vtc_ee21561[0]), // expected_vtbl_contents
  &(vtt_ee21561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names753,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31561  : virtual dd1561 {
  int e;
  virtual void  foo(); // _ZN7ee315613fooEv
  ~ee31561(); // tgen
  ee31561(); // tgen
};
//SIG(1 ee31561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee31561 ::foo(){vfunc_called(this, "_ZN7ee315613fooEv");}
ee31561 ::~ee31561(){ note_dtor("ee31561", this);} // tgen
ee31561 ::ee31561(){ note_ctor("ee31561", this);} // tgen

static void Test_ee31561()
{
  extern Class_Descriptor cd_ee31561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31561, buf);
    ee31561 *dp, &lv = *(dp=new (buf) ee31561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee31561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee31561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(32,16), "ee31561");
    check_base_class_offset(lv, (dd1561*), ABISELECT(16,8), "ee31561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31561.e");
    test_class_info(&lv, &cd_ee31561);
    dp->~ee31561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31561(Test_ee31561, "ee31561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31561C1Ev();
extern void _ZN7ee31561D1Ev();
Name_Map name_map_ee31561[] = {
  NSPAIR(_ZN7ee31561C1Ev),
  NSPAIR(_ZN7ee31561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee31561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31561[];
extern void _ZN7ee315613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee315613fooEv,_ZTv0_n12_N7ee315613fooEv)();
extern void ABISELECT(_ZThn48_N7ee315613fooEv,_ZThn24_N7ee315613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31561[0]),
  (VTBL_ENTRY)&_ZN7ee315613fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31561[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee315613fooEv,_ZTv0_n12_N7ee315613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee31561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee31561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee31561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee31561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee31561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee31561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee31561[] = {
  {&(_ZTV7ee31561[5]),  5,21},
  {&(_ZTV7ee31561[10]),  10,21},
  {&(_ZTV7ee31561[14]),  14,21},
  {&(_ZTV7ee31561[19]),  19,21},
  {&(_tg__ZTV6dd1561__7ee31561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee31561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee31561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee31561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee31561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31561[];
extern  VTBL_ENTRY _ZTV7ee31561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31561[];
static VTBL_ENTRY alt_thunk_names754[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee315613fooEv,_ZTv0_n12_N7ee315613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee315613fooEv,_ZThn24_N7ee315613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31561 = {  "ee31561", // class name
  bases_ee31561, 4,
  &(vtc_ee31561[0]), // expected_vtbl_contents
  &(vtt_ee31561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31561),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names754,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41561  : dd1561 {
  int e;
  virtual void  bar(); // _ZN7ee415613barEv
  ~ee41561(); // tgen
  ee41561(); // tgen
};
//SIG(1 ee41561) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee41561 ::bar(){vfunc_called(this, "_ZN7ee415613barEv");}
ee41561 ::~ee41561(){ note_dtor("ee41561", this);} // tgen
ee41561 ::ee41561(){ note_ctor("ee41561", this);} // tgen

static void Test_ee41561()
{
  extern Class_Descriptor cd_ee41561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41561, buf);
    ee41561 *dp, &lv = *(dp=new (buf) ee41561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee41561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee41561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(16,12), "ee41561");
    check_base_class_offset(lv, (dd1561*), 0, "ee41561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41561.e");
    test_class_info(&lv, &cd_ee41561);
    dp->~ee41561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41561(Test_ee41561, "ee41561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41561C1Ev();
extern void _ZN7ee41561D1Ev();
Name_Map name_map_ee41561[] = {
  NSPAIR(_ZN7ee41561C1Ev),
  NSPAIR(_ZN7ee41561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee41561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41561[];
extern void _ZN7ee415613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee415613barEv,_ZTv0_n16_N7ee415613barEv)();
extern void ABISELECT(_ZThn16_N7ee415613barEv,_ZThn12_N7ee415613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee415613barEv,_ZTv0_n16_N7ee415613barEv)();
extern void ABISELECT(_ZThn32_N7ee415613barEv,_ZThn20_N7ee415613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41561[0]),
  (VTBL_ENTRY)&_ZN7ee415613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee415613barEv,_ZTv0_n16_N7ee415613barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee415613barEv,_ZTv0_n16_N7ee415613barEv),
};
extern VTBL_ENTRY _ZTV7ee41561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee41561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee41561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee41561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee41561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee41561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee41561[] = {
  {&(_ZTV7ee41561[4]),  4,16},
  {&(_tg__ZTV6dd1561__7ee41561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee41561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee41561[4]),  4,6},
  {&(_ZTV7ee41561[9]),  9,16},
  {&(_ZTV7ee41561[14]),  14,16},
  {&(_tg__ZTV5cc561__7ee41561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee41561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41561[];
extern  VTBL_ENTRY _ZTV7ee41561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41561[];
static VTBL_ENTRY alt_thunk_names755[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee415613barEv,_ZTv0_n16_N7ee415613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee415613barEv,_ZThn20_N7ee415613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee415613barEv,_ZThn12_N7ee415613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41561 = {  "ee41561", // class name
  bases_ee41561, 4,
  &(vtc_ee41561[0]), // expected_vtbl_contents
  &(vtt_ee41561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names755,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51561  : virtual dd1561 {
  int e;
  virtual void  bar(); // _ZN7ee515613barEv
  ~ee51561(); // tgen
  ee51561(); // tgen
};
//SIG(1 ee51561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee51561 ::bar(){vfunc_called(this, "_ZN7ee515613barEv");}
ee51561 ::~ee51561(){ note_dtor("ee51561", this);} // tgen
ee51561 ::ee51561(){ note_ctor("ee51561", this);} // tgen

static void Test_ee51561()
{
  extern Class_Descriptor cd_ee51561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51561, buf);
    ee51561 *dp, &lv = *(dp=new (buf) ee51561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee51561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee51561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(32,16), "ee51561");
    check_base_class_offset(lv, (dd1561*), ABISELECT(16,8), "ee51561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51561.e");
    test_class_info(&lv, &cd_ee51561);
    dp->~ee51561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51561(Test_ee51561, "ee51561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51561C1Ev();
extern void _ZN7ee51561D1Ev();
Name_Map name_map_ee51561[] = {
  NSPAIR(_ZN7ee51561C1Ev),
  NSPAIR(_ZN7ee51561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee51561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51561[];
extern void _ZN7ee515613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee515613barEv,_ZTv0_n16_N7ee515613barEv)();
extern void ABISELECT(_ZThn32_N7ee515613barEv,_ZThn16_N7ee515613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee515613barEv,_ZTv0_n16_N7ee515613barEv)();
extern void ABISELECT(_ZThn48_N7ee515613barEv,_ZThn24_N7ee515613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51561[0]),
  (VTBL_ENTRY)&_ZN7ee515613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51561[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee515613barEv,_ZTv0_n16_N7ee515613barEv),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee515613barEv,_ZTv0_n16_N7ee515613barEv),
};
extern VTBL_ENTRY _ZTV7ee51561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee51561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee51561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee51561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee51561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee51561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee51561[] = {
  {&(_ZTV7ee51561[5]),  5,21},
  {&(_ZTV7ee51561[10]),  10,21},
  {&(_ZTV7ee51561[14]),  14,21},
  {&(_ZTV7ee51561[19]),  19,21},
  {&(_tg__ZTV6dd1561__7ee51561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee51561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee51561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee51561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee51561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51561[];
extern  VTBL_ENTRY _ZTV7ee51561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51561[];
static VTBL_ENTRY alt_thunk_names756[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee515613barEv,_ZTv0_n16_N7ee515613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee515613barEv,_ZThn24_N7ee515613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee515613barEv,_ZThn16_N7ee515613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51561 = {  "ee51561", // class name
  bases_ee51561, 4,
  &(vtc_ee51561[0]), // expected_vtbl_contents
  &(vtt_ee51561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51561),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names756,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61561  : dd1561 {
  int e;
  virtual void  foo(); // _ZN7ee615613fooEv
  virtual void  bar(); // _ZN7ee615613barEv
  ~ee61561(); // tgen
  ee61561(); // tgen
};
//SIG(1 ee61561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee61561 ::foo(){vfunc_called(this, "_ZN7ee615613fooEv");}
void  ee61561 ::bar(){vfunc_called(this, "_ZN7ee615613barEv");}
ee61561 ::~ee61561(){ note_dtor("ee61561", this);} // tgen
ee61561 ::ee61561(){ note_ctor("ee61561", this);} // tgen

static void Test_ee61561()
{
  extern Class_Descriptor cd_ee61561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61561, buf);
    ee61561 *dp, &lv = *(dp=new (buf) ee61561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee61561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee61561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(16,12), "ee61561");
    check_base_class_offset(lv, (dd1561*), 0, "ee61561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61561.e");
    test_class_info(&lv, &cd_ee61561);
    dp->~ee61561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61561(Test_ee61561, "ee61561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61561C1Ev();
extern void _ZN7ee61561D1Ev();
Name_Map name_map_ee61561[] = {
  NSPAIR(_ZN7ee61561C1Ev),
  NSPAIR(_ZN7ee61561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee61561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61561[];
extern void _ZN7ee615613fooEv();
extern void _ZN7ee615613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee615613barEv,_ZTv0_n16_N7ee615613barEv)();
extern void ABISELECT(_ZThn16_N7ee615613barEv,_ZThn12_N7ee615613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee615613fooEv,_ZTv0_n12_N7ee615613fooEv)();
extern void ABISELECT(_ZThn32_N7ee615613fooEv,_ZThn20_N7ee615613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee615613barEv,_ZTv0_n16_N7ee615613barEv)();
extern void ABISELECT(_ZThn32_N7ee615613barEv,_ZThn20_N7ee615613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61561[0]),
  (VTBL_ENTRY)&_ZN7ee615613fooEv,
  (VTBL_ENTRY)&_ZN7ee615613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee615613barEv,_ZTv0_n16_N7ee615613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee615613fooEv,_ZTv0_n12_N7ee615613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee615613barEv,_ZTv0_n16_N7ee615613barEv),
};
extern VTBL_ENTRY _ZTV7ee61561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee61561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee61561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee61561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee61561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee61561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee61561[] = {
  {&(_ZTV7ee61561[4]),  4,17},
  {&(_tg__ZTV6dd1561__7ee61561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee61561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee61561[4]),  4,6},
  {&(_ZTV7ee61561[10]),  10,17},
  {&(_ZTV7ee61561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee61561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee61561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61561[];
extern  VTBL_ENTRY _ZTV7ee61561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61561[];
static VTBL_ENTRY alt_thunk_names757[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee615613fooEv,_ZTv0_n12_N7ee615613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee615613fooEv,_ZThn20_N7ee615613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee615613barEv,_ZTv0_n16_N7ee615613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee615613barEv,_ZThn20_N7ee615613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee615613barEv,_ZThn12_N7ee615613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61561 = {  "ee61561", // class name
  bases_ee61561, 4,
  &(vtc_ee61561[0]), // expected_vtbl_contents
  &(vtt_ee61561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names757,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71561  : virtual dd1561 {
  int e;
  virtual void  foo(); // _ZN7ee715613fooEv
  virtual void  bar(); // _ZN7ee715613barEv
  ~ee71561(); // tgen
  ee71561(); // tgen
};
//SIG(1 ee71561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee71561 ::foo(){vfunc_called(this, "_ZN7ee715613fooEv");}
void  ee71561 ::bar(){vfunc_called(this, "_ZN7ee715613barEv");}
ee71561 ::~ee71561(){ note_dtor("ee71561", this);} // tgen
ee71561 ::ee71561(){ note_ctor("ee71561", this);} // tgen

static void Test_ee71561()
{
  extern Class_Descriptor cd_ee71561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71561, buf);
    ee71561 *dp, &lv = *(dp=new (buf) ee71561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee71561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee71561");
    check_base_class_offset(lv, (cc561*)(dd1561*), ABISELECT(32,16), "ee71561");
    check_base_class_offset(lv, (dd1561*), ABISELECT(16,8), "ee71561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71561.e");
    test_class_info(&lv, &cd_ee71561);
    dp->~ee71561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71561(Test_ee71561, "ee71561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71561C1Ev();
extern void _ZN7ee71561D1Ev();
Name_Map name_map_ee71561[] = {
  NSPAIR(_ZN7ee71561C1Ev),
  NSPAIR(_ZN7ee71561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd1561;
extern VTBL_ENTRY _ZTI6dd1561[];
extern  VTBL_ENTRY _ZTV6dd1561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1561[];
static Base_Class bases_ee71561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1561,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71561[];
extern void _ZN7ee715613fooEv();
extern void _ZN7ee715613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee715613barEv,_ZTv0_n16_N7ee715613barEv)();
extern void ABISELECT(_ZThn32_N7ee715613barEv,_ZThn16_N7ee715613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee715613fooEv,_ZTv0_n12_N7ee715613fooEv)();
extern void ABISELECT(_ZThn48_N7ee715613fooEv,_ZThn24_N7ee715613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee715613barEv,_ZTv0_n16_N7ee715613barEv)();
extern void ABISELECT(_ZThn48_N7ee715613barEv,_ZThn24_N7ee715613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71561[0]),
  (VTBL_ENTRY)&_ZN7ee715613fooEv,
  (VTBL_ENTRY)&_ZN7ee715613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71561[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee715613barEv,_ZTv0_n16_N7ee715613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee715613fooEv,_ZTv0_n12_N7ee715613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee715613barEv,_ZTv0_n16_N7ee715613barEv),
};
extern VTBL_ENTRY _ZTV7ee71561[];
static  VTBL_ENTRY _tg__ZTV6dd1561__7ee71561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd1561__7ee71561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1561__7ee71561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee71561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee71561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee71561[] = {
  {&(_ZTV7ee71561[5]),  5,22},
  {&(_ZTV7ee71561[11]),  11,22},
  {&(_ZTV7ee71561[15]),  15,22},
  {&(_ZTV7ee71561[20]),  20,22},
  {&(_tg__ZTV6dd1561__7ee71561[4]),  4,4},
  {&(_tg__ZTV5cc561__6dd1561__7ee71561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd1561__7ee71561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee71561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee71561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71561[];
extern  VTBL_ENTRY _ZTV7ee71561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71561[];
static VTBL_ENTRY alt_thunk_names758[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee715613fooEv,_ZTv0_n12_N7ee715613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee715613fooEv,_ZThn24_N7ee715613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee715613barEv,_ZTv0_n16_N7ee715613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee715613barEv,_ZThn24_N7ee715613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee715613barEv,_ZThn16_N7ee715613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71561 = {  "ee71561", // class name
  bases_ee71561, 4,
  &(vtc_ee71561[0]), // expected_vtbl_contents
  &(vtt_ee71561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71561),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names758,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2561  : cc561 {
  int d;
  virtual void  foo(); // _ZN6dd25613fooEv
  ~dd2561(); // tgen
  dd2561(); // tgen
};
//SIG(-1 dd2561) C1{ BC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd2561 ::foo(){vfunc_called(this, "_ZN6dd25613fooEv");}
dd2561 ::~dd2561(){ note_dtor("dd2561", this);} // tgen
dd2561 ::dd2561(){ note_ctor("dd2561", this);} // tgen

static void Test_dd2561()
{
  extern Class_Descriptor cd_dd2561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2561, buf);
    dd2561 *dp, &lv = *(dp=new (buf) dd2561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd2561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(16,12), "dd2561");
    check_base_class_offset(lv, (cc561*), 0, "dd2561");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2561.d");
    test_class_info(&lv, &cd_dd2561);
    dp->~dd2561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2561(Test_dd2561, "dd2561", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2561C1Ev();
extern void _ZN6dd2561D1Ev();
Name_Map name_map_dd2561[] = {
  NSPAIR(_ZN6dd2561C1Ev),
  NSPAIR(_ZN6dd2561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd2561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV6dd2561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd2561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd2561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd2561[] = {
  {&(_ZTV6dd2561[3]),  3,11},
  {&(_tg__ZTV5cc561__6dd2561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd2561[4]),  4,6},
  {&(_ZTV6dd2561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static VTBL_ENTRY alt_thunk_names759[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2561 = {  "dd2561", // class name
  bases_dd2561, 3,
  &(vtc_dd2561[0]), // expected_vtbl_contents
  &(vtt_dd2561[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2561),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names759,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02561  : dd2561 {
  int e;
  ~ee02561(); // tgen
  ee02561(); // tgen
};
//SIG(1 ee02561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee02561 ::~ee02561(){ note_dtor("ee02561", this);} // tgen
ee02561 ::ee02561(){ note_ctor("ee02561", this);} // tgen

static void Test_ee02561()
{
  extern Class_Descriptor cd_ee02561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02561, buf);
    ee02561 *dp, &lv = *(dp=new (buf) ee02561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee02561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(24,16), "ee02561");
    check_base_class_offset(lv, (cc561*)(dd2561*), 0, "ee02561");
    check_base_class_offset(lv, (dd2561*), 0, "ee02561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02561.e");
    test_class_info(&lv, &cd_ee02561);
    dp->~ee02561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02561(Test_ee02561, "ee02561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02561C1Ev();
extern void _ZN7ee02561D1Ev();
Name_Map name_map_ee02561[] = {
  NSPAIR(_ZN7ee02561C1Ev),
  NSPAIR(_ZN7ee02561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee02561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee02561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee02561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee02561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee02561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee02561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee02561[] = {
  {&(_ZTV7ee02561[3]),  3,11},
  {&(_tg__ZTV6dd2561__7ee02561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee02561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee02561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee02561[4]),  4,6},
  {&(_ZTV7ee02561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee02561[];
extern  VTBL_ENTRY _ZTV7ee02561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02561[];
static VTBL_ENTRY alt_thunk_names760[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02561 = {  "ee02561", // class name
  bases_ee02561, 4,
  &(vtc_ee02561[0]), // expected_vtbl_contents
  &(vtt_ee02561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02561),6, //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  ee12561  : virtual dd2561 {
  int e;
  ~ee12561(); // tgen
  ee12561(); // tgen
};
//SIG(1 ee12561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee12561 ::~ee12561(){ note_dtor("ee12561", this);} // tgen
ee12561 ::ee12561(){ note_ctor("ee12561", this);} // tgen

static void Test_ee12561()
{
  extern Class_Descriptor cd_ee12561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12561, buf);
    ee12561 *dp, &lv = *(dp=new (buf) ee12561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee12561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(32,20), "ee12561");
    check_base_class_offset(lv, (cc561*)(dd2561*), ABISELECT(16,8), "ee12561");
    check_base_class_offset(lv, (dd2561*), ABISELECT(16,8), "ee12561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12561.e");
    test_class_info(&lv, &cd_ee12561);
    dp->~ee12561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12561(Test_ee12561, "ee12561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12561C1Ev();
extern void _ZN7ee12561D1Ev();
Name_Map name_map_ee12561[] = {
  NSPAIR(_ZN7ee12561C1Ev),
  NSPAIR(_ZN7ee12561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee12561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12561[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee12561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee12561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee12561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee12561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee12561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee12561[] = {
  {&(_ZTV7ee12561[4]),  4,17},
  {&(_ZTV7ee12561[9]),  9,17},
  {&(_ZTV7ee12561[15]),  15,17},
  {&(_tg__ZTV6dd2561__7ee12561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee12561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee12561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee12561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12561[];
extern  VTBL_ENTRY _ZTV7ee12561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12561[];
static VTBL_ENTRY alt_thunk_names761[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12561 = {  "ee12561", // class name
  bases_ee12561, 4,
  &(vtc_ee12561[0]), // expected_vtbl_contents
  &(vtt_ee12561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12561),7, //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  ee22561  : dd2561 {
  int e;
  virtual void  foo(); // _ZN7ee225613fooEv
  ~ee22561(); // tgen
  ee22561(); // tgen
};
//SIG(1 ee22561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee22561 ::foo(){vfunc_called(this, "_ZN7ee225613fooEv");}
ee22561 ::~ee22561(){ note_dtor("ee22561", this);} // tgen
ee22561 ::ee22561(){ note_ctor("ee22561", this);} // tgen

static void Test_ee22561()
{
  extern Class_Descriptor cd_ee22561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22561, buf);
    ee22561 *dp, &lv = *(dp=new (buf) ee22561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee22561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(24,16), "ee22561");
    check_base_class_offset(lv, (cc561*)(dd2561*), 0, "ee22561");
    check_base_class_offset(lv, (dd2561*), 0, "ee22561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22561.e");
    test_class_info(&lv, &cd_ee22561);
    dp->~ee22561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22561(Test_ee22561, "ee22561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22561C1Ev();
extern void _ZN7ee22561D1Ev();
Name_Map name_map_ee22561[] = {
  NSPAIR(_ZN7ee22561C1Ev),
  NSPAIR(_ZN7ee22561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee22561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22561[];
extern void _ZN5cc5613barEv();
extern void _ZN7ee225613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee225613fooEv,_ZTv0_n12_N7ee225613fooEv)();
extern void ABISELECT(_ZThn24_N7ee225613fooEv,_ZThn16_N7ee225613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN7ee225613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee225613fooEv,_ZTv0_n12_N7ee225613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee22561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee22561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee22561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee22561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee22561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee22561[] = {
  {&(_ZTV7ee22561[3]),  3,11},
  {&(_tg__ZTV6dd2561__7ee22561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee22561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee22561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee22561[4]),  4,6},
  {&(_ZTV7ee22561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee22561[];
extern  VTBL_ENTRY _ZTV7ee22561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22561[];
static VTBL_ENTRY alt_thunk_names762[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee225613fooEv,_ZTv0_n12_N7ee225613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee225613fooEv,_ZThn16_N7ee225613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22561 = {  "ee22561", // class name
  bases_ee22561, 4,
  &(vtc_ee22561[0]), // expected_vtbl_contents
  &(vtt_ee22561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22561),6, //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  ee32561  : virtual dd2561 {
  int e;
  virtual void  foo(); // _ZN7ee325613fooEv
  ~ee32561(); // tgen
  ee32561(); // tgen
};
//SIG(1 ee32561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee32561 ::foo(){vfunc_called(this, "_ZN7ee325613fooEv");}
ee32561 ::~ee32561(){ note_dtor("ee32561", this);} // tgen
ee32561 ::ee32561(){ note_ctor("ee32561", this);} // tgen

static void Test_ee32561()
{
  extern Class_Descriptor cd_ee32561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32561, buf);
    ee32561 *dp, &lv = *(dp=new (buf) ee32561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee32561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(32,20), "ee32561");
    check_base_class_offset(lv, (cc561*)(dd2561*), ABISELECT(16,8), "ee32561");
    check_base_class_offset(lv, (dd2561*), ABISELECT(16,8), "ee32561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32561.e");
    test_class_info(&lv, &cd_ee32561);
    dp->~ee32561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32561(Test_ee32561, "ee32561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32561C1Ev();
extern void _ZN7ee32561D1Ev();
Name_Map name_map_ee32561[] = {
  NSPAIR(_ZN7ee32561C1Ev),
  NSPAIR(_ZN7ee32561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee32561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32561[];
extern void _ZN7ee325613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee325613fooEv,_ZTv0_n20_N7ee325613fooEv)();
extern void ABISELECT(_ZThn16_N7ee325613fooEv,_ZThn8_N7ee325613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee325613fooEv,_ZTv0_n12_N7ee325613fooEv)();
extern void ABISELECT(_ZThn32_N7ee325613fooEv,_ZThn20_N7ee325613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32561[0]),
  (VTBL_ENTRY)&_ZN7ee325613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee325613fooEv,_ZTv0_n20_N7ee325613fooEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee325613fooEv,_ZTv0_n12_N7ee325613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee32561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee32561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee32561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee32561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee32561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee32561[] = {
  {&(_ZTV7ee32561[4]),  4,18},
  {&(_ZTV7ee32561[10]),  10,18},
  {&(_ZTV7ee32561[16]),  16,18},
  {&(_tg__ZTV6dd2561__7ee32561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee32561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee32561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee32561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32561[];
extern  VTBL_ENTRY _ZTV7ee32561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32561[];
static VTBL_ENTRY alt_thunk_names763[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee325613fooEv,_ZTv0_n12_N7ee325613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee325613fooEv,_ZThn20_N7ee325613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee325613fooEv,_ZTv0_n20_N7ee325613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee325613fooEv,_ZThn8_N7ee325613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32561 = {  "ee32561", // class name
  bases_ee32561, 4,
  &(vtc_ee32561[0]), // expected_vtbl_contents
  &(vtt_ee32561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32561),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names763,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42561  : dd2561 {
  int e;
  virtual void  bar(); // _ZN7ee425613barEv
  ~ee42561(); // tgen
  ee42561(); // tgen
};
//SIG(1 ee42561) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee42561 ::bar(){vfunc_called(this, "_ZN7ee425613barEv");}
ee42561 ::~ee42561(){ note_dtor("ee42561", this);} // tgen
ee42561 ::ee42561(){ note_ctor("ee42561", this);} // tgen

static void Test_ee42561()
{
  extern Class_Descriptor cd_ee42561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42561, buf);
    ee42561 *dp, &lv = *(dp=new (buf) ee42561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee42561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(24,16), "ee42561");
    check_base_class_offset(lv, (cc561*)(dd2561*), 0, "ee42561");
    check_base_class_offset(lv, (dd2561*), 0, "ee42561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42561.e");
    test_class_info(&lv, &cd_ee42561);
    dp->~ee42561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42561(Test_ee42561, "ee42561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42561C1Ev();
extern void _ZN7ee42561D1Ev();
Name_Map name_map_ee42561[] = {
  NSPAIR(_ZN7ee42561C1Ev),
  NSPAIR(_ZN7ee42561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee42561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42561[];
extern void _ZN7ee425613barEv();
extern void _ZN6dd25613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee425613barEv,_ZTv0_n16_N7ee425613barEv)();
extern void ABISELECT(_ZThn24_N7ee425613barEv,_ZThn16_N7ee425613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42561[0]),
  (VTBL_ENTRY)&_ZN7ee425613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee425613barEv,_ZTv0_n16_N7ee425613barEv),
};
extern VTBL_ENTRY _ZTV7ee42561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee42561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee42561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee42561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee42561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee42561[] = {
  {&(_ZTV7ee42561[3]),  3,11},
  {&(_tg__ZTV6dd2561__7ee42561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee42561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee42561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee42561[4]),  4,6},
  {&(_ZTV7ee42561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42561[];
extern  VTBL_ENTRY _ZTV7ee42561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42561[];
static VTBL_ENTRY alt_thunk_names764[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee425613barEv,_ZTv0_n16_N7ee425613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee425613barEv,_ZThn16_N7ee425613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42561 = {  "ee42561", // class name
  bases_ee42561, 4,
  &(vtc_ee42561[0]), // expected_vtbl_contents
  &(vtt_ee42561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names764,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52561  : virtual dd2561 {
  int e;
  virtual void  bar(); // _ZN7ee525613barEv
  ~ee52561(); // tgen
  ee52561(); // tgen
};
//SIG(1 ee52561) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee52561 ::bar(){vfunc_called(this, "_ZN7ee525613barEv");}
ee52561 ::~ee52561(){ note_dtor("ee52561", this);} // tgen
ee52561 ::ee52561(){ note_ctor("ee52561", this);} // tgen

static void Test_ee52561()
{
  extern Class_Descriptor cd_ee52561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52561, buf);
    ee52561 *dp, &lv = *(dp=new (buf) ee52561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee52561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(32,20), "ee52561");
    check_base_class_offset(lv, (cc561*)(dd2561*), ABISELECT(16,8), "ee52561");
    check_base_class_offset(lv, (dd2561*), ABISELECT(16,8), "ee52561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52561.e");
    test_class_info(&lv, &cd_ee52561);
    dp->~ee52561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52561(Test_ee52561, "ee52561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52561C1Ev();
extern void _ZN7ee52561D1Ev();
Name_Map name_map_ee52561[] = {
  NSPAIR(_ZN7ee52561C1Ev),
  NSPAIR(_ZN7ee52561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee52561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52561[];
extern void _ZN7ee525613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee525613barEv,_ZTv0_n16_N7ee525613barEv)();
extern void ABISELECT(_ZThn16_N7ee525613barEv,_ZThn8_N7ee525613barEv)() __attribute__((weak));
extern void _ZN6dd25613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee525613barEv,_ZTv0_n16_N7ee525613barEv)();
extern void ABISELECT(_ZThn32_N7ee525613barEv,_ZThn20_N7ee525613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52561[0]),
  (VTBL_ENTRY)&_ZN7ee525613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee525613barEv,_ZTv0_n16_N7ee525613barEv),
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee525613barEv,_ZTv0_n16_N7ee525613barEv),
};
extern VTBL_ENTRY _ZTV7ee52561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee52561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee52561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee52561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee52561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee52561[] = {
  {&(_ZTV7ee52561[4]),  4,18},
  {&(_ZTV7ee52561[10]),  10,18},
  {&(_ZTV7ee52561[16]),  16,18},
  {&(_tg__ZTV6dd2561__7ee52561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee52561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee52561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee52561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52561[];
extern  VTBL_ENTRY _ZTV7ee52561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52561[];
static VTBL_ENTRY alt_thunk_names765[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee525613barEv,_ZTv0_n16_N7ee525613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee525613barEv,_ZThn20_N7ee525613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee525613barEv,_ZThn8_N7ee525613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52561 = {  "ee52561", // class name
  bases_ee52561, 4,
  &(vtc_ee52561[0]), // expected_vtbl_contents
  &(vtt_ee52561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52561),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names765,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62561  : dd2561 {
  int e;
  virtual void  foo(); // _ZN7ee625613fooEv
  virtual void  bar(); // _ZN7ee625613barEv
  ~ee62561(); // tgen
  ee62561(); // tgen
};
//SIG(1 ee62561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62561 ::foo(){vfunc_called(this, "_ZN7ee625613fooEv");}
void  ee62561 ::bar(){vfunc_called(this, "_ZN7ee625613barEv");}
ee62561 ::~ee62561(){ note_dtor("ee62561", this);} // tgen
ee62561 ::ee62561(){ note_ctor("ee62561", this);} // tgen

static void Test_ee62561()
{
  extern Class_Descriptor cd_ee62561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62561, buf);
    ee62561 *dp, &lv = *(dp=new (buf) ee62561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee62561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(24,16), "ee62561");
    check_base_class_offset(lv, (cc561*)(dd2561*), 0, "ee62561");
    check_base_class_offset(lv, (dd2561*), 0, "ee62561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62561.e");
    test_class_info(&lv, &cd_ee62561);
    dp->~ee62561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62561(Test_ee62561, "ee62561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62561C1Ev();
extern void _ZN7ee62561D1Ev();
Name_Map name_map_ee62561[] = {
  NSPAIR(_ZN7ee62561C1Ev),
  NSPAIR(_ZN7ee62561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee62561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62561[];
extern void _ZN7ee625613barEv();
extern void _ZN7ee625613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee625613fooEv,_ZTv0_n12_N7ee625613fooEv)();
extern void ABISELECT(_ZThn24_N7ee625613fooEv,_ZThn16_N7ee625613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee625613barEv,_ZTv0_n16_N7ee625613barEv)();
extern void ABISELECT(_ZThn24_N7ee625613barEv,_ZThn16_N7ee625613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62561[0]),
  (VTBL_ENTRY)&_ZN7ee625613barEv,
  (VTBL_ENTRY)&_ZN7ee625613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee625613fooEv,_ZTv0_n12_N7ee625613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee625613barEv,_ZTv0_n16_N7ee625613barEv),
};
extern VTBL_ENTRY _ZTV7ee62561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee62561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee62561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee62561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee62561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee62561[] = {
  {&(_ZTV7ee62561[3]),  3,11},
  {&(_tg__ZTV6dd2561__7ee62561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee62561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee62561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee62561[4]),  4,6},
  {&(_ZTV7ee62561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62561[];
extern  VTBL_ENTRY _ZTV7ee62561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62561[];
static VTBL_ENTRY alt_thunk_names766[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25613fooEv,_ZThn16_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee625613barEv,_ZTv0_n16_N7ee625613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee625613barEv,_ZThn16_N7ee625613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee625613fooEv,_ZTv0_n12_N7ee625613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee625613fooEv,_ZThn16_N7ee625613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62561 = {  "ee62561", // class name
  bases_ee62561, 4,
  &(vtc_ee62561[0]), // expected_vtbl_contents
  &(vtt_ee62561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names766,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72561  : virtual dd2561 {
  int e;
  virtual void  foo(); // _ZN7ee725613fooEv
  virtual void  bar(); // _ZN7ee725613barEv
  ~ee72561(); // tgen
  ee72561(); // tgen
};
//SIG(1 ee72561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72561 ::foo(){vfunc_called(this, "_ZN7ee725613fooEv");}
void  ee72561 ::bar(){vfunc_called(this, "_ZN7ee725613barEv");}
ee72561 ::~ee72561(){ note_dtor("ee72561", this);} // tgen
ee72561 ::ee72561(){ note_ctor("ee72561", this);} // tgen

static void Test_ee72561()
{
  extern Class_Descriptor cd_ee72561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72561, buf);
    ee72561 *dp, &lv = *(dp=new (buf) ee72561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee72561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd2561*), ABISELECT(32,20), "ee72561");
    check_base_class_offset(lv, (cc561*)(dd2561*), ABISELECT(16,8), "ee72561");
    check_base_class_offset(lv, (dd2561*), ABISELECT(16,8), "ee72561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72561.e");
    test_class_info(&lv, &cd_ee72561);
    dp->~ee72561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72561(Test_ee72561, "ee72561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72561C1Ev();
extern void _ZN7ee72561D1Ev();
Name_Map name_map_ee72561[] = {
  NSPAIR(_ZN7ee72561C1Ev),
  NSPAIR(_ZN7ee72561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd2561;
extern VTBL_ENTRY _ZTI6dd2561[];
extern  VTBL_ENTRY _ZTV6dd2561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2561[];
static Base_Class bases_ee72561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72561[];
extern void _ZN7ee725613fooEv();
extern void _ZN7ee725613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee725613barEv,_ZTv0_n16_N7ee725613barEv)();
extern void ABISELECT(_ZThn16_N7ee725613barEv,_ZThn8_N7ee725613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee725613fooEv,_ZTv0_n20_N7ee725613fooEv)();
extern void ABISELECT(_ZThn16_N7ee725613fooEv,_ZThn8_N7ee725613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee725613fooEv,_ZTv0_n12_N7ee725613fooEv)();
extern void ABISELECT(_ZThn32_N7ee725613fooEv,_ZThn20_N7ee725613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee725613barEv,_ZTv0_n16_N7ee725613barEv)();
extern void ABISELECT(_ZThn32_N7ee725613barEv,_ZThn20_N7ee725613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72561[0]),
  (VTBL_ENTRY)&_ZN7ee725613fooEv,
  (VTBL_ENTRY)&_ZN7ee725613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee725613barEv,_ZTv0_n16_N7ee725613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee725613fooEv,_ZTv0_n20_N7ee725613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee725613fooEv,_ZTv0_n12_N7ee725613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee725613barEv,_ZTv0_n16_N7ee725613barEv),
};
extern VTBL_ENTRY _ZTV7ee72561[];
extern void _ZN5cc5613barEv();
extern void _ZN6dd25613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2561__7ee72561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  (VTBL_ENTRY)&_ZN6dd25613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd2561__7ee72561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd2561__7ee72561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv)();
extern void ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2561__7ee72561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee72561[] = {
  {&(_ZTV7ee72561[4]),  4,19},
  {&(_ZTV7ee72561[11]),  11,19},
  {&(_ZTV7ee72561[17]),  17,19},
  {&(_tg__ZTV6dd2561__7ee72561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd2561__7ee72561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd2561__7ee72561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2561__7ee72561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72561[];
extern  VTBL_ENTRY _ZTV7ee72561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72561[];
static VTBL_ENTRY alt_thunk_names767[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25613fooEv,_ZTv0_n12_N6dd25613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25613fooEv,_ZThn12_N6dd25613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee725613fooEv,_ZTv0_n12_N7ee725613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee725613fooEv,_ZThn20_N7ee725613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee725613fooEv,_ZTv0_n20_N7ee725613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee725613fooEv,_ZThn8_N7ee725613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee725613barEv,_ZTv0_n16_N7ee725613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee725613barEv,_ZThn20_N7ee725613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee725613barEv,_ZThn8_N7ee725613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72561 = {  "ee72561", // class name
  bases_ee72561, 4,
  &(vtc_ee72561[0]), // expected_vtbl_contents
  &(vtt_ee72561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72561),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names767,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3561  : virtual cc561 {
  int d;
  virtual void  foo(); // _ZN6dd35613fooEv
  ~dd3561(); // tgen
  dd3561(); // tgen
};
//SIG(-1 dd3561) C1{ VBC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd3561 ::foo(){vfunc_called(this, "_ZN6dd35613fooEv");}
dd3561 ::~dd3561(){ note_dtor("dd3561", this);} // tgen
dd3561 ::dd3561(){ note_ctor("dd3561", this);} // tgen

static void Test_dd3561()
{
  extern Class_Descriptor cd_dd3561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3561, buf);
    dd3561 *dp, &lv = *(dp=new (buf) dd3561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd3561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,16), "dd3561");
    check_base_class_offset(lv, (cc561*), ABISELECT(16,8), "dd3561");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3561.d");
    test_class_info(&lv, &cd_dd3561);
    dp->~dd3561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3561(Test_dd3561, "dd3561", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3561C1Ev();
extern void _ZN6dd3561D1Ev();
Name_Map name_map_dd3561[] = {
  NSPAIR(_ZN6dd3561C1Ev),
  NSPAIR(_ZN6dd3561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd3561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc561,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3561[];
extern void _ZN6dd35613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV6dd3561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd3561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd3561[] = {
  {&(_ZTV6dd3561[4]),  4,16},
  {&(_ZTV6dd3561[9]),  9,16},
  {&(_ZTV6dd3561[14]),  14,16},
  {&(_tg__ZTV5cc561__6dd3561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd3561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static VTBL_ENTRY alt_thunk_names768[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3561 = {  "dd3561", // class name
  bases_dd3561, 3,
  &(vtc_dd3561[0]), // expected_vtbl_contents
  &(vtt_dd3561[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3561),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names768,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03561  : dd3561 {
  int e;
  ~ee03561(); // tgen
  ee03561(); // tgen
};
//SIG(1 ee03561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee03561 ::~ee03561(){ note_dtor("ee03561", this);} // tgen
ee03561 ::ee03561(){ note_ctor("ee03561", this);} // tgen

static void Test_ee03561()
{
  extern Class_Descriptor cd_ee03561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03561, buf);
    ee03561 *dp, &lv = *(dp=new (buf) ee03561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee03561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee03561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(16,12), "ee03561");
    check_base_class_offset(lv, (dd3561*), 0, "ee03561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03561.e");
    test_class_info(&lv, &cd_ee03561);
    dp->~ee03561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03561(Test_ee03561, "ee03561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03561C1Ev();
extern void _ZN7ee03561D1Ev();
Name_Map name_map_ee03561[] = {
  NSPAIR(_ZN7ee03561C1Ev),
  NSPAIR(_ZN7ee03561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee03561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03561[];
extern void _ZN6dd35613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee03561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee03561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee03561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee03561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee03561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee03561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee03561[] = {
  {&(_ZTV7ee03561[4]),  4,16},
  {&(_tg__ZTV6dd3561__7ee03561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee03561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee03561[4]),  4,6},
  {&(_ZTV7ee03561[9]),  9,16},
  {&(_ZTV7ee03561[14]),  14,16},
  {&(_tg__ZTV5cc561__7ee03561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee03561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03561[];
extern  VTBL_ENTRY _ZTV7ee03561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03561[];
static VTBL_ENTRY alt_thunk_names769[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03561 = {  "ee03561", // class name
  bases_ee03561, 4,
  &(vtc_ee03561[0]), // expected_vtbl_contents
  &(vtt_ee03561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names769,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13561  : virtual dd3561 {
  int e;
  ~ee13561(); // tgen
  ee13561(); // tgen
};
//SIG(1 ee13561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee13561 ::~ee13561(){ note_dtor("ee13561", this);} // tgen
ee13561 ::ee13561(){ note_ctor("ee13561", this);} // tgen

static void Test_ee13561()
{
  extern Class_Descriptor cd_ee13561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13561, buf);
    ee13561 *dp, &lv = *(dp=new (buf) ee13561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee13561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee13561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(32,16), "ee13561");
    check_base_class_offset(lv, (dd3561*), ABISELECT(16,8), "ee13561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13561.e");
    test_class_info(&lv, &cd_ee13561);
    dp->~ee13561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13561(Test_ee13561, "ee13561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13561C1Ev();
extern void _ZN7ee13561D1Ev();
Name_Map name_map_ee13561[] = {
  NSPAIR(_ZN7ee13561C1Ev),
  NSPAIR(_ZN7ee13561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee13561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13561[];
extern void _ZN6dd35613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13561[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee13561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee13561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee13561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee13561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee13561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee13561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee13561[] = {
  {&(_ZTV7ee13561[5]),  5,22},
  {&(_ZTV7ee13561[10]),  10,22},
  {&(_ZTV7ee13561[15]),  15,22},
  {&(_ZTV7ee13561[20]),  20,22},
  {&(_tg__ZTV6dd3561__7ee13561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee13561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee13561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee13561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee13561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13561[];
extern  VTBL_ENTRY _ZTV7ee13561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13561[];
static VTBL_ENTRY alt_thunk_names770[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13561 = {  "ee13561", // class name
  bases_ee13561, 4,
  &(vtc_ee13561[0]), // expected_vtbl_contents
  &(vtt_ee13561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13561),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names770,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23561  : dd3561 {
  int e;
  virtual void  foo(); // _ZN7ee235613fooEv
  ~ee23561(); // tgen
  ee23561(); // tgen
};
//SIG(1 ee23561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee23561 ::foo(){vfunc_called(this, "_ZN7ee235613fooEv");}
ee23561 ::~ee23561(){ note_dtor("ee23561", this);} // tgen
ee23561 ::ee23561(){ note_ctor("ee23561", this);} // tgen

static void Test_ee23561()
{
  extern Class_Descriptor cd_ee23561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23561, buf);
    ee23561 *dp, &lv = *(dp=new (buf) ee23561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee23561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee23561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(16,12), "ee23561");
    check_base_class_offset(lv, (dd3561*), 0, "ee23561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23561.e");
    test_class_info(&lv, &cd_ee23561);
    dp->~ee23561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23561(Test_ee23561, "ee23561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23561C1Ev();
extern void _ZN7ee23561D1Ev();
Name_Map name_map_ee23561[] = {
  NSPAIR(_ZN7ee23561C1Ev),
  NSPAIR(_ZN7ee23561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee23561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23561[];
extern void _ZN7ee235613fooEv();
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee235613fooEv,_ZTv0_n12_N7ee235613fooEv)();
extern void ABISELECT(_ZThn32_N7ee235613fooEv,_ZThn20_N7ee235613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23561[0]),
  (VTBL_ENTRY)&_ZN7ee235613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee235613fooEv,_ZTv0_n12_N7ee235613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee23561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee23561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee23561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee23561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee23561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee23561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee23561[] = {
  {&(_ZTV7ee23561[4]),  4,16},
  {&(_tg__ZTV6dd3561__7ee23561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee23561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee23561[4]),  4,6},
  {&(_ZTV7ee23561[9]),  9,16},
  {&(_ZTV7ee23561[14]),  14,16},
  {&(_tg__ZTV5cc561__7ee23561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee23561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23561[];
extern  VTBL_ENTRY _ZTV7ee23561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23561[];
static VTBL_ENTRY alt_thunk_names771[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee235613fooEv,_ZTv0_n12_N7ee235613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee235613fooEv,_ZThn20_N7ee235613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23561 = {  "ee23561", // class name
  bases_ee23561, 4,
  &(vtc_ee23561[0]), // expected_vtbl_contents
  &(vtt_ee23561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names771,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33561  : virtual dd3561 {
  int e;
  virtual void  foo(); // _ZN7ee335613fooEv
  ~ee33561(); // tgen
  ee33561(); // tgen
};
//SIG(1 ee33561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee33561 ::foo(){vfunc_called(this, "_ZN7ee335613fooEv");}
ee33561 ::~ee33561(){ note_dtor("ee33561", this);} // tgen
ee33561 ::ee33561(){ note_ctor("ee33561", this);} // tgen

static void Test_ee33561()
{
  extern Class_Descriptor cd_ee33561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33561, buf);
    ee33561 *dp, &lv = *(dp=new (buf) ee33561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee33561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee33561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(32,16), "ee33561");
    check_base_class_offset(lv, (dd3561*), ABISELECT(16,8), "ee33561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33561.e");
    test_class_info(&lv, &cd_ee33561);
    dp->~ee33561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33561(Test_ee33561, "ee33561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33561C1Ev();
extern void _ZN7ee33561D1Ev();
Name_Map name_map_ee33561[] = {
  NSPAIR(_ZN7ee33561C1Ev),
  NSPAIR(_ZN7ee33561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee33561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33561[];
extern void _ZN7ee335613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee335613fooEv,_ZTv0_n20_N7ee335613fooEv)();
extern void ABISELECT(_ZThn16_N7ee335613fooEv,_ZThn8_N7ee335613fooEv)() __attribute__((weak));
extern void _ZN5cc5613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee335613fooEv,_ZTv0_n12_N7ee335613fooEv)();
extern void ABISELECT(_ZThn48_N7ee335613fooEv,_ZThn24_N7ee335613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33561[0]),
  (VTBL_ENTRY)&_ZN7ee335613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee335613fooEv,_ZTv0_n20_N7ee335613fooEv),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee335613fooEv,_ZTv0_n12_N7ee335613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern VTBL_ENTRY _ZTV7ee33561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee33561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee33561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee33561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee33561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee33561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee33561[] = {
  {&(_ZTV7ee33561[5]),  5,23},
  {&(_ZTV7ee33561[11]),  11,23},
  {&(_ZTV7ee33561[16]),  16,23},
  {&(_ZTV7ee33561[21]),  21,23},
  {&(_tg__ZTV6dd3561__7ee33561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee33561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee33561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee33561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee33561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33561[];
extern  VTBL_ENTRY _ZTV7ee33561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33561[];
static VTBL_ENTRY alt_thunk_names772[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee335613fooEv,_ZTv0_n12_N7ee335613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee335613fooEv,_ZThn24_N7ee335613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee335613fooEv,_ZTv0_n20_N7ee335613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee335613fooEv,_ZThn8_N7ee335613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33561 = {  "ee33561", // class name
  bases_ee33561, 4,
  &(vtc_ee33561[0]), // expected_vtbl_contents
  &(vtt_ee33561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33561),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names772,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43561  : dd3561 {
  int e;
  virtual void  bar(); // _ZN7ee435613barEv
  ~ee43561(); // tgen
  ee43561(); // tgen
};
//SIG(1 ee43561) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee43561 ::bar(){vfunc_called(this, "_ZN7ee435613barEv");}
ee43561 ::~ee43561(){ note_dtor("ee43561", this);} // tgen
ee43561 ::ee43561(){ note_ctor("ee43561", this);} // tgen

static void Test_ee43561()
{
  extern Class_Descriptor cd_ee43561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43561, buf);
    ee43561 *dp, &lv = *(dp=new (buf) ee43561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee43561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee43561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(16,12), "ee43561");
    check_base_class_offset(lv, (dd3561*), 0, "ee43561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43561.e");
    test_class_info(&lv, &cd_ee43561);
    dp->~ee43561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43561(Test_ee43561, "ee43561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43561C1Ev();
extern void _ZN7ee43561D1Ev();
Name_Map name_map_ee43561[] = {
  NSPAIR(_ZN7ee43561C1Ev),
  NSPAIR(_ZN7ee43561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee43561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43561[];
extern void _ZN6dd35613fooEv();
extern void _ZN7ee435613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee435613barEv,_ZTv0_n16_N7ee435613barEv)();
extern void ABISELECT(_ZThn16_N7ee435613barEv,_ZThn12_N7ee435613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee435613barEv,_ZTv0_n16_N7ee435613barEv)();
extern void ABISELECT(_ZThn32_N7ee435613barEv,_ZThn20_N7ee435613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
  (VTBL_ENTRY)&_ZN7ee435613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee435613barEv,_ZTv0_n16_N7ee435613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee435613barEv,_ZTv0_n16_N7ee435613barEv),
};
extern VTBL_ENTRY _ZTV7ee43561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee43561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee43561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee43561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee43561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee43561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee43561[] = {
  {&(_ZTV7ee43561[4]),  4,17},
  {&(_tg__ZTV6dd3561__7ee43561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee43561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee43561[4]),  4,6},
  {&(_ZTV7ee43561[10]),  10,17},
  {&(_ZTV7ee43561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee43561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee43561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43561[];
extern  VTBL_ENTRY _ZTV7ee43561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43561[];
static VTBL_ENTRY alt_thunk_names773[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee435613barEv,_ZTv0_n16_N7ee435613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee435613barEv,_ZThn20_N7ee435613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee435613barEv,_ZThn12_N7ee435613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43561 = {  "ee43561", // class name
  bases_ee43561, 4,
  &(vtc_ee43561[0]), // expected_vtbl_contents
  &(vtt_ee43561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names773,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53561  : virtual dd3561 {
  int e;
  virtual void  bar(); // _ZN7ee535613barEv
  ~ee53561(); // tgen
  ee53561(); // tgen
};
//SIG(1 ee53561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee53561 ::bar(){vfunc_called(this, "_ZN7ee535613barEv");}
ee53561 ::~ee53561(){ note_dtor("ee53561", this);} // tgen
ee53561 ::ee53561(){ note_ctor("ee53561", this);} // tgen

static void Test_ee53561()
{
  extern Class_Descriptor cd_ee53561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53561, buf);
    ee53561 *dp, &lv = *(dp=new (buf) ee53561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee53561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee53561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(32,16), "ee53561");
    check_base_class_offset(lv, (dd3561*), ABISELECT(16,8), "ee53561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53561.e");
    test_class_info(&lv, &cd_ee53561);
    dp->~ee53561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53561(Test_ee53561, "ee53561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53561C1Ev();
extern void _ZN7ee53561D1Ev();
Name_Map name_map_ee53561[] = {
  NSPAIR(_ZN7ee53561C1Ev),
  NSPAIR(_ZN7ee53561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee53561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53561[];
extern void _ZN7ee535613barEv();
extern void _ZN6dd35613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee535613barEv,_ZTv0_n16_N7ee535613barEv)();
extern void ABISELECT(_ZThn32_N7ee535613barEv,_ZThn16_N7ee535613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee535613barEv,_ZTv0_n16_N7ee535613barEv)();
extern void ABISELECT(_ZThn48_N7ee535613barEv,_ZThn24_N7ee535613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53561[0]),
  (VTBL_ENTRY)&_ZN7ee535613barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee535613barEv,_ZTv0_n16_N7ee535613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee535613barEv,_ZTv0_n16_N7ee535613barEv),
};
extern VTBL_ENTRY _ZTV7ee53561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee53561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee53561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee53561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee53561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee53561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee53561[] = {
  {&(_ZTV7ee53561[5]),  5,23},
  {&(_ZTV7ee53561[11]),  11,23},
  {&(_ZTV7ee53561[16]),  16,23},
  {&(_ZTV7ee53561[21]),  21,23},
  {&(_tg__ZTV6dd3561__7ee53561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee53561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee53561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee53561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee53561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53561[];
extern  VTBL_ENTRY _ZTV7ee53561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53561[];
static VTBL_ENTRY alt_thunk_names774[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee535613barEv,_ZTv0_n16_N7ee535613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee535613barEv,_ZThn24_N7ee535613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee535613barEv,_ZThn16_N7ee535613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53561 = {  "ee53561", // class name
  bases_ee53561, 4,
  &(vtc_ee53561[0]), // expected_vtbl_contents
  &(vtt_ee53561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53561),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names774,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63561  : dd3561 {
  int e;
  virtual void  foo(); // _ZN7ee635613fooEv
  virtual void  bar(); // _ZN7ee635613barEv
  ~ee63561(); // tgen
  ee63561(); // tgen
};
//SIG(1 ee63561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63561 ::foo(){vfunc_called(this, "_ZN7ee635613fooEv");}
void  ee63561 ::bar(){vfunc_called(this, "_ZN7ee635613barEv");}
ee63561 ::~ee63561(){ note_dtor("ee63561", this);} // tgen
ee63561 ::ee63561(){ note_ctor("ee63561", this);} // tgen

static void Test_ee63561()
{
  extern Class_Descriptor cd_ee63561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63561, buf);
    ee63561 *dp, &lv = *(dp=new (buf) ee63561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee63561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee63561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(16,12), "ee63561");
    check_base_class_offset(lv, (dd3561*), 0, "ee63561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63561.e");
    test_class_info(&lv, &cd_ee63561);
    dp->~ee63561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63561(Test_ee63561, "ee63561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63561C1Ev();
extern void _ZN7ee63561D1Ev();
Name_Map name_map_ee63561[] = {
  NSPAIR(_ZN7ee63561C1Ev),
  NSPAIR(_ZN7ee63561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee63561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63561[];
extern void _ZN7ee635613fooEv();
extern void _ZN7ee635613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee635613barEv,_ZTv0_n16_N7ee635613barEv)();
extern void ABISELECT(_ZThn16_N7ee635613barEv,_ZThn12_N7ee635613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee635613fooEv,_ZTv0_n12_N7ee635613fooEv)();
extern void ABISELECT(_ZThn32_N7ee635613fooEv,_ZThn20_N7ee635613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee635613barEv,_ZTv0_n16_N7ee635613barEv)();
extern void ABISELECT(_ZThn32_N7ee635613barEv,_ZThn20_N7ee635613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63561[0]),
  (VTBL_ENTRY)&_ZN7ee635613fooEv,
  (VTBL_ENTRY)&_ZN7ee635613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee635613barEv,_ZTv0_n16_N7ee635613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee635613fooEv,_ZTv0_n12_N7ee635613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee635613barEv,_ZTv0_n16_N7ee635613barEv),
};
extern VTBL_ENTRY _ZTV7ee63561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee63561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee63561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee63561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee63561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee63561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee63561[] = {
  {&(_ZTV7ee63561[4]),  4,17},
  {&(_tg__ZTV6dd3561__7ee63561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee63561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee63561[4]),  4,6},
  {&(_ZTV7ee63561[10]),  10,17},
  {&(_ZTV7ee63561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee63561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee63561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63561[];
extern  VTBL_ENTRY _ZTV7ee63561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63561[];
static VTBL_ENTRY alt_thunk_names775[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn20_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee635613fooEv,_ZTv0_n12_N7ee635613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee635613fooEv,_ZThn20_N7ee635613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee635613barEv,_ZTv0_n16_N7ee635613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee635613barEv,_ZThn20_N7ee635613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee635613barEv,_ZThn12_N7ee635613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63561 = {  "ee63561", // class name
  bases_ee63561, 4,
  &(vtc_ee63561[0]), // expected_vtbl_contents
  &(vtt_ee63561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names775,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73561  : virtual dd3561 {
  int e;
  virtual void  foo(); // _ZN7ee735613fooEv
  virtual void  bar(); // _ZN7ee735613barEv
  ~ee73561(); // tgen
  ee73561(); // tgen
};
//SIG(1 ee73561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73561 ::foo(){vfunc_called(this, "_ZN7ee735613fooEv");}
void  ee73561 ::bar(){vfunc_called(this, "_ZN7ee735613barEv");}
ee73561 ::~ee73561(){ note_dtor("ee73561", this);} // tgen
ee73561 ::ee73561(){ note_ctor("ee73561", this);} // tgen

static void Test_ee73561()
{
  extern Class_Descriptor cd_ee73561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73561, buf);
    ee73561 *dp, &lv = *(dp=new (buf) ee73561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee73561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee73561");
    check_base_class_offset(lv, (cc561*)(dd3561*), ABISELECT(32,16), "ee73561");
    check_base_class_offset(lv, (dd3561*), ABISELECT(16,8), "ee73561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73561.e");
    test_class_info(&lv, &cd_ee73561);
    dp->~ee73561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73561(Test_ee73561, "ee73561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73561C1Ev();
extern void _ZN7ee73561D1Ev();
Name_Map name_map_ee73561[] = {
  NSPAIR(_ZN7ee73561C1Ev),
  NSPAIR(_ZN7ee73561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd3561;
extern VTBL_ENTRY _ZTI6dd3561[];
extern  VTBL_ENTRY _ZTV6dd3561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3561[];
static Base_Class bases_ee73561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3561,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73561[];
extern void _ZN7ee735613fooEv();
extern void _ZN7ee735613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee735613fooEv,_ZTv0_n20_N7ee735613fooEv)();
extern void ABISELECT(_ZThn16_N7ee735613fooEv,_ZThn8_N7ee735613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee735613barEv,_ZTv0_n16_N7ee735613barEv)();
extern void ABISELECT(_ZThn32_N7ee735613barEv,_ZThn16_N7ee735613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee735613fooEv,_ZTv0_n12_N7ee735613fooEv)();
extern void ABISELECT(_ZThn48_N7ee735613fooEv,_ZThn24_N7ee735613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee735613barEv,_ZTv0_n16_N7ee735613barEv)();
extern void ABISELECT(_ZThn48_N7ee735613barEv,_ZThn24_N7ee735613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73561[0]),
  (VTBL_ENTRY)&_ZN7ee735613fooEv,
  (VTBL_ENTRY)&_ZN7ee735613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee735613fooEv,_ZTv0_n20_N7ee735613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee735613barEv,_ZTv0_n16_N7ee735613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee735613fooEv,_ZTv0_n12_N7ee735613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee735613barEv,_ZTv0_n16_N7ee735613barEv),
};
extern VTBL_ENTRY _ZTV7ee73561[];
extern void _ZN6dd35613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3561__7ee73561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN6dd35613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd3561__7ee73561[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv)();
extern void ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3561__7ee73561[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee73561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee73561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee73561[] = {
  {&(_ZTV7ee73561[5]),  5,24},
  {&(_ZTV7ee73561[12]),  12,24},
  {&(_ZTV7ee73561[17]),  17,24},
  {&(_ZTV7ee73561[22]),  22,24},
  {&(_tg__ZTV6dd3561__7ee73561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd3561__7ee73561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd3561__7ee73561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee73561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee73561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73561[];
extern  VTBL_ENTRY _ZTV7ee73561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73561[];
static VTBL_ENTRY alt_thunk_names776[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35613fooEv,_ZTv0_n12_N6dd35613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35613fooEv,_ZThn16_N6dd35613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee735613fooEv,_ZTv0_n12_N7ee735613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee735613fooEv,_ZThn24_N7ee735613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee735613barEv,_ZTv0_n16_N7ee735613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee735613barEv,_ZThn24_N7ee735613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee735613barEv,_ZThn16_N7ee735613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee735613fooEv,_ZTv0_n20_N7ee735613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee735613fooEv,_ZThn8_N7ee735613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73561 = {  "ee73561", // class name
  bases_ee73561, 4,
  &(vtc_ee73561[0]), // expected_vtbl_contents
  &(vtt_ee73561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73561),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names776,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4561  : cc561 {
  int d;
  virtual void  bar(); // _ZN6dd45613barEv
  ~dd4561(); // tgen
  dd4561(); // tgen
};
//SIG(-1 dd4561) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd4561 ::bar(){vfunc_called(this, "_ZN6dd45613barEv");}
dd4561 ::~dd4561(){ note_dtor("dd4561", this);} // tgen
dd4561 ::dd4561(){ note_ctor("dd4561", this);} // tgen

static void Test_dd4561()
{
  extern Class_Descriptor cd_dd4561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4561, buf);
    dd4561 *dp, &lv = *(dp=new (buf) dd4561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd4561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(16,12), "dd4561");
    check_base_class_offset(lv, (cc561*), 0, "dd4561");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4561.d");
    test_class_info(&lv, &cd_dd4561);
    dp->~dd4561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4561(Test_dd4561, "dd4561", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4561C1Ev();
extern void _ZN6dd4561D1Ev();
Name_Map name_map_dd4561[] = {
  NSPAIR(_ZN6dd4561C1Ev),
  NSPAIR(_ZN6dd4561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd4561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4561[];
extern void _ZN6dd45613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
extern VTBL_ENTRY _ZTV6dd4561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd4561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd4561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd4561[] = {
  {&(_ZTV6dd4561[3]),  3,10},
  {&(_tg__ZTV5cc561__6dd4561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd4561[4]),  4,6},
  {&(_ZTV6dd4561[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static VTBL_ENTRY alt_thunk_names777[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4561 = {  "dd4561", // class name
  bases_dd4561, 3,
  &(vtc_dd4561[0]), // expected_vtbl_contents
  &(vtt_dd4561[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4561),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4561),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names777,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04561  : dd4561 {
  int e;
  ~ee04561(); // tgen
  ee04561(); // tgen
};
//SIG(1 ee04561) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee04561 ::~ee04561(){ note_dtor("ee04561", this);} // tgen
ee04561 ::ee04561(){ note_ctor("ee04561", this);} // tgen

static void Test_ee04561()
{
  extern Class_Descriptor cd_ee04561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04561, buf);
    ee04561 *dp, &lv = *(dp=new (buf) ee04561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee04561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(24,16), "ee04561");
    check_base_class_offset(lv, (cc561*)(dd4561*), 0, "ee04561");
    check_base_class_offset(lv, (dd4561*), 0, "ee04561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04561.e");
    test_class_info(&lv, &cd_ee04561);
    dp->~ee04561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04561(Test_ee04561, "ee04561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04561C1Ev();
extern void _ZN7ee04561D1Ev();
Name_Map name_map_ee04561[] = {
  NSPAIR(_ZN7ee04561C1Ev),
  NSPAIR(_ZN7ee04561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee04561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04561[];
extern void _ZN6dd45613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
extern VTBL_ENTRY _ZTV7ee04561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee04561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee04561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee04561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee04561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee04561[] = {
  {&(_ZTV7ee04561[3]),  3,10},
  {&(_tg__ZTV6dd4561__7ee04561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee04561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee04561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee04561[4]),  4,6},
  {&(_ZTV7ee04561[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee04561[];
extern  VTBL_ENTRY _ZTV7ee04561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04561[];
static VTBL_ENTRY alt_thunk_names778[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04561 = {  "ee04561", // class name
  bases_ee04561, 4,
  &(vtc_ee04561[0]), // expected_vtbl_contents
  &(vtt_ee04561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04561),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names778,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14561  : virtual dd4561 {
  int e;
  ~ee14561(); // tgen
  ee14561(); // tgen
};
//SIG(1 ee14561) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee14561 ::~ee14561(){ note_dtor("ee14561", this);} // tgen
ee14561 ::ee14561(){ note_ctor("ee14561", this);} // tgen

static void Test_ee14561()
{
  extern Class_Descriptor cd_ee14561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14561, buf);
    ee14561 *dp, &lv = *(dp=new (buf) ee14561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee14561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(32,20), "ee14561");
    check_base_class_offset(lv, (cc561*)(dd4561*), ABISELECT(16,8), "ee14561");
    check_base_class_offset(lv, (dd4561*), ABISELECT(16,8), "ee14561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14561.e");
    test_class_info(&lv, &cd_ee14561);
    dp->~ee14561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14561(Test_ee14561, "ee14561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14561C1Ev();
extern void _ZN7ee14561D1Ev();
Name_Map name_map_ee14561[] = {
  NSPAIR(_ZN7ee14561C1Ev),
  NSPAIR(_ZN7ee14561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee14561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14561[];
extern void _ZN6dd45613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14561[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
extern VTBL_ENTRY _ZTV7ee14561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee14561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee14561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee14561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee14561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee14561[] = {
  {&(_ZTV7ee14561[4]),  4,15},
  {&(_ZTV7ee14561[8]),  8,15},
  {&(_ZTV7ee14561[13]),  13,15},
  {&(_tg__ZTV6dd4561__7ee14561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee14561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee14561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee14561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14561[];
extern  VTBL_ENTRY _ZTV7ee14561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14561[];
static VTBL_ENTRY alt_thunk_names779[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14561 = {  "ee14561", // class name
  bases_ee14561, 4,
  &(vtc_ee14561[0]), // expected_vtbl_contents
  &(vtt_ee14561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14561),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names779,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24561  : dd4561 {
  int e;
  virtual void  foo(); // _ZN7ee245613fooEv
  ~ee24561(); // tgen
  ee24561(); // tgen
};
//SIG(1 ee24561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee24561 ::foo(){vfunc_called(this, "_ZN7ee245613fooEv");}
ee24561 ::~ee24561(){ note_dtor("ee24561", this);} // tgen
ee24561 ::ee24561(){ note_ctor("ee24561", this);} // tgen

static void Test_ee24561()
{
  extern Class_Descriptor cd_ee24561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24561, buf);
    ee24561 *dp, &lv = *(dp=new (buf) ee24561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee24561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(24,16), "ee24561");
    check_base_class_offset(lv, (cc561*)(dd4561*), 0, "ee24561");
    check_base_class_offset(lv, (dd4561*), 0, "ee24561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24561.e");
    test_class_info(&lv, &cd_ee24561);
    dp->~ee24561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24561(Test_ee24561, "ee24561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24561C1Ev();
extern void _ZN7ee24561D1Ev();
Name_Map name_map_ee24561[] = {
  NSPAIR(_ZN7ee24561C1Ev),
  NSPAIR(_ZN7ee24561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee24561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24561[];
extern void _ZN6dd45613barEv();
extern void _ZN7ee245613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee245613fooEv,_ZTv0_n12_N7ee245613fooEv)();
extern void ABISELECT(_ZThn24_N7ee245613fooEv,_ZThn16_N7ee245613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
  (VTBL_ENTRY)&_ZN7ee245613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee245613fooEv,_ZTv0_n12_N7ee245613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
extern VTBL_ENTRY _ZTV7ee24561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee24561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee24561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee24561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee24561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee24561[] = {
  {&(_ZTV7ee24561[3]),  3,11},
  {&(_tg__ZTV6dd4561__7ee24561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee24561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee24561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee24561[4]),  4,6},
  {&(_ZTV7ee24561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24561[];
extern  VTBL_ENTRY _ZTV7ee24561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24561[];
static VTBL_ENTRY alt_thunk_names780[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee245613fooEv,_ZTv0_n12_N7ee245613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee245613fooEv,_ZThn16_N7ee245613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24561 = {  "ee24561", // class name
  bases_ee24561, 4,
  &(vtc_ee24561[0]), // expected_vtbl_contents
  &(vtt_ee24561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names780,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34561  : virtual dd4561 {
  int e;
  virtual void  foo(); // _ZN7ee345613fooEv
  ~ee34561(); // tgen
  ee34561(); // tgen
};
//SIG(1 ee34561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee34561 ::foo(){vfunc_called(this, "_ZN7ee345613fooEv");}
ee34561 ::~ee34561(){ note_dtor("ee34561", this);} // tgen
ee34561 ::ee34561(){ note_ctor("ee34561", this);} // tgen

static void Test_ee34561()
{
  extern Class_Descriptor cd_ee34561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34561, buf);
    ee34561 *dp, &lv = *(dp=new (buf) ee34561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee34561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(32,20), "ee34561");
    check_base_class_offset(lv, (cc561*)(dd4561*), ABISELECT(16,8), "ee34561");
    check_base_class_offset(lv, (dd4561*), ABISELECT(16,8), "ee34561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34561.e");
    test_class_info(&lv, &cd_ee34561);
    dp->~ee34561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34561(Test_ee34561, "ee34561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34561C1Ev();
extern void _ZN7ee34561D1Ev();
Name_Map name_map_ee34561[] = {
  NSPAIR(_ZN7ee34561C1Ev),
  NSPAIR(_ZN7ee34561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee34561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34561[];
extern void _ZN7ee345613fooEv();
extern void _ZN6dd45613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee345613fooEv,_ZTv0_n12_N7ee345613fooEv)();
extern void ABISELECT(_ZThn32_N7ee345613fooEv,_ZThn20_N7ee345613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34561[0]),
  (VTBL_ENTRY)&_ZN7ee345613fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee345613fooEv,_ZTv0_n12_N7ee345613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
extern VTBL_ENTRY _ZTV7ee34561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee34561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee34561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee34561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee34561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee34561[] = {
  {&(_ZTV7ee34561[4]),  4,16},
  {&(_ZTV7ee34561[9]),  9,16},
  {&(_ZTV7ee34561[14]),  14,16},
  {&(_tg__ZTV6dd4561__7ee34561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee34561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee34561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee34561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34561[];
extern  VTBL_ENTRY _ZTV7ee34561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34561[];
static VTBL_ENTRY alt_thunk_names781[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee345613fooEv,_ZTv0_n12_N7ee345613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee345613fooEv,_ZThn20_N7ee345613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34561 = {  "ee34561", // class name
  bases_ee34561, 4,
  &(vtc_ee34561[0]), // expected_vtbl_contents
  &(vtt_ee34561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names781,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44561  : dd4561 {
  int e;
  virtual void  bar(); // _ZN7ee445613barEv
  ~ee44561(); // tgen
  ee44561(); // tgen
};
//SIG(1 ee44561) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee44561 ::bar(){vfunc_called(this, "_ZN7ee445613barEv");}
ee44561 ::~ee44561(){ note_dtor("ee44561", this);} // tgen
ee44561 ::ee44561(){ note_ctor("ee44561", this);} // tgen

static void Test_ee44561()
{
  extern Class_Descriptor cd_ee44561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44561, buf);
    ee44561 *dp, &lv = *(dp=new (buf) ee44561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee44561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(24,16), "ee44561");
    check_base_class_offset(lv, (cc561*)(dd4561*), 0, "ee44561");
    check_base_class_offset(lv, (dd4561*), 0, "ee44561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44561.e");
    test_class_info(&lv, &cd_ee44561);
    dp->~ee44561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44561(Test_ee44561, "ee44561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44561C1Ev();
extern void _ZN7ee44561D1Ev();
Name_Map name_map_ee44561[] = {
  NSPAIR(_ZN7ee44561C1Ev),
  NSPAIR(_ZN7ee44561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee44561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44561[];
extern void _ZN7ee445613barEv();
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee445613barEv,_ZTv0_n16_N7ee445613barEv)();
extern void ABISELECT(_ZThn24_N7ee445613barEv,_ZThn16_N7ee445613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44561[0]),
  (VTBL_ENTRY)&_ZN7ee445613barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee445613barEv,_ZTv0_n16_N7ee445613barEv),
};
extern VTBL_ENTRY _ZTV7ee44561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee44561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee44561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee44561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee44561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee44561[] = {
  {&(_ZTV7ee44561[3]),  3,10},
  {&(_tg__ZTV6dd4561__7ee44561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee44561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee44561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee44561[4]),  4,6},
  {&(_ZTV7ee44561[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee44561[];
extern  VTBL_ENTRY _ZTV7ee44561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44561[];
static VTBL_ENTRY alt_thunk_names782[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee445613barEv,_ZTv0_n16_N7ee445613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee445613barEv,_ZThn16_N7ee445613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44561 = {  "ee44561", // class name
  bases_ee44561, 4,
  &(vtc_ee44561[0]), // expected_vtbl_contents
  &(vtt_ee44561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44561),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names782,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54561  : virtual dd4561 {
  int e;
  virtual void  bar(); // _ZN7ee545613barEv
  ~ee54561(); // tgen
  ee54561(); // tgen
};
//SIG(1 ee54561) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee54561 ::bar(){vfunc_called(this, "_ZN7ee545613barEv");}
ee54561 ::~ee54561(){ note_dtor("ee54561", this);} // tgen
ee54561 ::ee54561(){ note_ctor("ee54561", this);} // tgen

static void Test_ee54561()
{
  extern Class_Descriptor cd_ee54561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54561, buf);
    ee54561 *dp, &lv = *(dp=new (buf) ee54561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee54561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(32,20), "ee54561");
    check_base_class_offset(lv, (cc561*)(dd4561*), ABISELECT(16,8), "ee54561");
    check_base_class_offset(lv, (dd4561*), ABISELECT(16,8), "ee54561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54561.e");
    test_class_info(&lv, &cd_ee54561);
    dp->~ee54561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54561(Test_ee54561, "ee54561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54561C1Ev();
extern void _ZN7ee54561D1Ev();
Name_Map name_map_ee54561[] = {
  NSPAIR(_ZN7ee54561C1Ev),
  NSPAIR(_ZN7ee54561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee54561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54561[];
extern void _ZN7ee545613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee545613barEv,_ZTv0_n16_N7ee545613barEv)();
extern void ABISELECT(_ZThn16_N7ee545613barEv,_ZThn8_N7ee545613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee545613barEv,_ZTv0_n16_N7ee545613barEv)();
extern void ABISELECT(_ZThn32_N7ee545613barEv,_ZThn20_N7ee545613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54561[0]),
  (VTBL_ENTRY)&_ZN7ee545613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee545613barEv,_ZTv0_n16_N7ee545613barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee545613barEv,_ZTv0_n16_N7ee545613barEv),
};
extern VTBL_ENTRY _ZTV7ee54561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee54561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee54561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee54561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee54561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee54561[] = {
  {&(_ZTV7ee54561[4]),  4,16},
  {&(_ZTV7ee54561[9]),  9,16},
  {&(_ZTV7ee54561[14]),  14,16},
  {&(_tg__ZTV6dd4561__7ee54561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee54561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee54561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee54561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54561[];
extern  VTBL_ENTRY _ZTV7ee54561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54561[];
static VTBL_ENTRY alt_thunk_names783[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee545613barEv,_ZTv0_n16_N7ee545613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee545613barEv,_ZThn20_N7ee545613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee545613barEv,_ZThn8_N7ee545613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54561 = {  "ee54561", // class name
  bases_ee54561, 4,
  &(vtc_ee54561[0]), // expected_vtbl_contents
  &(vtt_ee54561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names783,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64561  : dd4561 {
  int e;
  virtual void  foo(); // _ZN7ee645613fooEv
  virtual void  bar(); // _ZN7ee645613barEv
  ~ee64561(); // tgen
  ee64561(); // tgen
};
//SIG(1 ee64561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64561 ::foo(){vfunc_called(this, "_ZN7ee645613fooEv");}
void  ee64561 ::bar(){vfunc_called(this, "_ZN7ee645613barEv");}
ee64561 ::~ee64561(){ note_dtor("ee64561", this);} // tgen
ee64561 ::ee64561(){ note_ctor("ee64561", this);} // tgen

static void Test_ee64561()
{
  extern Class_Descriptor cd_ee64561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64561, buf);
    ee64561 *dp, &lv = *(dp=new (buf) ee64561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee64561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(24,16), "ee64561");
    check_base_class_offset(lv, (cc561*)(dd4561*), 0, "ee64561");
    check_base_class_offset(lv, (dd4561*), 0, "ee64561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64561.e");
    test_class_info(&lv, &cd_ee64561);
    dp->~ee64561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64561(Test_ee64561, "ee64561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64561C1Ev();
extern void _ZN7ee64561D1Ev();
Name_Map name_map_ee64561[] = {
  NSPAIR(_ZN7ee64561C1Ev),
  NSPAIR(_ZN7ee64561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee64561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64561[];
extern void _ZN7ee645613barEv();
extern void _ZN7ee645613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee645613fooEv,_ZTv0_n12_N7ee645613fooEv)();
extern void ABISELECT(_ZThn24_N7ee645613fooEv,_ZThn16_N7ee645613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee645613barEv,_ZTv0_n16_N7ee645613barEv)();
extern void ABISELECT(_ZThn24_N7ee645613barEv,_ZThn16_N7ee645613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64561[0]),
  (VTBL_ENTRY)&_ZN7ee645613barEv,
  (VTBL_ENTRY)&_ZN7ee645613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee645613fooEv,_ZTv0_n12_N7ee645613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee645613barEv,_ZTv0_n16_N7ee645613barEv),
};
extern VTBL_ENTRY _ZTV7ee64561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee64561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee64561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee64561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee64561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee64561[] = {
  {&(_ZTV7ee64561[3]),  3,11},
  {&(_tg__ZTV6dd4561__7ee64561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee64561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee64561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee64561[4]),  4,6},
  {&(_ZTV7ee64561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64561[];
extern  VTBL_ENTRY _ZTV7ee64561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64561[];
static VTBL_ENTRY alt_thunk_names784[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45613barEv,_ZThn16_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee645613barEv,_ZTv0_n16_N7ee645613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee645613barEv,_ZThn16_N7ee645613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee645613fooEv,_ZTv0_n12_N7ee645613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee645613fooEv,_ZThn16_N7ee645613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64561 = {  "ee64561", // class name
  bases_ee64561, 4,
  &(vtc_ee64561[0]), // expected_vtbl_contents
  &(vtt_ee64561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names784,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74561  : virtual dd4561 {
  int e;
  virtual void  foo(); // _ZN7ee745613fooEv
  virtual void  bar(); // _ZN7ee745613barEv
  ~ee74561(); // tgen
  ee74561(); // tgen
};
//SIG(1 ee74561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74561 ::foo(){vfunc_called(this, "_ZN7ee745613fooEv");}
void  ee74561 ::bar(){vfunc_called(this, "_ZN7ee745613barEv");}
ee74561 ::~ee74561(){ note_dtor("ee74561", this);} // tgen
ee74561 ::ee74561(){ note_ctor("ee74561", this);} // tgen

static void Test_ee74561()
{
  extern Class_Descriptor cd_ee74561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74561, buf);
    ee74561 *dp, &lv = *(dp=new (buf) ee74561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee74561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd4561*), ABISELECT(32,20), "ee74561");
    check_base_class_offset(lv, (cc561*)(dd4561*), ABISELECT(16,8), "ee74561");
    check_base_class_offset(lv, (dd4561*), ABISELECT(16,8), "ee74561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74561.e");
    test_class_info(&lv, &cd_ee74561);
    dp->~ee74561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74561(Test_ee74561, "ee74561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74561C1Ev();
extern void _ZN7ee74561D1Ev();
Name_Map name_map_ee74561[] = {
  NSPAIR(_ZN7ee74561C1Ev),
  NSPAIR(_ZN7ee74561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd4561;
extern VTBL_ENTRY _ZTI6dd4561[];
extern  VTBL_ENTRY _ZTV6dd4561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4561[];
static Base_Class bases_ee74561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4561,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74561[];
extern void _ZN7ee745613fooEv();
extern void _ZN7ee745613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee745613barEv,_ZTv0_n16_N7ee745613barEv)();
extern void ABISELECT(_ZThn16_N7ee745613barEv,_ZThn8_N7ee745613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee745613fooEv,_ZTv0_n12_N7ee745613fooEv)();
extern void ABISELECT(_ZThn32_N7ee745613fooEv,_ZThn20_N7ee745613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee745613barEv,_ZTv0_n16_N7ee745613barEv)();
extern void ABISELECT(_ZThn32_N7ee745613barEv,_ZThn20_N7ee745613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74561[0]),
  (VTBL_ENTRY)&_ZN7ee745613fooEv,
  (VTBL_ENTRY)&_ZN7ee745613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee745613barEv,_ZTv0_n16_N7ee745613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee745613fooEv,_ZTv0_n12_N7ee745613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee745613barEv,_ZTv0_n16_N7ee745613barEv),
};
extern VTBL_ENTRY _ZTV7ee74561[];
extern void _ZN6dd45613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4561__7ee74561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN6dd45613barEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd4561__7ee74561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd4561__7ee74561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv)();
extern void ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4561__7ee74561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv),
};
static  VTT_ENTRY vtt_ee74561[] = {
  {&(_ZTV7ee74561[4]),  4,17},
  {&(_ZTV7ee74561[10]),  10,17},
  {&(_ZTV7ee74561[15]),  15,17},
  {&(_tg__ZTV6dd4561__7ee74561[3]),  3,4},
  {&(_tg__ZTV5cc5616dd4561__7ee74561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd4561__7ee74561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4561__7ee74561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74561[];
extern  VTBL_ENTRY _ZTV7ee74561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74561[];
static VTBL_ENTRY alt_thunk_names785[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45613barEv,_ZTv0_n16_N6dd45613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45613barEv,_ZThn12_N6dd45613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee745613fooEv,_ZTv0_n12_N7ee745613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee745613fooEv,_ZThn20_N7ee745613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee745613barEv,_ZTv0_n16_N7ee745613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee745613barEv,_ZThn20_N7ee745613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee745613barEv,_ZThn8_N7ee745613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74561 = {  "ee74561", // class name
  bases_ee74561, 4,
  &(vtc_ee74561[0]), // expected_vtbl_contents
  &(vtt_ee74561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names785,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5561  : virtual cc561 {
  int d;
  virtual void  bar(); // _ZN6dd55613barEv
  ~dd5561(); // tgen
  dd5561(); // tgen
};
//SIG(-1 dd5561) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd5561 ::bar(){vfunc_called(this, "_ZN6dd55613barEv");}
dd5561 ::~dd5561(){ note_dtor("dd5561", this);} // tgen
dd5561 ::dd5561(){ note_ctor("dd5561", this);} // tgen

static void Test_dd5561()
{
  extern Class_Descriptor cd_dd5561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5561, buf);
    dd5561 *dp, &lv = *(dp=new (buf) dd5561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd5561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,16), "dd5561");
    check_base_class_offset(lv, (cc561*), ABISELECT(16,8), "dd5561");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5561.d");
    test_class_info(&lv, &cd_dd5561);
    dp->~dd5561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5561(Test_dd5561, "dd5561", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5561C1Ev();
extern void _ZN6dd5561D1Ev();
Name_Map name_map_dd5561[] = {
  NSPAIR(_ZN6dd5561C1Ev),
  NSPAIR(_ZN6dd5561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd5561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc561,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5561[];
extern void _ZN6dd55613barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern VTBL_ENTRY _ZTV6dd5561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd5561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd5561[] = {
  {&(_ZTV6dd5561[4]),  4,16},
  {&(_ZTV6dd5561[9]),  9,16},
  {&(_ZTV6dd5561[14]),  14,16},
  {&(_tg__ZTV5cc561__6dd5561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd5561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static VTBL_ENTRY alt_thunk_names786[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5561 = {  "dd5561", // class name
  bases_dd5561, 3,
  &(vtc_dd5561[0]), // expected_vtbl_contents
  &(vtt_dd5561[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5561),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names786,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05561  : dd5561 {
  int e;
  ~ee05561(); // tgen
  ee05561(); // tgen
};
//SIG(1 ee05561) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee05561 ::~ee05561(){ note_dtor("ee05561", this);} // tgen
ee05561 ::ee05561(){ note_ctor("ee05561", this);} // tgen

static void Test_ee05561()
{
  extern Class_Descriptor cd_ee05561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05561, buf);
    ee05561 *dp, &lv = *(dp=new (buf) ee05561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee05561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee05561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(16,12), "ee05561");
    check_base_class_offset(lv, (dd5561*), 0, "ee05561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05561.e");
    test_class_info(&lv, &cd_ee05561);
    dp->~ee05561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05561(Test_ee05561, "ee05561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05561C1Ev();
extern void _ZN7ee05561D1Ev();
Name_Map name_map_ee05561[] = {
  NSPAIR(_ZN7ee05561C1Ev),
  NSPAIR(_ZN7ee05561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee05561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05561[];
extern void _ZN6dd55613barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern VTBL_ENTRY _ZTV7ee05561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee05561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee05561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee05561[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee05561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee05561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee05561[] = {
  {&(_ZTV7ee05561[4]),  4,16},
  {&(_tg__ZTV6dd5561__7ee05561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee05561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee05561[4]),  4,6},
  {&(_ZTV7ee05561[9]),  9,16},
  {&(_ZTV7ee05561[14]),  14,16},
  {&(_tg__ZTV5cc561__7ee05561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee05561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05561[];
extern  VTBL_ENTRY _ZTV7ee05561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05561[];
static VTBL_ENTRY alt_thunk_names787[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05561 = {  "ee05561", // class name
  bases_ee05561, 4,
  &(vtc_ee05561[0]), // expected_vtbl_contents
  &(vtt_ee05561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names787,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15561  : virtual dd5561 {
  int e;
  ~ee15561(); // tgen
  ee15561(); // tgen
};
//SIG(1 ee15561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee15561 ::~ee15561(){ note_dtor("ee15561", this);} // tgen
ee15561 ::ee15561(){ note_ctor("ee15561", this);} // tgen

static void Test_ee15561()
{
  extern Class_Descriptor cd_ee15561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15561, buf);
    ee15561 *dp, &lv = *(dp=new (buf) ee15561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee15561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee15561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(32,16), "ee15561");
    check_base_class_offset(lv, (dd5561*), ABISELECT(16,8), "ee15561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15561.e");
    test_class_info(&lv, &cd_ee15561);
    dp->~ee15561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15561(Test_ee15561, "ee15561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15561C1Ev();
extern void _ZN7ee15561D1Ev();
Name_Map name_map_ee15561[] = {
  NSPAIR(_ZN7ee15561C1Ev),
  NSPAIR(_ZN7ee15561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee15561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15561[];
extern void _ZN6dd55613barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15561[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern VTBL_ENTRY _ZTV7ee15561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee15561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee15561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee15561[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee15561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee15561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee15561[] = {
  {&(_ZTV7ee15561[5]),  5,22},
  {&(_ZTV7ee15561[10]),  10,22},
  {&(_ZTV7ee15561[15]),  15,22},
  {&(_ZTV7ee15561[20]),  20,22},
  {&(_tg__ZTV6dd5561__7ee15561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee15561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee15561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee15561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee15561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15561[];
extern  VTBL_ENTRY _ZTV7ee15561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15561[];
static VTBL_ENTRY alt_thunk_names788[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15561 = {  "ee15561", // class name
  bases_ee15561, 4,
  &(vtc_ee15561[0]), // expected_vtbl_contents
  &(vtt_ee15561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15561),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names788,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25561  : dd5561 {
  int e;
  virtual void  foo(); // _ZN7ee255613fooEv
  ~ee25561(); // tgen
  ee25561(); // tgen
};
//SIG(1 ee25561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee25561 ::foo(){vfunc_called(this, "_ZN7ee255613fooEv");}
ee25561 ::~ee25561(){ note_dtor("ee25561", this);} // tgen
ee25561 ::ee25561(){ note_ctor("ee25561", this);} // tgen

static void Test_ee25561()
{
  extern Class_Descriptor cd_ee25561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25561, buf);
    ee25561 *dp, &lv = *(dp=new (buf) ee25561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee25561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee25561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(16,12), "ee25561");
    check_base_class_offset(lv, (dd5561*), 0, "ee25561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25561.e");
    test_class_info(&lv, &cd_ee25561);
    dp->~ee25561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25561(Test_ee25561, "ee25561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25561C1Ev();
extern void _ZN7ee25561D1Ev();
Name_Map name_map_ee25561[] = {
  NSPAIR(_ZN7ee25561C1Ev),
  NSPAIR(_ZN7ee25561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee25561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25561[];
extern void _ZN6dd55613barEv();
extern void _ZN7ee255613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee255613fooEv,_ZTv0_n12_N7ee255613fooEv)();
extern void ABISELECT(_ZThn32_N7ee255613fooEv,_ZThn20_N7ee255613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
  (VTBL_ENTRY)&_ZN7ee255613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee255613fooEv,_ZTv0_n12_N7ee255613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern VTBL_ENTRY _ZTV7ee25561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee25561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee25561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee25561[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee25561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee25561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee25561[] = {
  {&(_ZTV7ee25561[4]),  4,17},
  {&(_tg__ZTV6dd5561__7ee25561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee25561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee25561[4]),  4,6},
  {&(_ZTV7ee25561[10]),  10,17},
  {&(_ZTV7ee25561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee25561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee25561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25561[];
extern  VTBL_ENTRY _ZTV7ee25561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25561[];
static VTBL_ENTRY alt_thunk_names789[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee255613fooEv,_ZTv0_n12_N7ee255613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee255613fooEv,_ZThn20_N7ee255613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25561 = {  "ee25561", // class name
  bases_ee25561, 4,
  &(vtc_ee25561[0]), // expected_vtbl_contents
  &(vtt_ee25561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names789,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35561  : virtual dd5561 {
  int e;
  virtual void  foo(); // _ZN7ee355613fooEv
  ~ee35561(); // tgen
  ee35561(); // tgen
};
//SIG(1 ee35561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee35561 ::foo(){vfunc_called(this, "_ZN7ee355613fooEv");}
ee35561 ::~ee35561(){ note_dtor("ee35561", this);} // tgen
ee35561 ::ee35561(){ note_ctor("ee35561", this);} // tgen

static void Test_ee35561()
{
  extern Class_Descriptor cd_ee35561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35561, buf);
    ee35561 *dp, &lv = *(dp=new (buf) ee35561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee35561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee35561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(32,16), "ee35561");
    check_base_class_offset(lv, (dd5561*), ABISELECT(16,8), "ee35561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35561.e");
    test_class_info(&lv, &cd_ee35561);
    dp->~ee35561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35561(Test_ee35561, "ee35561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35561C1Ev();
extern void _ZN7ee35561D1Ev();
Name_Map name_map_ee35561[] = {
  NSPAIR(_ZN7ee35561C1Ev),
  NSPAIR(_ZN7ee35561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee35561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35561[];
extern void _ZN7ee355613fooEv();
extern void _ZN6dd55613barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee355613fooEv,_ZTv0_n12_N7ee355613fooEv)();
extern void ABISELECT(_ZThn48_N7ee355613fooEv,_ZThn24_N7ee355613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35561[0]),
  (VTBL_ENTRY)&_ZN7ee355613fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee355613fooEv,_ZTv0_n12_N7ee355613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern VTBL_ENTRY _ZTV7ee35561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee35561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee35561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee35561[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee35561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee35561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee35561[] = {
  {&(_ZTV7ee35561[5]),  5,23},
  {&(_ZTV7ee35561[11]),  11,23},
  {&(_ZTV7ee35561[16]),  16,23},
  {&(_ZTV7ee35561[21]),  21,23},
  {&(_tg__ZTV6dd5561__7ee35561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee35561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee35561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee35561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee35561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35561[];
extern  VTBL_ENTRY _ZTV7ee35561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35561[];
static VTBL_ENTRY alt_thunk_names790[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee355613fooEv,_ZTv0_n12_N7ee355613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee355613fooEv,_ZThn24_N7ee355613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35561 = {  "ee35561", // class name
  bases_ee35561, 4,
  &(vtc_ee35561[0]), // expected_vtbl_contents
  &(vtt_ee35561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35561),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names790,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45561  : dd5561 {
  int e;
  virtual void  bar(); // _ZN7ee455613barEv
  ~ee45561(); // tgen
  ee45561(); // tgen
};
//SIG(1 ee45561) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee45561 ::bar(){vfunc_called(this, "_ZN7ee455613barEv");}
ee45561 ::~ee45561(){ note_dtor("ee45561", this);} // tgen
ee45561 ::ee45561(){ note_ctor("ee45561", this);} // tgen

static void Test_ee45561()
{
  extern Class_Descriptor cd_ee45561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45561, buf);
    ee45561 *dp, &lv = *(dp=new (buf) ee45561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee45561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee45561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(16,12), "ee45561");
    check_base_class_offset(lv, (dd5561*), 0, "ee45561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45561.e");
    test_class_info(&lv, &cd_ee45561);
    dp->~ee45561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45561(Test_ee45561, "ee45561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45561C1Ev();
extern void _ZN7ee45561D1Ev();
Name_Map name_map_ee45561[] = {
  NSPAIR(_ZN7ee45561C1Ev),
  NSPAIR(_ZN7ee45561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee45561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45561[];
extern void _ZN7ee455613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee455613barEv,_ZTv0_n16_N7ee455613barEv)();
extern void ABISELECT(_ZThn16_N7ee455613barEv,_ZThn12_N7ee455613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee455613barEv,_ZTv0_n16_N7ee455613barEv)();
extern void ABISELECT(_ZThn32_N7ee455613barEv,_ZThn20_N7ee455613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45561[0]),
  (VTBL_ENTRY)&_ZN7ee455613barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee455613barEv,_ZTv0_n16_N7ee455613barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee455613barEv,_ZTv0_n16_N7ee455613barEv),
};
extern VTBL_ENTRY _ZTV7ee45561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee45561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee45561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee45561[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee45561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee45561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee45561[] = {
  {&(_ZTV7ee45561[4]),  4,16},
  {&(_tg__ZTV6dd5561__7ee45561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee45561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee45561[4]),  4,6},
  {&(_ZTV7ee45561[9]),  9,16},
  {&(_ZTV7ee45561[14]),  14,16},
  {&(_tg__ZTV5cc561__7ee45561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee45561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45561[];
extern  VTBL_ENTRY _ZTV7ee45561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45561[];
static VTBL_ENTRY alt_thunk_names791[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee455613barEv,_ZTv0_n16_N7ee455613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee455613barEv,_ZThn20_N7ee455613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee455613barEv,_ZThn12_N7ee455613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45561 = {  "ee45561", // class name
  bases_ee45561, 4,
  &(vtc_ee45561[0]), // expected_vtbl_contents
  &(vtt_ee45561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45561),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names791,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55561  : virtual dd5561 {
  int e;
  virtual void  bar(); // _ZN7ee555613barEv
  ~ee55561(); // tgen
  ee55561(); // tgen
};
//SIG(1 ee55561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee55561 ::bar(){vfunc_called(this, "_ZN7ee555613barEv");}
ee55561 ::~ee55561(){ note_dtor("ee55561", this);} // tgen
ee55561 ::ee55561(){ note_ctor("ee55561", this);} // tgen

static void Test_ee55561()
{
  extern Class_Descriptor cd_ee55561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55561, buf);
    ee55561 *dp, &lv = *(dp=new (buf) ee55561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee55561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee55561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(32,16), "ee55561");
    check_base_class_offset(lv, (dd5561*), ABISELECT(16,8), "ee55561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55561.e");
    test_class_info(&lv, &cd_ee55561);
    dp->~ee55561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55561(Test_ee55561, "ee55561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55561C1Ev();
extern void _ZN7ee55561D1Ev();
Name_Map name_map_ee55561[] = {
  NSPAIR(_ZN7ee55561C1Ev),
  NSPAIR(_ZN7ee55561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee55561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55561[];
extern void _ZN7ee555613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee555613barEv,_ZTv0_n20_N7ee555613barEv)();
extern void ABISELECT(_ZThn16_N7ee555613barEv,_ZThn8_N7ee555613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee555613barEv,_ZTv0_n16_N7ee555613barEv)();
extern void ABISELECT(_ZThn32_N7ee555613barEv,_ZThn16_N7ee555613barEv)() __attribute__((weak));
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee555613barEv,_ZTv0_n16_N7ee555613barEv)();
extern void ABISELECT(_ZThn48_N7ee555613barEv,_ZThn24_N7ee555613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55561[0]),
  (VTBL_ENTRY)&_ZN7ee555613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee555613barEv,_ZTv0_n20_N7ee555613barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee555613barEv,_ZTv0_n16_N7ee555613barEv),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee555613barEv,_ZTv0_n16_N7ee555613barEv),
};
extern VTBL_ENTRY _ZTV7ee55561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee55561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee55561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee55561[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee55561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee55561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee55561[] = {
  {&(_ZTV7ee55561[5]),  5,23},
  {&(_ZTV7ee55561[11]),  11,23},
  {&(_ZTV7ee55561[16]),  16,23},
  {&(_ZTV7ee55561[21]),  21,23},
  {&(_tg__ZTV6dd5561__7ee55561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee55561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee55561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee55561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee55561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55561[];
extern  VTBL_ENTRY _ZTV7ee55561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55561[];
static VTBL_ENTRY alt_thunk_names792[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee555613barEv,_ZTv0_n16_N7ee555613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee555613barEv,_ZThn24_N7ee555613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee555613barEv,_ZThn16_N7ee555613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee555613barEv,_ZTv0_n20_N7ee555613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee555613barEv,_ZThn8_N7ee555613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55561 = {  "ee55561", // class name
  bases_ee55561, 4,
  &(vtc_ee55561[0]), // expected_vtbl_contents
  &(vtt_ee55561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55561),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names792,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65561  : dd5561 {
  int e;
  virtual void  foo(); // _ZN7ee655613fooEv
  virtual void  bar(); // _ZN7ee655613barEv
  ~ee65561(); // tgen
  ee65561(); // tgen
};
//SIG(1 ee65561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65561 ::foo(){vfunc_called(this, "_ZN7ee655613fooEv");}
void  ee65561 ::bar(){vfunc_called(this, "_ZN7ee655613barEv");}
ee65561 ::~ee65561(){ note_dtor("ee65561", this);} // tgen
ee65561 ::ee65561(){ note_ctor("ee65561", this);} // tgen

static void Test_ee65561()
{
  extern Class_Descriptor cd_ee65561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65561, buf);
    ee65561 *dp, &lv = *(dp=new (buf) ee65561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee65561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee65561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(16,12), "ee65561");
    check_base_class_offset(lv, (dd5561*), 0, "ee65561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65561.e");
    test_class_info(&lv, &cd_ee65561);
    dp->~ee65561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65561(Test_ee65561, "ee65561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65561C1Ev();
extern void _ZN7ee65561D1Ev();
Name_Map name_map_ee65561[] = {
  NSPAIR(_ZN7ee65561C1Ev),
  NSPAIR(_ZN7ee65561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee65561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65561[];
extern void _ZN7ee655613barEv();
extern void _ZN7ee655613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee655613barEv,_ZTv0_n16_N7ee655613barEv)();
extern void ABISELECT(_ZThn16_N7ee655613barEv,_ZThn12_N7ee655613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee655613fooEv,_ZTv0_n12_N7ee655613fooEv)();
extern void ABISELECT(_ZThn32_N7ee655613fooEv,_ZThn20_N7ee655613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee655613barEv,_ZTv0_n16_N7ee655613barEv)();
extern void ABISELECT(_ZThn32_N7ee655613barEv,_ZThn20_N7ee655613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65561[0]),
  (VTBL_ENTRY)&_ZN7ee655613barEv,
  (VTBL_ENTRY)&_ZN7ee655613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee655613barEv,_ZTv0_n16_N7ee655613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee655613fooEv,_ZTv0_n12_N7ee655613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee655613barEv,_ZTv0_n16_N7ee655613barEv),
};
extern VTBL_ENTRY _ZTV7ee65561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee65561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee65561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee65561[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee65561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee65561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee65561[] = {
  {&(_ZTV7ee65561[4]),  4,17},
  {&(_tg__ZTV6dd5561__7ee65561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee65561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee65561[4]),  4,6},
  {&(_ZTV7ee65561[10]),  10,17},
  {&(_ZTV7ee65561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee65561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee65561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65561[];
extern  VTBL_ENTRY _ZTV7ee65561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65561[];
static VTBL_ENTRY alt_thunk_names793[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn20_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn12_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee655613fooEv,_ZTv0_n12_N7ee655613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee655613fooEv,_ZThn20_N7ee655613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee655613barEv,_ZTv0_n16_N7ee655613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee655613barEv,_ZThn20_N7ee655613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee655613barEv,_ZThn12_N7ee655613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65561 = {  "ee65561", // class name
  bases_ee65561, 4,
  &(vtc_ee65561[0]), // expected_vtbl_contents
  &(vtt_ee65561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names793,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75561  : virtual dd5561 {
  int e;
  virtual void  foo(); // _ZN7ee755613fooEv
  virtual void  bar(); // _ZN7ee755613barEv
  ~ee75561(); // tgen
  ee75561(); // tgen
};
//SIG(1 ee75561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75561 ::foo(){vfunc_called(this, "_ZN7ee755613fooEv");}
void  ee75561 ::bar(){vfunc_called(this, "_ZN7ee755613barEv");}
ee75561 ::~ee75561(){ note_dtor("ee75561", this);} // tgen
ee75561 ::ee75561(){ note_ctor("ee75561", this);} // tgen

static void Test_ee75561()
{
  extern Class_Descriptor cd_ee75561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75561, buf);
    ee75561 *dp, &lv = *(dp=new (buf) ee75561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee75561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee75561");
    check_base_class_offset(lv, (cc561*)(dd5561*), ABISELECT(32,16), "ee75561");
    check_base_class_offset(lv, (dd5561*), ABISELECT(16,8), "ee75561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75561.e");
    test_class_info(&lv, &cd_ee75561);
    dp->~ee75561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75561(Test_ee75561, "ee75561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75561C1Ev();
extern void _ZN7ee75561D1Ev();
Name_Map name_map_ee75561[] = {
  NSPAIR(_ZN7ee75561C1Ev),
  NSPAIR(_ZN7ee75561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd5561;
extern VTBL_ENTRY _ZTI6dd5561[];
extern  VTBL_ENTRY _ZTV6dd5561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5561[];
static Base_Class bases_ee75561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5561,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75561[];
extern void _ZN7ee755613fooEv();
extern void _ZN7ee755613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee755613barEv,_ZTv0_n20_N7ee755613barEv)();
extern void ABISELECT(_ZThn16_N7ee755613barEv,_ZThn8_N7ee755613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee755613barEv,_ZTv0_n16_N7ee755613barEv)();
extern void ABISELECT(_ZThn32_N7ee755613barEv,_ZThn16_N7ee755613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee755613fooEv,_ZTv0_n12_N7ee755613fooEv)();
extern void ABISELECT(_ZThn48_N7ee755613fooEv,_ZThn24_N7ee755613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee755613barEv,_ZTv0_n16_N7ee755613barEv)();
extern void ABISELECT(_ZThn48_N7ee755613barEv,_ZThn24_N7ee755613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75561[0]),
  (VTBL_ENTRY)&_ZN7ee755613fooEv,
  (VTBL_ENTRY)&_ZN7ee755613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee755613barEv,_ZTv0_n20_N7ee755613barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee755613barEv,_ZTv0_n16_N7ee755613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee755613fooEv,_ZTv0_n12_N7ee755613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee755613barEv,_ZTv0_n16_N7ee755613barEv),
};
extern VTBL_ENTRY _ZTV7ee75561[];
extern void _ZN6dd55613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5561__7ee75561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN6dd55613barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd5561__7ee75561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv)();
extern void ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5561__7ee75561[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee75561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee75561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee75561[] = {
  {&(_ZTV7ee75561[5]),  5,24},
  {&(_ZTV7ee75561[12]),  12,24},
  {&(_ZTV7ee75561[17]),  17,24},
  {&(_ZTV7ee75561[22]),  22,24},
  {&(_tg__ZTV6dd5561__7ee75561[4]),  4,5},
  {&(_tg__ZTV5cc561__6dd5561__7ee75561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd5561__7ee75561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee75561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee75561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75561[];
extern  VTBL_ENTRY _ZTV7ee75561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75561[];
static VTBL_ENTRY alt_thunk_names794[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55613barEv,_ZTv0_n16_N6dd55613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55613barEv,_ZThn16_N6dd55613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55613barEv,_ZThn8_N6dd55613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee755613fooEv,_ZTv0_n12_N7ee755613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee755613fooEv,_ZThn24_N7ee755613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee755613barEv,_ZTv0_n16_N7ee755613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee755613barEv,_ZThn24_N7ee755613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee755613barEv,_ZThn16_N7ee755613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee755613barEv,_ZTv0_n20_N7ee755613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee755613barEv,_ZThn8_N7ee755613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75561 = {  "ee75561", // class name
  bases_ee75561, 4,
  &(vtc_ee75561[0]), // expected_vtbl_contents
  &(vtt_ee75561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75561),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names794,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6561  : cc561 {
  int d;
  virtual void  bar(); // _ZN6dd65613barEv
  virtual void  foo(); // _ZN6dd65613fooEv
  ~dd6561(); // tgen
  dd6561(); // tgen
};
//SIG(-1 dd6561) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd6561 ::bar(){vfunc_called(this, "_ZN6dd65613barEv");}
void  dd6561 ::foo(){vfunc_called(this, "_ZN6dd65613fooEv");}
dd6561 ::~dd6561(){ note_dtor("dd6561", this);} // tgen
dd6561 ::dd6561(){ note_ctor("dd6561", this);} // tgen

static void Test_dd6561()
{
  extern Class_Descriptor cd_dd6561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6561, buf);
    dd6561 *dp, &lv = *(dp=new (buf) dd6561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd6561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(16,12), "dd6561");
    check_base_class_offset(lv, (cc561*), 0, "dd6561");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6561.d");
    test_class_info(&lv, &cd_dd6561);
    dp->~dd6561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6561(Test_dd6561, "dd6561", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6561C1Ev();
extern void _ZN6dd6561D1Ev();
Name_Map name_map_dd6561[] = {
  NSPAIR(_ZN6dd6561C1Ev),
  NSPAIR(_ZN6dd6561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd6561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
extern VTBL_ENTRY _ZTV6dd6561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd6561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd6561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd6561[] = {
  {&(_ZTV6dd6561[3]),  3,11},
  {&(_tg__ZTV5cc561__6dd6561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd6561[4]),  4,6},
  {&(_ZTV6dd6561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static VTBL_ENTRY alt_thunk_names795[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6561 = {  "dd6561", // class name
  bases_dd6561, 3,
  &(vtc_dd6561[0]), // expected_vtbl_contents
  &(vtt_dd6561[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6561),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names795,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06561  : dd6561 {
  int e;
  ~ee06561(); // tgen
  ee06561(); // tgen
};
//SIG(1 ee06561) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee06561 ::~ee06561(){ note_dtor("ee06561", this);} // tgen
ee06561 ::ee06561(){ note_ctor("ee06561", this);} // tgen

static void Test_ee06561()
{
  extern Class_Descriptor cd_ee06561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06561, buf);
    ee06561 *dp, &lv = *(dp=new (buf) ee06561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee06561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(24,16), "ee06561");
    check_base_class_offset(lv, (cc561*)(dd6561*), 0, "ee06561");
    check_base_class_offset(lv, (dd6561*), 0, "ee06561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06561.e");
    test_class_info(&lv, &cd_ee06561);
    dp->~ee06561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06561(Test_ee06561, "ee06561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06561C1Ev();
extern void _ZN7ee06561D1Ev();
Name_Map name_map_ee06561[] = {
  NSPAIR(_ZN7ee06561C1Ev),
  NSPAIR(_ZN7ee06561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee06561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
extern VTBL_ENTRY _ZTV7ee06561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee06561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee06561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee06561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee06561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee06561[] = {
  {&(_ZTV7ee06561[3]),  3,11},
  {&(_tg__ZTV6dd6561__7ee06561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee06561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee06561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee06561[4]),  4,6},
  {&(_ZTV7ee06561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06561[];
extern  VTBL_ENTRY _ZTV7ee06561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06561[];
static VTBL_ENTRY alt_thunk_names796[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06561 = {  "ee06561", // class name
  bases_ee06561, 4,
  &(vtc_ee06561[0]), // expected_vtbl_contents
  &(vtt_ee06561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names796,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16561  : virtual dd6561 {
  int e;
  ~ee16561(); // tgen
  ee16561(); // tgen
};
//SIG(1 ee16561) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee16561 ::~ee16561(){ note_dtor("ee16561", this);} // tgen
ee16561 ::ee16561(){ note_ctor("ee16561", this);} // tgen

static void Test_ee16561()
{
  extern Class_Descriptor cd_ee16561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16561, buf);
    ee16561 *dp, &lv = *(dp=new (buf) ee16561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee16561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(32,20), "ee16561");
    check_base_class_offset(lv, (cc561*)(dd6561*), ABISELECT(16,8), "ee16561");
    check_base_class_offset(lv, (dd6561*), ABISELECT(16,8), "ee16561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16561.e");
    test_class_info(&lv, &cd_ee16561);
    dp->~ee16561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16561(Test_ee16561, "ee16561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16561C1Ev();
extern void _ZN7ee16561D1Ev();
Name_Map name_map_ee16561[] = {
  NSPAIR(_ZN7ee16561C1Ev),
  NSPAIR(_ZN7ee16561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee16561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16561[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
extern VTBL_ENTRY _ZTV7ee16561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee16561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee16561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee16561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee16561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee16561[] = {
  {&(_ZTV7ee16561[4]),  4,17},
  {&(_ZTV7ee16561[9]),  9,17},
  {&(_ZTV7ee16561[15]),  15,17},
  {&(_tg__ZTV6dd6561__7ee16561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee16561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee16561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee16561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16561[];
extern  VTBL_ENTRY _ZTV7ee16561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16561[];
static VTBL_ENTRY alt_thunk_names797[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16561 = {  "ee16561", // class name
  bases_ee16561, 4,
  &(vtc_ee16561[0]), // expected_vtbl_contents
  &(vtt_ee16561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names797,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26561  : dd6561 {
  int e;
  virtual void  foo(); // _ZN7ee265613fooEv
  ~ee26561(); // tgen
  ee26561(); // tgen
};
//SIG(1 ee26561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26561 ::foo(){vfunc_called(this, "_ZN7ee265613fooEv");}
ee26561 ::~ee26561(){ note_dtor("ee26561", this);} // tgen
ee26561 ::ee26561(){ note_ctor("ee26561", this);} // tgen

static void Test_ee26561()
{
  extern Class_Descriptor cd_ee26561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26561, buf);
    ee26561 *dp, &lv = *(dp=new (buf) ee26561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee26561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(24,16), "ee26561");
    check_base_class_offset(lv, (cc561*)(dd6561*), 0, "ee26561");
    check_base_class_offset(lv, (dd6561*), 0, "ee26561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26561.e");
    test_class_info(&lv, &cd_ee26561);
    dp->~ee26561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26561(Test_ee26561, "ee26561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26561C1Ev();
extern void _ZN7ee26561D1Ev();
Name_Map name_map_ee26561[] = {
  NSPAIR(_ZN7ee26561C1Ev),
  NSPAIR(_ZN7ee26561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee26561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26561[];
extern void _ZN6dd65613barEv();
extern void _ZN7ee265613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee265613fooEv,_ZTv0_n12_N7ee265613fooEv)();
extern void ABISELECT(_ZThn24_N7ee265613fooEv,_ZThn16_N7ee265613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN7ee265613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee265613fooEv,_ZTv0_n12_N7ee265613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
extern VTBL_ENTRY _ZTV7ee26561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee26561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee26561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee26561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee26561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee26561[] = {
  {&(_ZTV7ee26561[3]),  3,11},
  {&(_tg__ZTV6dd6561__7ee26561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee26561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee26561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee26561[4]),  4,6},
  {&(_ZTV7ee26561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26561[];
extern  VTBL_ENTRY _ZTV7ee26561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26561[];
static VTBL_ENTRY alt_thunk_names798[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee265613fooEv,_ZTv0_n12_N7ee265613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee265613fooEv,_ZThn16_N7ee265613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26561 = {  "ee26561", // class name
  bases_ee26561, 4,
  &(vtc_ee26561[0]), // expected_vtbl_contents
  &(vtt_ee26561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names798,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36561  : virtual dd6561 {
  int e;
  virtual void  foo(); // _ZN7ee365613fooEv
  ~ee36561(); // tgen
  ee36561(); // tgen
};
//SIG(1 ee36561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36561 ::foo(){vfunc_called(this, "_ZN7ee365613fooEv");}
ee36561 ::~ee36561(){ note_dtor("ee36561", this);} // tgen
ee36561 ::ee36561(){ note_ctor("ee36561", this);} // tgen

static void Test_ee36561()
{
  extern Class_Descriptor cd_ee36561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36561, buf);
    ee36561 *dp, &lv = *(dp=new (buf) ee36561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee36561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(32,20), "ee36561");
    check_base_class_offset(lv, (cc561*)(dd6561*), ABISELECT(16,8), "ee36561");
    check_base_class_offset(lv, (dd6561*), ABISELECT(16,8), "ee36561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36561.e");
    test_class_info(&lv, &cd_ee36561);
    dp->~ee36561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36561(Test_ee36561, "ee36561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36561C1Ev();
extern void _ZN7ee36561D1Ev();
Name_Map name_map_ee36561[] = {
  NSPAIR(_ZN7ee36561C1Ev),
  NSPAIR(_ZN7ee36561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee36561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36561[];
extern void _ZN7ee365613fooEv();
extern void _ZN6dd65613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee365613fooEv,_ZTv0_n20_N7ee365613fooEv)();
extern void ABISELECT(_ZThn16_N7ee365613fooEv,_ZThn8_N7ee365613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee365613fooEv,_ZTv0_n12_N7ee365613fooEv)();
extern void ABISELECT(_ZThn32_N7ee365613fooEv,_ZThn20_N7ee365613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36561[0]),
  (VTBL_ENTRY)&_ZN7ee365613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee365613fooEv,_ZTv0_n20_N7ee365613fooEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee365613fooEv,_ZTv0_n12_N7ee365613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
extern VTBL_ENTRY _ZTV7ee36561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee36561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee36561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee36561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee36561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee36561[] = {
  {&(_ZTV7ee36561[4]),  4,18},
  {&(_ZTV7ee36561[10]),  10,18},
  {&(_ZTV7ee36561[16]),  16,18},
  {&(_tg__ZTV6dd6561__7ee36561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee36561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee36561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee36561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36561[];
extern  VTBL_ENTRY _ZTV7ee36561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36561[];
static VTBL_ENTRY alt_thunk_names799[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee365613fooEv,_ZTv0_n12_N7ee365613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee365613fooEv,_ZThn20_N7ee365613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee365613fooEv,_ZTv0_n20_N7ee365613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee365613fooEv,_ZThn8_N7ee365613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36561 = {  "ee36561", // class name
  bases_ee36561, 4,
  &(vtc_ee36561[0]), // expected_vtbl_contents
  &(vtt_ee36561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36561),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names799,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46561  : dd6561 {
  int e;
  virtual void  bar(); // _ZN7ee465613barEv
  ~ee46561(); // tgen
  ee46561(); // tgen
};
//SIG(1 ee46561) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46561 ::bar(){vfunc_called(this, "_ZN7ee465613barEv");}
ee46561 ::~ee46561(){ note_dtor("ee46561", this);} // tgen
ee46561 ::ee46561(){ note_ctor("ee46561", this);} // tgen

static void Test_ee46561()
{
  extern Class_Descriptor cd_ee46561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46561, buf);
    ee46561 *dp, &lv = *(dp=new (buf) ee46561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee46561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(24,16), "ee46561");
    check_base_class_offset(lv, (cc561*)(dd6561*), 0, "ee46561");
    check_base_class_offset(lv, (dd6561*), 0, "ee46561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46561.e");
    test_class_info(&lv, &cd_ee46561);
    dp->~ee46561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46561(Test_ee46561, "ee46561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46561C1Ev();
extern void _ZN7ee46561D1Ev();
Name_Map name_map_ee46561[] = {
  NSPAIR(_ZN7ee46561C1Ev),
  NSPAIR(_ZN7ee46561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee46561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46561[];
extern void _ZN7ee465613barEv();
extern void _ZN6dd65613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee465613barEv,_ZTv0_n16_N7ee465613barEv)();
extern void ABISELECT(_ZThn24_N7ee465613barEv,_ZThn16_N7ee465613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46561[0]),
  (VTBL_ENTRY)&_ZN7ee465613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee465613barEv,_ZTv0_n16_N7ee465613barEv),
};
extern VTBL_ENTRY _ZTV7ee46561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee46561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee46561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee46561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee46561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee46561[] = {
  {&(_ZTV7ee46561[3]),  3,11},
  {&(_tg__ZTV6dd6561__7ee46561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee46561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee46561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee46561[4]),  4,6},
  {&(_ZTV7ee46561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46561[];
extern  VTBL_ENTRY _ZTV7ee46561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46561[];
static VTBL_ENTRY alt_thunk_names800[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee465613barEv,_ZTv0_n16_N7ee465613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee465613barEv,_ZThn16_N7ee465613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46561 = {  "ee46561", // class name
  bases_ee46561, 4,
  &(vtc_ee46561[0]), // expected_vtbl_contents
  &(vtt_ee46561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names800,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56561  : virtual dd6561 {
  int e;
  virtual void  bar(); // _ZN7ee565613barEv
  ~ee56561(); // tgen
  ee56561(); // tgen
};
//SIG(1 ee56561) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56561 ::bar(){vfunc_called(this, "_ZN7ee565613barEv");}
ee56561 ::~ee56561(){ note_dtor("ee56561", this);} // tgen
ee56561 ::ee56561(){ note_ctor("ee56561", this);} // tgen

static void Test_ee56561()
{
  extern Class_Descriptor cd_ee56561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56561, buf);
    ee56561 *dp, &lv = *(dp=new (buf) ee56561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee56561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(32,20), "ee56561");
    check_base_class_offset(lv, (cc561*)(dd6561*), ABISELECT(16,8), "ee56561");
    check_base_class_offset(lv, (dd6561*), ABISELECT(16,8), "ee56561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56561.e");
    test_class_info(&lv, &cd_ee56561);
    dp->~ee56561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56561(Test_ee56561, "ee56561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56561C1Ev();
extern void _ZN7ee56561D1Ev();
Name_Map name_map_ee56561[] = {
  NSPAIR(_ZN7ee56561C1Ev),
  NSPAIR(_ZN7ee56561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee56561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56561[];
extern void _ZN7ee565613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee565613barEv,_ZTv0_n16_N7ee565613barEv)();
extern void ABISELECT(_ZThn16_N7ee565613barEv,_ZThn8_N7ee565613barEv)() __attribute__((weak));
extern void _ZN6dd65613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee565613barEv,_ZTv0_n16_N7ee565613barEv)();
extern void ABISELECT(_ZThn32_N7ee565613barEv,_ZThn20_N7ee565613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56561[0]),
  (VTBL_ENTRY)&_ZN7ee565613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee565613barEv,_ZTv0_n16_N7ee565613barEv),
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee565613barEv,_ZTv0_n16_N7ee565613barEv),
};
extern VTBL_ENTRY _ZTV7ee56561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee56561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee56561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee56561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee56561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee56561[] = {
  {&(_ZTV7ee56561[4]),  4,18},
  {&(_ZTV7ee56561[10]),  10,18},
  {&(_ZTV7ee56561[16]),  16,18},
  {&(_tg__ZTV6dd6561__7ee56561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee56561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee56561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee56561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56561[];
extern  VTBL_ENTRY _ZTV7ee56561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56561[];
static VTBL_ENTRY alt_thunk_names801[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee565613barEv,_ZTv0_n16_N7ee565613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee565613barEv,_ZThn20_N7ee565613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee565613barEv,_ZThn8_N7ee565613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56561 = {  "ee56561", // class name
  bases_ee56561, 4,
  &(vtc_ee56561[0]), // expected_vtbl_contents
  &(vtt_ee56561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56561),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names801,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66561  : dd6561 {
  int e;
  virtual void  foo(); // _ZN7ee665613fooEv
  virtual void  bar(); // _ZN7ee665613barEv
  ~ee66561(); // tgen
  ee66561(); // tgen
};
//SIG(1 ee66561) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66561 ::foo(){vfunc_called(this, "_ZN7ee665613fooEv");}
void  ee66561 ::bar(){vfunc_called(this, "_ZN7ee665613barEv");}
ee66561 ::~ee66561(){ note_dtor("ee66561", this);} // tgen
ee66561 ::ee66561(){ note_ctor("ee66561", this);} // tgen

static void Test_ee66561()
{
  extern Class_Descriptor cd_ee66561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66561, buf);
    ee66561 *dp, &lv = *(dp=new (buf) ee66561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee66561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(24,16), "ee66561");
    check_base_class_offset(lv, (cc561*)(dd6561*), 0, "ee66561");
    check_base_class_offset(lv, (dd6561*), 0, "ee66561");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66561.e");
    test_class_info(&lv, &cd_ee66561);
    dp->~ee66561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66561(Test_ee66561, "ee66561", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66561C1Ev();
extern void _ZN7ee66561D1Ev();
Name_Map name_map_ee66561[] = {
  NSPAIR(_ZN7ee66561C1Ev),
  NSPAIR(_ZN7ee66561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee66561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66561[];
extern void _ZN7ee665613barEv();
extern void _ZN7ee665613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee665613fooEv,_ZTv0_n12_N7ee665613fooEv)();
extern void ABISELECT(_ZThn24_N7ee665613fooEv,_ZThn16_N7ee665613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee665613barEv,_ZTv0_n16_N7ee665613barEv)();
extern void ABISELECT(_ZThn24_N7ee665613barEv,_ZThn16_N7ee665613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66561[0]),
  (VTBL_ENTRY)&_ZN7ee665613barEv,
  (VTBL_ENTRY)&_ZN7ee665613fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee665613fooEv,_ZTv0_n12_N7ee665613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee665613barEv,_ZTv0_n16_N7ee665613barEv),
};
extern VTBL_ENTRY _ZTV7ee66561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee66561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee66561[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee66561[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee66561[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee66561[] = {
  {&(_ZTV7ee66561[3]),  3,11},
  {&(_tg__ZTV6dd6561__7ee66561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee66561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee66561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee66561[4]),  4,6},
  {&(_ZTV7ee66561[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66561[];
extern  VTBL_ENTRY _ZTV7ee66561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66561[];
static VTBL_ENTRY alt_thunk_names802[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613barEv,_ZThn16_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65613fooEv,_ZThn16_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5613barEv,_ZThn16_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee665613barEv,_ZTv0_n16_N7ee665613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee665613barEv,_ZThn16_N7ee665613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee665613fooEv,_ZTv0_n12_N7ee665613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee665613fooEv,_ZThn16_N7ee665613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66561 = {  "ee66561", // class name
  bases_ee66561, 4,
  &(vtc_ee66561[0]), // expected_vtbl_contents
  &(vtt_ee66561[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66561),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66561),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names802,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76561  : virtual dd6561 {
  int e;
  virtual void  foo(); // _ZN7ee765613fooEv
  virtual void  bar(); // _ZN7ee765613barEv
  ~ee76561(); // tgen
  ee76561(); // tgen
};
//SIG(1 ee76561) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76561 ::foo(){vfunc_called(this, "_ZN7ee765613fooEv");}
void  ee76561 ::bar(){vfunc_called(this, "_ZN7ee765613barEv");}
ee76561 ::~ee76561(){ note_dtor("ee76561", this);} // tgen
ee76561 ::ee76561(){ note_ctor("ee76561", this);} // tgen

static void Test_ee76561()
{
  extern Class_Descriptor cd_ee76561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76561, buf);
    ee76561 *dp, &lv = *(dp=new (buf) ee76561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee76561");
    check_base_class_offset(lv, (bb61*)(cc561*)(dd6561*), ABISELECT(32,20), "ee76561");
    check_base_class_offset(lv, (cc561*)(dd6561*), ABISELECT(16,8), "ee76561");
    check_base_class_offset(lv, (dd6561*), ABISELECT(16,8), "ee76561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76561.e");
    test_class_info(&lv, &cd_ee76561);
    dp->~ee76561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76561(Test_ee76561, "ee76561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76561C1Ev();
extern void _ZN7ee76561D1Ev();
Name_Map name_map_ee76561[] = {
  NSPAIR(_ZN7ee76561C1Ev),
  NSPAIR(_ZN7ee76561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd6561;
extern VTBL_ENTRY _ZTI6dd6561[];
extern  VTBL_ENTRY _ZTV6dd6561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6561[];
static Base_Class bases_ee76561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc561,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76561[];
extern void _ZN7ee765613fooEv();
extern void _ZN7ee765613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee765613barEv,_ZTv0_n16_N7ee765613barEv)();
extern void ABISELECT(_ZThn16_N7ee765613barEv,_ZThn8_N7ee765613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee765613fooEv,_ZTv0_n20_N7ee765613fooEv)();
extern void ABISELECT(_ZThn16_N7ee765613fooEv,_ZThn8_N7ee765613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee765613fooEv,_ZTv0_n12_N7ee765613fooEv)();
extern void ABISELECT(_ZThn32_N7ee765613fooEv,_ZThn20_N7ee765613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee765613barEv,_ZTv0_n16_N7ee765613barEv)();
extern void ABISELECT(_ZThn32_N7ee765613barEv,_ZThn20_N7ee765613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76561[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76561[0]),
  (VTBL_ENTRY)&_ZN7ee765613fooEv,
  (VTBL_ENTRY)&_ZN7ee765613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee765613barEv,_ZTv0_n16_N7ee765613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee765613fooEv,_ZTv0_n20_N7ee765613fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee765613fooEv,_ZTv0_n12_N7ee765613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee765613barEv,_ZTv0_n16_N7ee765613barEv),
};
extern VTBL_ENTRY _ZTV7ee76561[];
extern void _ZN6dd65613barEv();
extern void _ZN6dd65613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6561__7ee76561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&_ZN6dd65613barEv,
  (VTBL_ENTRY)&_ZN6dd65613fooEv,
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc5616dd6561__7ee76561[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc5616dd6561__7ee76561[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv)();
extern void ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv)();
extern void ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6561__7ee76561[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv),
};
static  VTT_ENTRY vtt_ee76561[] = {
  {&(_ZTV7ee76561[4]),  4,19},
  {&(_ZTV7ee76561[11]),  11,19},
  {&(_ZTV7ee76561[17]),  17,19},
  {&(_tg__ZTV6dd6561__7ee76561[3]),  3,5},
  {&(_tg__ZTV5cc5616dd6561__7ee76561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc5616dd6561__7ee76561[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6561__7ee76561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76561[];
extern  VTBL_ENTRY _ZTV7ee76561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76561[];
static VTBL_ENTRY alt_thunk_names803[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65613barEv,_ZTv0_n16_N6dd65613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613barEv,_ZThn12_N6dd65613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65613fooEv,_ZTv0_n12_N6dd65613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65613fooEv,_ZThn12_N6dd65613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn12_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee765613fooEv,_ZTv0_n12_N7ee765613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee765613fooEv,_ZThn20_N7ee765613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee765613fooEv,_ZTv0_n20_N7ee765613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee765613fooEv,_ZThn8_N7ee765613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee765613barEv,_ZTv0_n16_N7ee765613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee765613barEv,_ZThn20_N7ee765613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee765613barEv,_ZThn8_N7ee765613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76561 = {  "ee76561", // class name
  bases_ee76561, 4,
  &(vtc_ee76561[0]), // expected_vtbl_contents
  &(vtt_ee76561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76561),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76561),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names803,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7561  : virtual cc561 {
  int d;
  virtual void  bar(); // _ZN6dd75613barEv
  virtual void  foo(); // _ZN6dd75613fooEv
  ~dd7561(); // tgen
  dd7561(); // tgen
};
//SIG(-1 dd7561) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd7561 ::bar(){vfunc_called(this, "_ZN6dd75613barEv");}
void  dd7561 ::foo(){vfunc_called(this, "_ZN6dd75613fooEv");}
dd7561 ::~dd7561(){ note_dtor("dd7561", this);} // tgen
dd7561 ::dd7561(){ note_ctor("dd7561", this);} // tgen

static void Test_dd7561()
{
  extern Class_Descriptor cd_dd7561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7561, buf);
    dd7561 *dp, &lv = *(dp=new (buf) dd7561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd7561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,16), "dd7561");
    check_base_class_offset(lv, (cc561*), ABISELECT(16,8), "dd7561");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7561.d");
    test_class_info(&lv, &cd_dd7561);
    dp->~dd7561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7561(Test_dd7561, "dd7561", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7561C1Ev();
extern void _ZN6dd7561D1Ev();
Name_Map name_map_dd7561[] = {
  NSPAIR(_ZN6dd7561C1Ev),
  NSPAIR(_ZN6dd7561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
static Base_Class bases_dd7561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc561,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern VTBL_ENTRY _ZTV6dd7561[];
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__6dd7561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_dd7561[] = {
  {&(_ZTV6dd7561[4]),  4,17},
  {&(_ZTV6dd7561[10]),  10,17},
  {&(_ZTV6dd7561[15]),  15,17},
  {&(_tg__ZTV5cc561__6dd7561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__6dd7561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static VTBL_ENTRY alt_thunk_names804[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7561 = {  "dd7561", // class name
  bases_dd7561, 3,
  &(vtc_dd7561[0]), // expected_vtbl_contents
  &(vtt_dd7561[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7561),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names804,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07561  : dd7561 {
  int e;
  ~ee07561(); // tgen
  ee07561(); // tgen
};
//SIG(1 ee07561) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee07561 ::~ee07561(){ note_dtor("ee07561", this);} // tgen
ee07561 ::ee07561(){ note_ctor("ee07561", this);} // tgen

static void Test_ee07561()
{
  extern Class_Descriptor cd_ee07561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07561, buf);
    ee07561 *dp, &lv = *(dp=new (buf) ee07561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee07561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee07561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(16,12), "ee07561");
    check_base_class_offset(lv, (dd7561*), 0, "ee07561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07561.e");
    test_class_info(&lv, &cd_ee07561);
    dp->~ee07561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07561(Test_ee07561, "ee07561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07561C1Ev();
extern void _ZN7ee07561D1Ev();
Name_Map name_map_ee07561[] = {
  NSPAIR(_ZN7ee07561C1Ev),
  NSPAIR(_ZN7ee07561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee07561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern VTBL_ENTRY _ZTV7ee07561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee07561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee07561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee07561[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee07561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee07561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee07561[] = {
  {&(_ZTV7ee07561[4]),  4,17},
  {&(_tg__ZTV6dd7561__7ee07561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee07561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee07561[4]),  4,6},
  {&(_ZTV7ee07561[10]),  10,17},
  {&(_ZTV7ee07561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee07561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee07561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07561[];
extern  VTBL_ENTRY _ZTV7ee07561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07561[];
static VTBL_ENTRY alt_thunk_names805[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07561 = {  "ee07561", // class name
  bases_ee07561, 4,
  &(vtc_ee07561[0]), // expected_vtbl_contents
  &(vtt_ee07561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names805,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17561  : virtual dd7561 {
  int e;
  ~ee17561(); // tgen
  ee17561(); // tgen
};
//SIG(1 ee17561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee17561 ::~ee17561(){ note_dtor("ee17561", this);} // tgen
ee17561 ::ee17561(){ note_ctor("ee17561", this);} // tgen

static void Test_ee17561()
{
  extern Class_Descriptor cd_ee17561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17561, buf);
    ee17561 *dp, &lv = *(dp=new (buf) ee17561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee17561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee17561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(32,16), "ee17561");
    check_base_class_offset(lv, (dd7561*), ABISELECT(16,8), "ee17561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17561.e");
    test_class_info(&lv, &cd_ee17561);
    dp->~ee17561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17561(Test_ee17561, "ee17561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17561C1Ev();
extern void _ZN7ee17561D1Ev();
Name_Map name_map_ee17561[] = {
  NSPAIR(_ZN7ee17561C1Ev),
  NSPAIR(_ZN7ee17561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee17561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17561[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern VTBL_ENTRY _ZTV7ee17561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee17561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee17561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee17561[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee17561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee17561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee17561[] = {
  {&(_ZTV7ee17561[5]),  5,24},
  {&(_ZTV7ee17561[11]),  11,24},
  {&(_ZTV7ee17561[17]),  17,24},
  {&(_ZTV7ee17561[22]),  22,24},
  {&(_tg__ZTV6dd7561__7ee17561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee17561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee17561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee17561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee17561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17561[];
extern  VTBL_ENTRY _ZTV7ee17561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17561[];
static VTBL_ENTRY alt_thunk_names806[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17561 = {  "ee17561", // class name
  bases_ee17561, 4,
  &(vtc_ee17561[0]), // expected_vtbl_contents
  &(vtt_ee17561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17561),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names806,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27561  : dd7561 {
  int e;
  virtual void  foo(); // _ZN7ee275613fooEv
  ~ee27561(); // tgen
  ee27561(); // tgen
};
//SIG(1 ee27561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27561 ::foo(){vfunc_called(this, "_ZN7ee275613fooEv");}
ee27561 ::~ee27561(){ note_dtor("ee27561", this);} // tgen
ee27561 ::ee27561(){ note_ctor("ee27561", this);} // tgen

static void Test_ee27561()
{
  extern Class_Descriptor cd_ee27561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27561, buf);
    ee27561 *dp, &lv = *(dp=new (buf) ee27561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee27561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee27561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(16,12), "ee27561");
    check_base_class_offset(lv, (dd7561*), 0, "ee27561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27561.e");
    test_class_info(&lv, &cd_ee27561);
    dp->~ee27561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27561(Test_ee27561, "ee27561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27561C1Ev();
extern void _ZN7ee27561D1Ev();
Name_Map name_map_ee27561[] = {
  NSPAIR(_ZN7ee27561C1Ev),
  NSPAIR(_ZN7ee27561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee27561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27561[];
extern void _ZN6dd75613barEv();
extern void _ZN7ee275613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee275613fooEv,_ZTv0_n12_N7ee275613fooEv)();
extern void ABISELECT(_ZThn32_N7ee275613fooEv,_ZThn20_N7ee275613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN7ee275613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee275613fooEv,_ZTv0_n12_N7ee275613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern VTBL_ENTRY _ZTV7ee27561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee27561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee27561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee27561[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee27561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee27561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee27561[] = {
  {&(_ZTV7ee27561[4]),  4,17},
  {&(_tg__ZTV6dd7561__7ee27561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee27561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee27561[4]),  4,6},
  {&(_ZTV7ee27561[10]),  10,17},
  {&(_ZTV7ee27561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee27561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee27561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27561[];
extern  VTBL_ENTRY _ZTV7ee27561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27561[];
static VTBL_ENTRY alt_thunk_names807[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee275613fooEv,_ZTv0_n12_N7ee275613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee275613fooEv,_ZThn20_N7ee275613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27561 = {  "ee27561", // class name
  bases_ee27561, 4,
  &(vtc_ee27561[0]), // expected_vtbl_contents
  &(vtt_ee27561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names807,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37561  : virtual dd7561 {
  int e;
  virtual void  foo(); // _ZN7ee375613fooEv
  ~ee37561(); // tgen
  ee37561(); // tgen
};
//SIG(1 ee37561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37561 ::foo(){vfunc_called(this, "_ZN7ee375613fooEv");}
ee37561 ::~ee37561(){ note_dtor("ee37561", this);} // tgen
ee37561 ::ee37561(){ note_ctor("ee37561", this);} // tgen

static void Test_ee37561()
{
  extern Class_Descriptor cd_ee37561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37561, buf);
    ee37561 *dp, &lv = *(dp=new (buf) ee37561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee37561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee37561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(32,16), "ee37561");
    check_base_class_offset(lv, (dd7561*), ABISELECT(16,8), "ee37561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37561.e");
    test_class_info(&lv, &cd_ee37561);
    dp->~ee37561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37561(Test_ee37561, "ee37561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37561C1Ev();
extern void _ZN7ee37561D1Ev();
Name_Map name_map_ee37561[] = {
  NSPAIR(_ZN7ee37561C1Ev),
  NSPAIR(_ZN7ee37561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee37561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37561[];
extern void _ZN7ee375613fooEv();
extern void _ZN6dd75613barEv();
extern void ABISELECT(_ZTv0_n48_N7ee375613fooEv,_ZTv0_n24_N7ee375613fooEv)();
extern void ABISELECT(_ZThn16_N7ee375613fooEv,_ZThn8_N7ee375613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee375613fooEv,_ZTv0_n12_N7ee375613fooEv)();
extern void ABISELECT(_ZThn48_N7ee375613fooEv,_ZThn24_N7ee375613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37561[0]),
  (VTBL_ENTRY)&_ZN7ee375613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee375613fooEv,_ZTv0_n24_N7ee375613fooEv),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee375613fooEv,_ZTv0_n12_N7ee375613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern VTBL_ENTRY _ZTV7ee37561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee37561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee37561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee37561[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee37561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee37561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee37561[] = {
  {&(_ZTV7ee37561[5]),  5,25},
  {&(_ZTV7ee37561[12]),  12,25},
  {&(_ZTV7ee37561[18]),  18,25},
  {&(_ZTV7ee37561[23]),  23,25},
  {&(_tg__ZTV6dd7561__7ee37561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee37561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee37561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee37561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee37561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37561[];
extern  VTBL_ENTRY _ZTV7ee37561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37561[];
static VTBL_ENTRY alt_thunk_names808[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee375613fooEv,_ZTv0_n12_N7ee375613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee375613fooEv,_ZThn24_N7ee375613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee375613fooEv,_ZTv0_n24_N7ee375613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee375613fooEv,_ZThn8_N7ee375613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37561 = {  "ee37561", // class name
  bases_ee37561, 4,
  &(vtc_ee37561[0]), // expected_vtbl_contents
  &(vtt_ee37561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37561),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names808,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47561  : dd7561 {
  int e;
  virtual void  bar(); // _ZN7ee475613barEv
  ~ee47561(); // tgen
  ee47561(); // tgen
};
//SIG(1 ee47561) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47561 ::bar(){vfunc_called(this, "_ZN7ee475613barEv");}
ee47561 ::~ee47561(){ note_dtor("ee47561", this);} // tgen
ee47561 ::ee47561(){ note_ctor("ee47561", this);} // tgen

static void Test_ee47561()
{
  extern Class_Descriptor cd_ee47561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47561, buf);
    ee47561 *dp, &lv = *(dp=new (buf) ee47561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee47561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee47561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(16,12), "ee47561");
    check_base_class_offset(lv, (dd7561*), 0, "ee47561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47561.e");
    test_class_info(&lv, &cd_ee47561);
    dp->~ee47561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47561(Test_ee47561, "ee47561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47561C1Ev();
extern void _ZN7ee47561D1Ev();
Name_Map name_map_ee47561[] = {
  NSPAIR(_ZN7ee47561C1Ev),
  NSPAIR(_ZN7ee47561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee47561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47561[];
extern void _ZN7ee475613barEv();
extern void _ZN6dd75613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee475613barEv,_ZTv0_n16_N7ee475613barEv)();
extern void ABISELECT(_ZThn16_N7ee475613barEv,_ZThn12_N7ee475613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee475613barEv,_ZTv0_n16_N7ee475613barEv)();
extern void ABISELECT(_ZThn32_N7ee475613barEv,_ZThn20_N7ee475613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47561[0]),
  (VTBL_ENTRY)&_ZN7ee475613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee475613barEv,_ZTv0_n16_N7ee475613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee475613barEv,_ZTv0_n16_N7ee475613barEv),
};
extern VTBL_ENTRY _ZTV7ee47561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee47561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee47561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee47561[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee47561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee47561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee47561[] = {
  {&(_ZTV7ee47561[4]),  4,17},
  {&(_tg__ZTV6dd7561__7ee47561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee47561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee47561[4]),  4,6},
  {&(_ZTV7ee47561[10]),  10,17},
  {&(_ZTV7ee47561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee47561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee47561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47561[];
extern  VTBL_ENTRY _ZTV7ee47561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47561[];
static VTBL_ENTRY alt_thunk_names809[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee475613barEv,_ZTv0_n16_N7ee475613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee475613barEv,_ZThn20_N7ee475613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee475613barEv,_ZThn12_N7ee475613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47561 = {  "ee47561", // class name
  bases_ee47561, 4,
  &(vtc_ee47561[0]), // expected_vtbl_contents
  &(vtt_ee47561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names809,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57561  : virtual dd7561 {
  int e;
  virtual void  bar(); // _ZN7ee575613barEv
  ~ee57561(); // tgen
  ee57561(); // tgen
};
//SIG(1 ee57561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57561 ::bar(){vfunc_called(this, "_ZN7ee575613barEv");}
ee57561 ::~ee57561(){ note_dtor("ee57561", this);} // tgen
ee57561 ::ee57561(){ note_ctor("ee57561", this);} // tgen

static void Test_ee57561()
{
  extern Class_Descriptor cd_ee57561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57561, buf);
    ee57561 *dp, &lv = *(dp=new (buf) ee57561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee57561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee57561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(32,16), "ee57561");
    check_base_class_offset(lv, (dd7561*), ABISELECT(16,8), "ee57561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57561.e");
    test_class_info(&lv, &cd_ee57561);
    dp->~ee57561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57561(Test_ee57561, "ee57561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57561C1Ev();
extern void _ZN7ee57561D1Ev();
Name_Map name_map_ee57561[] = {
  NSPAIR(_ZN7ee57561C1Ev),
  NSPAIR(_ZN7ee57561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee57561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc561,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57561[];
extern void _ZN7ee575613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee575613barEv,_ZTv0_n20_N7ee575613barEv)();
extern void ABISELECT(_ZThn16_N7ee575613barEv,_ZThn8_N7ee575613barEv)() __attribute__((weak));
extern void _ZN6dd75613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee575613barEv,_ZTv0_n16_N7ee575613barEv)();
extern void ABISELECT(_ZThn32_N7ee575613barEv,_ZThn16_N7ee575613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee575613barEv,_ZTv0_n16_N7ee575613barEv)();
extern void ABISELECT(_ZThn48_N7ee575613barEv,_ZThn24_N7ee575613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57561[0]),
  (VTBL_ENTRY)&_ZN7ee575613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee575613barEv,_ZTv0_n20_N7ee575613barEv),
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee575613barEv,_ZTv0_n16_N7ee575613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee575613barEv,_ZTv0_n16_N7ee575613barEv),
};
extern VTBL_ENTRY _ZTV7ee57561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee57561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee57561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee57561[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee57561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee57561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee57561[] = {
  {&(_ZTV7ee57561[5]),  5,25},
  {&(_ZTV7ee57561[12]),  12,25},
  {&(_ZTV7ee57561[18]),  18,25},
  {&(_ZTV7ee57561[23]),  23,25},
  {&(_tg__ZTV6dd7561__7ee57561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee57561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee57561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee57561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee57561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57561[];
extern  VTBL_ENTRY _ZTV7ee57561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57561[];
static VTBL_ENTRY alt_thunk_names810[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee575613barEv,_ZTv0_n16_N7ee575613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee575613barEv,_ZThn24_N7ee575613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee575613barEv,_ZThn16_N7ee575613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee575613barEv,_ZTv0_n20_N7ee575613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee575613barEv,_ZThn8_N7ee575613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57561 = {  "ee57561", // class name
  bases_ee57561, 4,
  &(vtc_ee57561[0]), // expected_vtbl_contents
  &(vtt_ee57561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57561),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names810,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67561  : dd7561 {
  int e;
  virtual void  foo(); // _ZN7ee675613fooEv
  virtual void  bar(); // _ZN7ee675613barEv
  ~ee67561(); // tgen
  ee67561(); // tgen
};
//SIG(1 ee67561) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67561 ::foo(){vfunc_called(this, "_ZN7ee675613fooEv");}
void  ee67561 ::bar(){vfunc_called(this, "_ZN7ee675613barEv");}
ee67561 ::~ee67561(){ note_dtor("ee67561", this);} // tgen
ee67561 ::ee67561(){ note_ctor("ee67561", this);} // tgen

static void Test_ee67561()
{
  extern Class_Descriptor cd_ee67561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67561, buf);
    ee67561 *dp, &lv = *(dp=new (buf) ee67561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee67561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(32,20), "ee67561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(16,12), "ee67561");
    check_base_class_offset(lv, (dd7561*), 0, "ee67561");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67561.e");
    test_class_info(&lv, &cd_ee67561);
    dp->~ee67561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67561(Test_ee67561, "ee67561", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67561C1Ev();
extern void _ZN7ee67561D1Ev();
Name_Map name_map_ee67561[] = {
  NSPAIR(_ZN7ee67561C1Ev),
  NSPAIR(_ZN7ee67561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee67561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67561[];
extern void _ZN7ee675613barEv();
extern void _ZN7ee675613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee675613barEv,_ZTv0_n16_N7ee675613barEv)();
extern void ABISELECT(_ZThn16_N7ee675613barEv,_ZThn12_N7ee675613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee675613fooEv,_ZTv0_n12_N7ee675613fooEv)();
extern void ABISELECT(_ZThn32_N7ee675613fooEv,_ZThn20_N7ee675613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee675613barEv,_ZTv0_n16_N7ee675613barEv)();
extern void ABISELECT(_ZThn32_N7ee675613barEv,_ZThn20_N7ee675613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67561[0]),
  (VTBL_ENTRY)&_ZN7ee675613barEv,
  (VTBL_ENTRY)&_ZN7ee675613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee675613barEv,_ZTv0_n16_N7ee675613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee675613fooEv,_ZTv0_n12_N7ee675613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee675613barEv,_ZTv0_n16_N7ee675613barEv),
};
extern VTBL_ENTRY _ZTV7ee67561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee67561[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee67561[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee67561[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee67561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee67561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee67561[] = {
  {&(_ZTV7ee67561[4]),  4,17},
  {&(_tg__ZTV6dd7561__7ee67561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee67561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee67561[4]),  4,6},
  {&(_ZTV7ee67561[10]),  10,17},
  {&(_ZTV7ee67561[15]),  15,17},
  {&(_tg__ZTV5cc561__7ee67561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee67561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67561[];
extern  VTBL_ENTRY _ZTV7ee67561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67561[];
static VTBL_ENTRY alt_thunk_names811[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn20_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn20_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn12_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee675613fooEv,_ZTv0_n12_N7ee675613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee675613fooEv,_ZThn20_N7ee675613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee675613barEv,_ZTv0_n16_N7ee675613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee675613barEv,_ZThn20_N7ee675613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee675613barEv,_ZThn12_N7ee675613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67561 = {  "ee67561", // class name
  bases_ee67561, 4,
  &(vtc_ee67561[0]), // expected_vtbl_contents
  &(vtt_ee67561[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67561),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67561),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67561),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names811,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77561  : virtual dd7561 {
  int e;
  virtual void  foo(); // _ZN7ee775613fooEv
  virtual void  bar(); // _ZN7ee775613barEv
  ~ee77561(); // tgen
  ee77561(); // tgen
};
//SIG(1 ee77561) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77561 ::foo(){vfunc_called(this, "_ZN7ee775613fooEv");}
void  ee77561 ::bar(){vfunc_called(this, "_ZN7ee775613barEv");}
ee77561 ::~ee77561(){ note_dtor("ee77561", this);} // tgen
ee77561 ::ee77561(){ note_ctor("ee77561", this);} // tgen

static void Test_ee77561()
{
  extern Class_Descriptor cd_ee77561;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77561, buf);
    ee77561 *dp, &lv = *(dp=new (buf) ee77561());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77561)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77561)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee77561");
    check_base_class_offset(lv, (bb61*)(cc561*), ABISELECT(48,24), "ee77561");
    check_base_class_offset(lv, (cc561*)(dd7561*), ABISELECT(32,16), "ee77561");
    check_base_class_offset(lv, (dd7561*), ABISELECT(16,8), "ee77561");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77561.e");
    test_class_info(&lv, &cd_ee77561);
    dp->~ee77561();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77561(Test_ee77561, "ee77561", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77561C1Ev();
extern void _ZN7ee77561D1Ev();
Name_Map name_map_ee77561[] = {
  NSPAIR(_ZN7ee77561C1Ev),
  NSPAIR(_ZN7ee77561D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc561;
extern VTBL_ENTRY _ZTI5cc561[];
extern  VTBL_ENTRY _ZTV5cc561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc561[];
extern Class_Descriptor cd_dd7561;
extern VTBL_ENTRY _ZTI6dd7561[];
extern  VTBL_ENTRY _ZTV6dd7561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7561[];
static Base_Class bases_ee77561[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc561,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7561,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77561[];
extern void _ZN7ee775613fooEv();
extern void _ZN7ee775613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee775613barEv,_ZTv0_n20_N7ee775613barEv)();
extern void ABISELECT(_ZThn16_N7ee775613barEv,_ZThn8_N7ee775613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee775613fooEv,_ZTv0_n24_N7ee775613fooEv)();
extern void ABISELECT(_ZThn16_N7ee775613fooEv,_ZThn8_N7ee775613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee775613barEv,_ZTv0_n16_N7ee775613barEv)();
extern void ABISELECT(_ZThn32_N7ee775613barEv,_ZThn16_N7ee775613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee775613fooEv,_ZTv0_n12_N7ee775613fooEv)();
extern void ABISELECT(_ZThn48_N7ee775613fooEv,_ZThn24_N7ee775613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee775613barEv,_ZTv0_n16_N7ee775613barEv)();
extern void ABISELECT(_ZThn48_N7ee775613barEv,_ZThn24_N7ee775613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77561[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77561[0]),
  (VTBL_ENTRY)&_ZN7ee775613fooEv,
  (VTBL_ENTRY)&_ZN7ee775613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee775613barEv,_ZTv0_n20_N7ee775613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee775613fooEv,_ZTv0_n24_N7ee775613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee775613barEv,_ZTv0_n16_N7ee775613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee775613fooEv,_ZTv0_n12_N7ee775613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee775613barEv,_ZTv0_n16_N7ee775613barEv),
};
extern VTBL_ENTRY _ZTV7ee77561[];
extern void _ZN6dd75613barEv();
extern void _ZN6dd75613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7561__7ee77561[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&_ZN6dd75613barEv,
  (VTBL_ENTRY)&_ZN6dd75613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc561__6dd7561__7ee77561[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv)();
extern void ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv)();
extern void ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7561__7ee77561[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7561[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv),
};
extern void _ZN5cc5613barEv();
static  VTBL_ENTRY _tg__ZTV5cc561__7ee77561[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN5cc5613barEv,
};
extern void _ZN4bb613fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv)();
extern void ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc561__7ee77561[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc561[0]),
  (VTBL_ENTRY)&_ZN4bb613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv),
};
static  VTT_ENTRY vtt_ee77561[] = {
  {&(_ZTV7ee77561[5]),  5,26},
  {&(_ZTV7ee77561[13]),  13,26},
  {&(_ZTV7ee77561[19]),  19,26},
  {&(_ZTV7ee77561[24]),  24,26},
  {&(_tg__ZTV6dd7561__7ee77561[4]),  4,6},
  {&(_tg__ZTV5cc561__6dd7561__7ee77561[4]),  4,5},
  {&(_tg__ZTV4bb61__6dd7561__7ee77561[4]),  4,6},
  {&(_tg__ZTV5cc561__7ee77561[3]),  3,4},
  {&(_tg__ZTV4bb61__5cc561__7ee77561[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77561[];
extern  VTBL_ENTRY _ZTV7ee77561[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77561[];
static VTBL_ENTRY alt_thunk_names812[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5613barEv,_ZTv0_n16_N5cc5613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5613barEv,_ZThn8_N5cc5613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75613fooEv,_ZTv0_n12_N6dd75613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613fooEv,_ZThn16_N6dd75613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75613barEv,_ZTv0_n16_N6dd75613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75613barEv,_ZThn16_N6dd75613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75613barEv,_ZThn8_N6dd75613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee775613fooEv,_ZTv0_n12_N7ee775613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee775613fooEv,_ZThn24_N7ee775613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee775613barEv,_ZTv0_n16_N7ee775613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee775613barEv,_ZThn24_N7ee775613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee775613barEv,_ZThn16_N7ee775613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee775613fooEv,_ZTv0_n24_N7ee775613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee775613fooEv,_ZThn8_N7ee775613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee775613barEv,_ZTv0_n20_N7ee775613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee775613barEv,_ZThn8_N7ee775613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77561 = {  "ee77561", // class name
  bases_ee77561, 4,
  &(vtc_ee77561[0]), // expected_vtbl_contents
  &(vtt_ee77561[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77561),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77561),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77561),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names812,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc661  : bb61 {
  int c;
  virtual void  foo(); // _ZN5cc6613fooEv
  virtual void  bar(); // _ZN5cc6613barEv
  ~cc661(); // tgen
  cc661(); // tgen
};
//SIG(-1 cc661) C1{ BC2{ BC3{ v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  cc661 ::foo(){vfunc_called(this, "_ZN5cc6613fooEv");}
void  cc661 ::bar(){vfunc_called(this, "_ZN5cc6613barEv");}
cc661 ::~cc661(){ note_dtor("cc661", this);} // tgen
cc661 ::cc661(){ note_ctor("cc661", this);} // tgen

static void Test_cc661()
{
  extern Class_Descriptor cd_cc661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc661, buf);
    cc661 *dp, &lv = *(dp=new (buf) cc661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc661)");
    check_base_class_offset(lv, (aa1*)(bb61*), 0, "cc661");
    check_base_class_offset(lv, (bb61*), 0, "cc661");
    check_field_offset(lv, c, ABISELECT(16,12), "cc661.c");
    test_class_info(&lv, &cd_cc661);
    dp->~cc661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc661(Test_cc661, "cc661", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc661C1Ev();
extern void _ZN5cc661D1Ev();
Name_Map name_map_cc661[] = {
  NSPAIR(_ZN5cc661C1Ev),
  NSPAIR(_ZN5cc661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI5cc661[];
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_cc661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
Class_Descriptor cd_cc661 = {  "cc661", // class name
  bases_cc661, 2,
  &(vtc_cc661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc661),4, //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  dd0661  : cc661 {
  int d;
  ~dd0661(); // tgen
  dd0661(); // tgen
};
//SIG(-1 dd0661) C1{ BC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd0661 ::~dd0661(){ note_dtor("dd0661", this);} // tgen
dd0661 ::dd0661(){ note_ctor("dd0661", this);} // tgen

static void Test_dd0661()
{
  extern Class_Descriptor cd_dd0661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0661, buf);
    dd0661 *dp, &lv = *(dp=new (buf) dd0661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), 0, "dd0661");
    check_base_class_offset(lv, (bb61*)(cc661*), 0, "dd0661");
    check_base_class_offset(lv, (cc661*), 0, "dd0661");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0661.d");
    test_class_info(&lv, &cd_dd0661);
    dp->~dd0661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0661(Test_dd0661, "dd0661", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0661C1Ev();
extern void _ZN6dd0661D1Ev();
Name_Map name_map_dd0661[] = {
  NSPAIR(_ZN6dd0661C1Ev),
  NSPAIR(_ZN6dd0661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd0661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0661[];
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_dd0661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
Class_Descriptor cd_dd0661 = {  "dd0661", // class name
  bases_dd0661, 3,
  &(vtc_dd0661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0661),4, //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  ee00661  : dd0661 {
  int e;
  ~ee00661(); // tgen
  ee00661(); // tgen
};
//SIG(1 ee00661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee00661 ::~ee00661(){ note_dtor("ee00661", this);} // tgen
ee00661 ::ee00661(){ note_ctor("ee00661", this);} // tgen

static void Test_ee00661()
{
  extern Class_Descriptor cd_ee00661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00661, buf);
    ee00661 *dp, &lv = *(dp=new (buf) ee00661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), 0, "ee00661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), 0, "ee00661");
    check_base_class_offset(lv, (cc661*)(dd0661*), 0, "ee00661");
    check_base_class_offset(lv, (dd0661*), 0, "ee00661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00661.e");
    test_class_info(&lv, &cd_ee00661);
    dp->~ee00661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00661(Test_ee00661, "ee00661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00661C1Ev();
extern void _ZN7ee00661D1Ev();
Name_Map name_map_ee00661[] = {
  NSPAIR(_ZN7ee00661C1Ev),
  NSPAIR(_ZN7ee00661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee00661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00661[];
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee00661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTI7ee00661[];
extern  VTBL_ENTRY _ZTV7ee00661[];
Class_Descriptor cd_ee00661 = {  "ee00661", // class name
  bases_ee00661, 4,
  &(vtc_ee00661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00661),4, //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  ee10661  : virtual dd0661 {
  int e;
  ~ee10661(); // tgen
  ee10661(); // tgen
};
//SIG(1 ee10661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee10661 ::~ee10661(){ note_dtor("ee10661", this);} // tgen
ee10661 ::ee10661(){ note_ctor("ee10661", this);} // tgen

static void Test_ee10661()
{
  extern Class_Descriptor cd_ee10661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10661, buf);
    ee10661 *dp, &lv = *(dp=new (buf) ee10661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee10661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee10661");
    check_base_class_offset(lv, (cc661*)(dd0661*), ABISELECT(16,8), "ee10661");
    check_base_class_offset(lv, (dd0661*), ABISELECT(16,8), "ee10661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10661.e");
    test_class_info(&lv, &cd_ee10661);
    dp->~ee10661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10661(Test_ee10661, "ee10661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10661C1Ev();
extern void _ZN7ee10661D1Ev();
Name_Map name_map_ee10661[] = {
  NSPAIR(_ZN7ee10661C1Ev),
  NSPAIR(_ZN7ee10661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee10661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10661[];
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee10661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10661[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee10661[];
static  VTT_ENTRY vtt_ee10661[] = {
  {&(_ZTV7ee10661[3]),  3,9},
  {&(_ZTV7ee10661[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10661[];
extern  VTBL_ENTRY _ZTV7ee10661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10661[];
Class_Descriptor cd_ee10661 = {  "ee10661", // class name
  bases_ee10661, 4,
  &(vtc_ee10661[0]), // expected_vtbl_contents
  &(vtt_ee10661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10661),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10661),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  ee20661  : dd0661 {
  int e;
  virtual void  foo(); // _ZN7ee206613fooEv
  ~ee20661(); // tgen
  ee20661(); // tgen
};
//SIG(1 ee20661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee20661 ::foo(){vfunc_called(this, "_ZN7ee206613fooEv");}
ee20661 ::~ee20661(){ note_dtor("ee20661", this);} // tgen
ee20661 ::ee20661(){ note_ctor("ee20661", this);} // tgen

static void Test_ee20661()
{
  extern Class_Descriptor cd_ee20661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20661, buf);
    ee20661 *dp, &lv = *(dp=new (buf) ee20661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), 0, "ee20661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), 0, "ee20661");
    check_base_class_offset(lv, (cc661*)(dd0661*), 0, "ee20661");
    check_base_class_offset(lv, (dd0661*), 0, "ee20661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20661.e");
    test_class_info(&lv, &cd_ee20661);
    dp->~ee20661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20661(Test_ee20661, "ee20661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20661C1Ev();
extern void _ZN7ee20661D1Ev();
Name_Map name_map_ee20661[] = {
  NSPAIR(_ZN7ee20661C1Ev),
  NSPAIR(_ZN7ee20661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee20661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20661[];
extern void _ZN7ee206613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee20661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20661[0]),
  (VTBL_ENTRY)&_ZN7ee206613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTI7ee20661[];
extern  VTBL_ENTRY _ZTV7ee20661[];
Class_Descriptor cd_ee20661 = {  "ee20661", // class name
  bases_ee20661, 4,
  &(vtc_ee20661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20661),4, //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  ee30661  : virtual dd0661 {
  int e;
  virtual void  foo(); // _ZN7ee306613fooEv
  ~ee30661(); // tgen
  ee30661(); // tgen
};
//SIG(1 ee30661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee30661 ::foo(){vfunc_called(this, "_ZN7ee306613fooEv");}
ee30661 ::~ee30661(){ note_dtor("ee30661", this);} // tgen
ee30661 ::ee30661(){ note_ctor("ee30661", this);} // tgen

static void Test_ee30661()
{
  extern Class_Descriptor cd_ee30661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30661, buf);
    ee30661 *dp, &lv = *(dp=new (buf) ee30661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee30661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee30661");
    check_base_class_offset(lv, (cc661*)(dd0661*), ABISELECT(16,8), "ee30661");
    check_base_class_offset(lv, (dd0661*), ABISELECT(16,8), "ee30661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30661.e");
    test_class_info(&lv, &cd_ee30661);
    dp->~ee30661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30661(Test_ee30661, "ee30661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30661C1Ev();
extern void _ZN7ee30661D1Ev();
Name_Map name_map_ee30661[] = {
  NSPAIR(_ZN7ee30661C1Ev),
  NSPAIR(_ZN7ee30661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee30661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30661[];
extern void _ZN7ee306613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee306613fooEv,_ZTv0_n12_N7ee306613fooEv)();
extern void ABISELECT(_ZThn16_N7ee306613fooEv,_ZThn8_N7ee306613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee30661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30661[0]),
  (VTBL_ENTRY)&_ZN7ee306613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee306613fooEv,_ZTv0_n12_N7ee306613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee30661[];
static  VTT_ENTRY vtt_ee30661[] = {
  {&(_ZTV7ee30661[3]),  3,10},
  {&(_ZTV7ee30661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30661[];
extern  VTBL_ENTRY _ZTV7ee30661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30661[];
static VTBL_ENTRY alt_thunk_names813[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee306613fooEv,_ZTv0_n12_N7ee306613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee306613fooEv,_ZThn8_N7ee306613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30661 = {  "ee30661", // class name
  bases_ee30661, 4,
  &(vtc_ee30661[0]), // expected_vtbl_contents
  &(vtt_ee30661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names813,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40661  : dd0661 {
  int e;
  virtual void  bar(); // _ZN7ee406613barEv
  ~ee40661(); // tgen
  ee40661(); // tgen
};
//SIG(1 ee40661) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee40661 ::bar(){vfunc_called(this, "_ZN7ee406613barEv");}
ee40661 ::~ee40661(){ note_dtor("ee40661", this);} // tgen
ee40661 ::ee40661(){ note_ctor("ee40661", this);} // tgen

static void Test_ee40661()
{
  extern Class_Descriptor cd_ee40661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40661, buf);
    ee40661 *dp, &lv = *(dp=new (buf) ee40661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), 0, "ee40661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), 0, "ee40661");
    check_base_class_offset(lv, (cc661*)(dd0661*), 0, "ee40661");
    check_base_class_offset(lv, (dd0661*), 0, "ee40661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40661.e");
    test_class_info(&lv, &cd_ee40661);
    dp->~ee40661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40661(Test_ee40661, "ee40661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40661C1Ev();
extern void _ZN7ee40661D1Ev();
Name_Map name_map_ee40661[] = {
  NSPAIR(_ZN7ee40661C1Ev),
  NSPAIR(_ZN7ee40661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee40661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40661[];
extern void _ZN5cc6613fooEv();
extern void _ZN7ee406613barEv();
static  VTBL_ENTRY vtc_ee40661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN7ee406613barEv,
};
extern VTBL_ENTRY _ZTI7ee40661[];
extern  VTBL_ENTRY _ZTV7ee40661[];
Class_Descriptor cd_ee40661 = {  "ee40661", // class name
  bases_ee40661, 4,
  &(vtc_ee40661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40661),4, //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  ee50661  : virtual dd0661 {
  int e;
  virtual void  bar(); // _ZN7ee506613barEv
  ~ee50661(); // tgen
  ee50661(); // tgen
};
//SIG(1 ee50661) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee50661 ::bar(){vfunc_called(this, "_ZN7ee506613barEv");}
ee50661 ::~ee50661(){ note_dtor("ee50661", this);} // tgen
ee50661 ::ee50661(){ note_ctor("ee50661", this);} // tgen

static void Test_ee50661()
{
  extern Class_Descriptor cd_ee50661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50661, buf);
    ee50661 *dp, &lv = *(dp=new (buf) ee50661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee50661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee50661");
    check_base_class_offset(lv, (cc661*)(dd0661*), ABISELECT(16,8), "ee50661");
    check_base_class_offset(lv, (dd0661*), ABISELECT(16,8), "ee50661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50661.e");
    test_class_info(&lv, &cd_ee50661);
    dp->~ee50661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50661(Test_ee50661, "ee50661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50661C1Ev();
extern void _ZN7ee50661D1Ev();
Name_Map name_map_ee50661[] = {
  NSPAIR(_ZN7ee50661C1Ev),
  NSPAIR(_ZN7ee50661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee50661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50661[];
extern void _ZN7ee506613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee506613barEv,_ZTv0_n16_N7ee506613barEv)();
extern void ABISELECT(_ZThn16_N7ee506613barEv,_ZThn8_N7ee506613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50661[0]),
  (VTBL_ENTRY)&_ZN7ee506613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee506613barEv,_ZTv0_n16_N7ee506613barEv),
};
extern VTBL_ENTRY _ZTV7ee50661[];
static  VTT_ENTRY vtt_ee50661[] = {
  {&(_ZTV7ee50661[3]),  3,10},
  {&(_ZTV7ee50661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50661[];
extern  VTBL_ENTRY _ZTV7ee50661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50661[];
static VTBL_ENTRY alt_thunk_names814[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee506613barEv,_ZTv0_n16_N7ee506613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee506613barEv,_ZThn8_N7ee506613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50661 = {  "ee50661", // class name
  bases_ee50661, 4,
  &(vtc_ee50661[0]), // expected_vtbl_contents
  &(vtt_ee50661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names814,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60661  : dd0661 {
  int e;
  virtual void  foo(); // _ZN7ee606613fooEv
  virtual void  bar(); // _ZN7ee606613barEv
  ~ee60661(); // tgen
  ee60661(); // tgen
};
//SIG(1 ee60661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee60661 ::foo(){vfunc_called(this, "_ZN7ee606613fooEv");}
void  ee60661 ::bar(){vfunc_called(this, "_ZN7ee606613barEv");}
ee60661 ::~ee60661(){ note_dtor("ee60661", this);} // tgen
ee60661 ::ee60661(){ note_ctor("ee60661", this);} // tgen

static void Test_ee60661()
{
  extern Class_Descriptor cd_ee60661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60661, buf);
    ee60661 *dp, &lv = *(dp=new (buf) ee60661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), 0, "ee60661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), 0, "ee60661");
    check_base_class_offset(lv, (cc661*)(dd0661*), 0, "ee60661");
    check_base_class_offset(lv, (dd0661*), 0, "ee60661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60661.e");
    test_class_info(&lv, &cd_ee60661);
    dp->~ee60661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60661(Test_ee60661, "ee60661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60661C1Ev();
extern void _ZN7ee60661D1Ev();
Name_Map name_map_ee60661[] = {
  NSPAIR(_ZN7ee60661C1Ev),
  NSPAIR(_ZN7ee60661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee60661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60661[];
extern void _ZN7ee606613fooEv();
extern void _ZN7ee606613barEv();
static  VTBL_ENTRY vtc_ee60661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60661[0]),
  (VTBL_ENTRY)&_ZN7ee606613fooEv,
  (VTBL_ENTRY)&_ZN7ee606613barEv,
};
extern VTBL_ENTRY _ZTI7ee60661[];
extern  VTBL_ENTRY _ZTV7ee60661[];
Class_Descriptor cd_ee60661 = {  "ee60661", // class name
  bases_ee60661, 4,
  &(vtc_ee60661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60661),4, //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  ee70661  : virtual dd0661 {
  int e;
  virtual void  foo(); // _ZN7ee706613fooEv
  virtual void  bar(); // _ZN7ee706613barEv
  ~ee70661(); // tgen
  ee70661(); // tgen
};
//SIG(1 ee70661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee70661 ::foo(){vfunc_called(this, "_ZN7ee706613fooEv");}
void  ee70661 ::bar(){vfunc_called(this, "_ZN7ee706613barEv");}
ee70661 ::~ee70661(){ note_dtor("ee70661", this);} // tgen
ee70661 ::ee70661(){ note_ctor("ee70661", this);} // tgen

static void Test_ee70661()
{
  extern Class_Descriptor cd_ee70661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70661, buf);
    ee70661 *dp, &lv = *(dp=new (buf) ee70661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee70661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd0661*), ABISELECT(16,8), "ee70661");
    check_base_class_offset(lv, (cc661*)(dd0661*), ABISELECT(16,8), "ee70661");
    check_base_class_offset(lv, (dd0661*), ABISELECT(16,8), "ee70661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70661.e");
    test_class_info(&lv, &cd_ee70661);
    dp->~ee70661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70661(Test_ee70661, "ee70661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70661C1Ev();
extern void _ZN7ee70661D1Ev();
Name_Map name_map_ee70661[] = {
  NSPAIR(_ZN7ee70661C1Ev),
  NSPAIR(_ZN7ee70661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd0661;
extern VTBL_ENTRY _ZTI6dd0661[];
extern  VTBL_ENTRY _ZTV6dd0661[];
static Base_Class bases_ee70661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0661,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70661[];
extern void _ZN7ee706613fooEv();
extern void _ZN7ee706613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee706613fooEv,_ZTv0_n12_N7ee706613fooEv)();
extern void ABISELECT(_ZThn16_N7ee706613fooEv,_ZThn8_N7ee706613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee706613barEv,_ZTv0_n16_N7ee706613barEv)();
extern void ABISELECT(_ZThn16_N7ee706613barEv,_ZThn8_N7ee706613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70661[0]),
  (VTBL_ENTRY)&_ZN7ee706613fooEv,
  (VTBL_ENTRY)&_ZN7ee706613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee706613fooEv,_ZTv0_n12_N7ee706613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee706613barEv,_ZTv0_n16_N7ee706613barEv),
};
extern VTBL_ENTRY _ZTV7ee70661[];
static  VTT_ENTRY vtt_ee70661[] = {
  {&(_ZTV7ee70661[3]),  3,11},
  {&(_ZTV7ee70661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70661[];
extern  VTBL_ENTRY _ZTV7ee70661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70661[];
static VTBL_ENTRY alt_thunk_names815[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee706613barEv,_ZTv0_n16_N7ee706613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee706613barEv,_ZThn8_N7ee706613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee706613fooEv,_ZTv0_n12_N7ee706613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee706613fooEv,_ZThn8_N7ee706613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70661 = {  "ee70661", // class name
  bases_ee70661, 4,
  &(vtc_ee70661[0]), // expected_vtbl_contents
  &(vtt_ee70661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names815,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1661  : virtual cc661 {
  int d;
  ~dd1661(); // tgen
  dd1661(); // tgen
};
//SIG(-1 dd1661) C1{ VBC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd1661 ::~dd1661(){ note_dtor("dd1661", this);} // tgen
dd1661 ::dd1661(){ note_ctor("dd1661", this);} // tgen

static void Test_dd1661()
{
  extern Class_Descriptor cd_dd1661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1661, buf);
    dd1661 *dp, &lv = *(dp=new (buf) dd1661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,8), "dd1661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,8), "dd1661");
    check_base_class_offset(lv, (cc661*), ABISELECT(16,8), "dd1661");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1661.d");
    test_class_info(&lv, &cd_dd1661);
    dp->~dd1661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1661(Test_dd1661, "dd1661", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1661C1Ev();
extern void _ZN6dd1661D1Ev();
Name_Map name_map_dd1661[] = {
  NSPAIR(_ZN6dd1661C1Ev),
  NSPAIR(_ZN6dd1661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd1661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1661[];
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_dd1661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV6dd1661[];
static  VTT_ENTRY vtt_dd1661[] = {
  {&(_ZTV6dd1661[3]),  3,9},
  {&(_ZTV6dd1661[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
Class_Descriptor cd_dd1661 = {  "dd1661", // class name
  bases_dd1661, 3,
  &(vtc_dd1661[0]), // expected_vtbl_contents
  &(vtt_dd1661[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1661),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1661),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  ee01661  : dd1661 {
  int e;
  ~ee01661(); // tgen
  ee01661(); // tgen
};
//SIG(1 ee01661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee01661 ::~ee01661(){ note_dtor("ee01661", this);} // tgen
ee01661 ::ee01661(){ note_ctor("ee01661", this);} // tgen

static void Test_ee01661()
{
  extern Class_Descriptor cd_ee01661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01661, buf);
    ee01661 *dp, &lv = *(dp=new (buf) ee01661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee01661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee01661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(16,12), "ee01661");
    check_base_class_offset(lv, (dd1661*), 0, "ee01661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01661.e");
    test_class_info(&lv, &cd_ee01661);
    dp->~ee01661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01661(Test_ee01661, "ee01661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01661C1Ev();
extern void _ZN7ee01661D1Ev();
Name_Map name_map_ee01661[] = {
  NSPAIR(_ZN7ee01661C1Ev),
  NSPAIR(_ZN7ee01661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee01661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01661[];
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee01661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01661[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee01661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee01661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee01661[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee01661[] = {
  {&(_ZTV7ee01661[3]),  3,9},
  {&(_tg__ZTV6dd1661__7ee01661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee01661[4]),  4,6},
  {&(_ZTV7ee01661[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01661[];
extern  VTBL_ENTRY _ZTV7ee01661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01661[];
Class_Descriptor cd_ee01661 = {  "ee01661", // class name
  bases_ee01661, 4,
  &(vtc_ee01661[0]), // expected_vtbl_contents
  &(vtt_ee01661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01661),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01661),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  ee11661  : virtual dd1661 {
  int e;
  ~ee11661(); // tgen
  ee11661(); // tgen
};
//SIG(1 ee11661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee11661 ::~ee11661(){ note_dtor("ee11661", this);} // tgen
ee11661 ::ee11661(){ note_ctor("ee11661", this);} // tgen

static void Test_ee11661()
{
  extern Class_Descriptor cd_ee11661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11661, buf);
    ee11661 *dp, &lv = *(dp=new (buf) ee11661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee11661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee11661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(32,16), "ee11661");
    check_base_class_offset(lv, (dd1661*), ABISELECT(16,8), "ee11661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11661.e");
    test_class_info(&lv, &cd_ee11661);
    dp->~ee11661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11661(Test_ee11661, "ee11661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11661C1Ev();
extern void _ZN7ee11661D1Ev();
Name_Map name_map_ee11661[] = {
  NSPAIR(_ZN7ee11661C1Ev),
  NSPAIR(_ZN7ee11661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee11661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11661[];
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee11661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11661[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11661[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee11661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee11661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee11661[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee11661[] = {
  {&(_ZTV7ee11661[4]),  4,13},
  {&(_ZTV7ee11661[7]),  7,13},
  {&(_ZTV7ee11661[11]),  11,13},
  {&(_tg__ZTV6dd1661__7ee11661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee11661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11661[];
extern  VTBL_ENTRY _ZTV7ee11661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11661[];
Class_Descriptor cd_ee11661 = {  "ee11661", // class name
  bases_ee11661, 4,
  &(vtc_ee11661[0]), // expected_vtbl_contents
  &(vtt_ee11661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11661),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11661),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  ee21661  : dd1661 {
  int e;
  virtual void  foo(); // _ZN7ee216613fooEv
  ~ee21661(); // tgen
  ee21661(); // tgen
};
//SIG(1 ee21661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee21661 ::foo(){vfunc_called(this, "_ZN7ee216613fooEv");}
ee21661 ::~ee21661(){ note_dtor("ee21661", this);} // tgen
ee21661 ::ee21661(){ note_ctor("ee21661", this);} // tgen

static void Test_ee21661()
{
  extern Class_Descriptor cd_ee21661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21661, buf);
    ee21661 *dp, &lv = *(dp=new (buf) ee21661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee21661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee21661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(16,12), "ee21661");
    check_base_class_offset(lv, (dd1661*), 0, "ee21661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21661.e");
    test_class_info(&lv, &cd_ee21661);
    dp->~ee21661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21661(Test_ee21661, "ee21661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21661C1Ev();
extern void _ZN7ee21661D1Ev();
Name_Map name_map_ee21661[] = {
  NSPAIR(_ZN7ee21661C1Ev),
  NSPAIR(_ZN7ee21661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee21661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21661[];
extern void _ZN7ee216613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee216613fooEv,_ZTv0_n12_N7ee216613fooEv)();
extern void ABISELECT(_ZThn16_N7ee216613fooEv,_ZThn12_N7ee216613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee21661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21661[0]),
  (VTBL_ENTRY)&_ZN7ee216613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee216613fooEv,_ZTv0_n12_N7ee216613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee21661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee21661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee21661[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee21661[] = {
  {&(_ZTV7ee21661[3]),  3,10},
  {&(_tg__ZTV6dd1661__7ee21661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee21661[4]),  4,6},
  {&(_ZTV7ee21661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21661[];
extern  VTBL_ENTRY _ZTV7ee21661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21661[];
static VTBL_ENTRY alt_thunk_names816[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee216613fooEv,_ZTv0_n12_N7ee216613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee216613fooEv,_ZThn12_N7ee216613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21661 = {  "ee21661", // class name
  bases_ee21661, 4,
  &(vtc_ee21661[0]), // expected_vtbl_contents
  &(vtt_ee21661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names816,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31661  : virtual dd1661 {
  int e;
  virtual void  foo(); // _ZN7ee316613fooEv
  ~ee31661(); // tgen
  ee31661(); // tgen
};
//SIG(1 ee31661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee31661 ::foo(){vfunc_called(this, "_ZN7ee316613fooEv");}
ee31661 ::~ee31661(){ note_dtor("ee31661", this);} // tgen
ee31661 ::ee31661(){ note_ctor("ee31661", this);} // tgen

static void Test_ee31661()
{
  extern Class_Descriptor cd_ee31661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31661, buf);
    ee31661 *dp, &lv = *(dp=new (buf) ee31661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee31661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee31661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(32,16), "ee31661");
    check_base_class_offset(lv, (dd1661*), ABISELECT(16,8), "ee31661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31661.e");
    test_class_info(&lv, &cd_ee31661);
    dp->~ee31661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31661(Test_ee31661, "ee31661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31661C1Ev();
extern void _ZN7ee31661D1Ev();
Name_Map name_map_ee31661[] = {
  NSPAIR(_ZN7ee31661C1Ev),
  NSPAIR(_ZN7ee31661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee31661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31661[];
extern void _ZN7ee316613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee316613fooEv,_ZTv0_n12_N7ee316613fooEv)();
extern void ABISELECT(_ZThn32_N7ee316613fooEv,_ZThn16_N7ee316613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee31661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31661[0]),
  (VTBL_ENTRY)&_ZN7ee316613fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31661[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee316613fooEv,_ZTv0_n12_N7ee316613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee31661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee31661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee31661[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee31661[] = {
  {&(_ZTV7ee31661[4]),  4,14},
  {&(_ZTV7ee31661[8]),  8,14},
  {&(_ZTV7ee31661[12]),  12,14},
  {&(_tg__ZTV6dd1661__7ee31661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee31661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31661[];
extern  VTBL_ENTRY _ZTV7ee31661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31661[];
static VTBL_ENTRY alt_thunk_names817[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee316613fooEv,_ZTv0_n12_N7ee316613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee316613fooEv,_ZThn16_N7ee316613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31661 = {  "ee31661", // class name
  bases_ee31661, 4,
  &(vtc_ee31661[0]), // expected_vtbl_contents
  &(vtt_ee31661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31661),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names817,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41661  : dd1661 {
  int e;
  virtual void  bar(); // _ZN7ee416613barEv
  ~ee41661(); // tgen
  ee41661(); // tgen
};
//SIG(1 ee41661) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee41661 ::bar(){vfunc_called(this, "_ZN7ee416613barEv");}
ee41661 ::~ee41661(){ note_dtor("ee41661", this);} // tgen
ee41661 ::ee41661(){ note_ctor("ee41661", this);} // tgen

static void Test_ee41661()
{
  extern Class_Descriptor cd_ee41661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41661, buf);
    ee41661 *dp, &lv = *(dp=new (buf) ee41661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee41661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee41661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(16,12), "ee41661");
    check_base_class_offset(lv, (dd1661*), 0, "ee41661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41661.e");
    test_class_info(&lv, &cd_ee41661);
    dp->~ee41661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41661(Test_ee41661, "ee41661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41661C1Ev();
extern void _ZN7ee41661D1Ev();
Name_Map name_map_ee41661[] = {
  NSPAIR(_ZN7ee41661C1Ev),
  NSPAIR(_ZN7ee41661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee41661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41661[];
extern void _ZN7ee416613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee416613barEv,_ZTv0_n16_N7ee416613barEv)();
extern void ABISELECT(_ZThn16_N7ee416613barEv,_ZThn12_N7ee416613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41661[0]),
  (VTBL_ENTRY)&_ZN7ee416613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee416613barEv,_ZTv0_n16_N7ee416613barEv),
};
extern VTBL_ENTRY _ZTV7ee41661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee41661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee41661[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee41661[] = {
  {&(_ZTV7ee41661[3]),  3,10},
  {&(_tg__ZTV6dd1661__7ee41661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee41661[4]),  4,6},
  {&(_ZTV7ee41661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41661[];
extern  VTBL_ENTRY _ZTV7ee41661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41661[];
static VTBL_ENTRY alt_thunk_names818[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee416613barEv,_ZTv0_n16_N7ee416613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee416613barEv,_ZThn12_N7ee416613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41661 = {  "ee41661", // class name
  bases_ee41661, 4,
  &(vtc_ee41661[0]), // expected_vtbl_contents
  &(vtt_ee41661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names818,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51661  : virtual dd1661 {
  int e;
  virtual void  bar(); // _ZN7ee516613barEv
  ~ee51661(); // tgen
  ee51661(); // tgen
};
//SIG(1 ee51661) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee51661 ::bar(){vfunc_called(this, "_ZN7ee516613barEv");}
ee51661 ::~ee51661(){ note_dtor("ee51661", this);} // tgen
ee51661 ::ee51661(){ note_ctor("ee51661", this);} // tgen

static void Test_ee51661()
{
  extern Class_Descriptor cd_ee51661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51661, buf);
    ee51661 *dp, &lv = *(dp=new (buf) ee51661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee51661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee51661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(32,16), "ee51661");
    check_base_class_offset(lv, (dd1661*), ABISELECT(16,8), "ee51661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51661.e");
    test_class_info(&lv, &cd_ee51661);
    dp->~ee51661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51661(Test_ee51661, "ee51661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51661C1Ev();
extern void _ZN7ee51661D1Ev();
Name_Map name_map_ee51661[] = {
  NSPAIR(_ZN7ee51661C1Ev),
  NSPAIR(_ZN7ee51661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee51661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51661[];
extern void _ZN7ee516613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee516613barEv,_ZTv0_n16_N7ee516613barEv)();
extern void ABISELECT(_ZThn32_N7ee516613barEv,_ZThn16_N7ee516613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51661[0]),
  (VTBL_ENTRY)&_ZN7ee516613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51661[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee516613barEv,_ZTv0_n16_N7ee516613barEv),
};
extern VTBL_ENTRY _ZTV7ee51661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee51661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee51661[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee51661[] = {
  {&(_ZTV7ee51661[4]),  4,14},
  {&(_ZTV7ee51661[8]),  8,14},
  {&(_ZTV7ee51661[12]),  12,14},
  {&(_tg__ZTV6dd1661__7ee51661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee51661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51661[];
extern  VTBL_ENTRY _ZTV7ee51661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51661[];
static VTBL_ENTRY alt_thunk_names819[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee516613barEv,_ZTv0_n16_N7ee516613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee516613barEv,_ZThn16_N7ee516613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51661 = {  "ee51661", // class name
  bases_ee51661, 4,
  &(vtc_ee51661[0]), // expected_vtbl_contents
  &(vtt_ee51661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51661),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names819,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61661  : dd1661 {
  int e;
  virtual void  foo(); // _ZN7ee616613fooEv
  virtual void  bar(); // _ZN7ee616613barEv
  ~ee61661(); // tgen
  ee61661(); // tgen
};
//SIG(1 ee61661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee61661 ::foo(){vfunc_called(this, "_ZN7ee616613fooEv");}
void  ee61661 ::bar(){vfunc_called(this, "_ZN7ee616613barEv");}
ee61661 ::~ee61661(){ note_dtor("ee61661", this);} // tgen
ee61661 ::ee61661(){ note_ctor("ee61661", this);} // tgen

static void Test_ee61661()
{
  extern Class_Descriptor cd_ee61661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61661, buf);
    ee61661 *dp, &lv = *(dp=new (buf) ee61661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee61661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee61661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(16,12), "ee61661");
    check_base_class_offset(lv, (dd1661*), 0, "ee61661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61661.e");
    test_class_info(&lv, &cd_ee61661);
    dp->~ee61661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61661(Test_ee61661, "ee61661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61661C1Ev();
extern void _ZN7ee61661D1Ev();
Name_Map name_map_ee61661[] = {
  NSPAIR(_ZN7ee61661C1Ev),
  NSPAIR(_ZN7ee61661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee61661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61661[];
extern void _ZN7ee616613fooEv();
extern void _ZN7ee616613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee616613fooEv,_ZTv0_n12_N7ee616613fooEv)();
extern void ABISELECT(_ZThn16_N7ee616613fooEv,_ZThn12_N7ee616613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee616613barEv,_ZTv0_n16_N7ee616613barEv)();
extern void ABISELECT(_ZThn16_N7ee616613barEv,_ZThn12_N7ee616613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61661[0]),
  (VTBL_ENTRY)&_ZN7ee616613fooEv,
  (VTBL_ENTRY)&_ZN7ee616613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee616613fooEv,_ZTv0_n12_N7ee616613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee616613barEv,_ZTv0_n16_N7ee616613barEv),
};
extern VTBL_ENTRY _ZTV7ee61661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee61661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee61661[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee61661[] = {
  {&(_ZTV7ee61661[3]),  3,11},
  {&(_tg__ZTV6dd1661__7ee61661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee61661[4]),  4,6},
  {&(_ZTV7ee61661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61661[];
extern  VTBL_ENTRY _ZTV7ee61661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61661[];
static VTBL_ENTRY alt_thunk_names820[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee616613barEv,_ZTv0_n16_N7ee616613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee616613barEv,_ZThn12_N7ee616613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee616613fooEv,_ZTv0_n12_N7ee616613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee616613fooEv,_ZThn12_N7ee616613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61661 = {  "ee61661", // class name
  bases_ee61661, 4,
  &(vtc_ee61661[0]), // expected_vtbl_contents
  &(vtt_ee61661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names820,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71661  : virtual dd1661 {
  int e;
  virtual void  foo(); // _ZN7ee716613fooEv
  virtual void  bar(); // _ZN7ee716613barEv
  ~ee71661(); // tgen
  ee71661(); // tgen
};
//SIG(1 ee71661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee71661 ::foo(){vfunc_called(this, "_ZN7ee716613fooEv");}
void  ee71661 ::bar(){vfunc_called(this, "_ZN7ee716613barEv");}
ee71661 ::~ee71661(){ note_dtor("ee71661", this);} // tgen
ee71661 ::ee71661(){ note_ctor("ee71661", this);} // tgen

static void Test_ee71661()
{
  extern Class_Descriptor cd_ee71661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71661, buf);
    ee71661 *dp, &lv = *(dp=new (buf) ee71661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee71661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee71661");
    check_base_class_offset(lv, (cc661*)(dd1661*), ABISELECT(32,16), "ee71661");
    check_base_class_offset(lv, (dd1661*), ABISELECT(16,8), "ee71661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71661.e");
    test_class_info(&lv, &cd_ee71661);
    dp->~ee71661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71661(Test_ee71661, "ee71661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71661C1Ev();
extern void _ZN7ee71661D1Ev();
Name_Map name_map_ee71661[] = {
  NSPAIR(_ZN7ee71661C1Ev),
  NSPAIR(_ZN7ee71661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd1661;
extern VTBL_ENTRY _ZTI6dd1661[];
extern  VTBL_ENTRY _ZTV6dd1661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1661[];
static Base_Class bases_ee71661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1661,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71661[];
extern void _ZN7ee716613fooEv();
extern void _ZN7ee716613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee716613fooEv,_ZTv0_n12_N7ee716613fooEv)();
extern void ABISELECT(_ZThn32_N7ee716613fooEv,_ZThn16_N7ee716613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee716613barEv,_ZTv0_n16_N7ee716613barEv)();
extern void ABISELECT(_ZThn32_N7ee716613barEv,_ZThn16_N7ee716613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71661[0]),
  (VTBL_ENTRY)&_ZN7ee716613fooEv,
  (VTBL_ENTRY)&_ZN7ee716613barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71661[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee716613fooEv,_ZTv0_n12_N7ee716613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee716613barEv,_ZTv0_n16_N7ee716613barEv),
};
extern VTBL_ENTRY _ZTV7ee71661[];
static  VTBL_ENTRY _tg__ZTV6dd1661__7ee71661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
};
extern void _ZN5cc6613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd1661__7ee71661[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee71661[] = {
  {&(_ZTV7ee71661[4]),  4,15},
  {&(_ZTV7ee71661[9]),  9,15},
  {&(_ZTV7ee71661[13]),  13,15},
  {&(_tg__ZTV6dd1661__7ee71661[3]),  3,3},
  {&(_tg__ZTV5cc661__6dd1661__7ee71661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71661[];
extern  VTBL_ENTRY _ZTV7ee71661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71661[];
static VTBL_ENTRY alt_thunk_names821[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee716613barEv,_ZTv0_n16_N7ee716613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee716613barEv,_ZThn16_N7ee716613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee716613fooEv,_ZTv0_n12_N7ee716613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee716613fooEv,_ZThn16_N7ee716613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71661 = {  "ee71661", // class name
  bases_ee71661, 4,
  &(vtc_ee71661[0]), // expected_vtbl_contents
  &(vtt_ee71661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71661),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names821,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2661  : cc661 {
  int d;
  virtual void  foo(); // _ZN6dd26613fooEv
  ~dd2661(); // tgen
  dd2661(); // tgen
};
//SIG(-1 dd2661) C1{ BC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd2661 ::foo(){vfunc_called(this, "_ZN6dd26613fooEv");}
dd2661 ::~dd2661(){ note_dtor("dd2661", this);} // tgen
dd2661 ::dd2661(){ note_ctor("dd2661", this);} // tgen

static void Test_dd2661()
{
  extern Class_Descriptor cd_dd2661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2661, buf);
    dd2661 *dp, &lv = *(dp=new (buf) dd2661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), 0, "dd2661");
    check_base_class_offset(lv, (bb61*)(cc661*), 0, "dd2661");
    check_base_class_offset(lv, (cc661*), 0, "dd2661");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2661.d");
    test_class_info(&lv, &cd_dd2661);
    dp->~dd2661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2661(Test_dd2661, "dd2661", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2661C1Ev();
extern void _ZN6dd2661D1Ev();
Name_Map name_map_dd2661[] = {
  NSPAIR(_ZN6dd2661C1Ev),
  NSPAIR(_ZN6dd2661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd2661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2661[];
extern void _ZN6dd26613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_dd2661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2661[0]),
  (VTBL_ENTRY)&_ZN6dd26613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
Class_Descriptor cd_dd2661 = {  "dd2661", // class name
  bases_dd2661, 3,
  &(vtc_dd2661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2661),4, //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  ee02661  : dd2661 {
  int e;
  ~ee02661(); // tgen
  ee02661(); // tgen
};
//SIG(1 ee02661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee02661 ::~ee02661(){ note_dtor("ee02661", this);} // tgen
ee02661 ::ee02661(){ note_ctor("ee02661", this);} // tgen

static void Test_ee02661()
{
  extern Class_Descriptor cd_ee02661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02661, buf);
    ee02661 *dp, &lv = *(dp=new (buf) ee02661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), 0, "ee02661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), 0, "ee02661");
    check_base_class_offset(lv, (cc661*)(dd2661*), 0, "ee02661");
    check_base_class_offset(lv, (dd2661*), 0, "ee02661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02661.e");
    test_class_info(&lv, &cd_ee02661);
    dp->~ee02661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02661(Test_ee02661, "ee02661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02661C1Ev();
extern void _ZN7ee02661D1Ev();
Name_Map name_map_ee02661[] = {
  NSPAIR(_ZN7ee02661C1Ev),
  NSPAIR(_ZN7ee02661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee02661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02661[];
extern void _ZN6dd26613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee02661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02661[0]),
  (VTBL_ENTRY)&_ZN6dd26613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTI7ee02661[];
extern  VTBL_ENTRY _ZTV7ee02661[];
Class_Descriptor cd_ee02661 = {  "ee02661", // class name
  bases_ee02661, 4,
  &(vtc_ee02661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02661),4, //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  ee12661  : virtual dd2661 {
  int e;
  ~ee12661(); // tgen
  ee12661(); // tgen
};
//SIG(1 ee12661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee12661 ::~ee12661(){ note_dtor("ee12661", this);} // tgen
ee12661 ::ee12661(){ note_ctor("ee12661", this);} // tgen

static void Test_ee12661()
{
  extern Class_Descriptor cd_ee12661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12661, buf);
    ee12661 *dp, &lv = *(dp=new (buf) ee12661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee12661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee12661");
    check_base_class_offset(lv, (cc661*)(dd2661*), ABISELECT(16,8), "ee12661");
    check_base_class_offset(lv, (dd2661*), ABISELECT(16,8), "ee12661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12661.e");
    test_class_info(&lv, &cd_ee12661);
    dp->~ee12661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12661(Test_ee12661, "ee12661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12661C1Ev();
extern void _ZN7ee12661D1Ev();
Name_Map name_map_ee12661[] = {
  NSPAIR(_ZN7ee12661C1Ev),
  NSPAIR(_ZN7ee12661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee12661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12661[];
extern void _ZN6dd26613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee12661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12661[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12661[0]),
  (VTBL_ENTRY)&_ZN6dd26613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee12661[];
static  VTT_ENTRY vtt_ee12661[] = {
  {&(_ZTV7ee12661[3]),  3,9},
  {&(_ZTV7ee12661[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12661[];
extern  VTBL_ENTRY _ZTV7ee12661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12661[];
Class_Descriptor cd_ee12661 = {  "ee12661", // class name
  bases_ee12661, 4,
  &(vtc_ee12661[0]), // expected_vtbl_contents
  &(vtt_ee12661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12661),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12661),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  ee22661  : dd2661 {
  int e;
  virtual void  foo(); // _ZN7ee226613fooEv
  ~ee22661(); // tgen
  ee22661(); // tgen
};
//SIG(1 ee22661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee22661 ::foo(){vfunc_called(this, "_ZN7ee226613fooEv");}
ee22661 ::~ee22661(){ note_dtor("ee22661", this);} // tgen
ee22661 ::ee22661(){ note_ctor("ee22661", this);} // tgen

static void Test_ee22661()
{
  extern Class_Descriptor cd_ee22661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22661, buf);
    ee22661 *dp, &lv = *(dp=new (buf) ee22661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), 0, "ee22661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), 0, "ee22661");
    check_base_class_offset(lv, (cc661*)(dd2661*), 0, "ee22661");
    check_base_class_offset(lv, (dd2661*), 0, "ee22661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22661.e");
    test_class_info(&lv, &cd_ee22661);
    dp->~ee22661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22661(Test_ee22661, "ee22661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22661C1Ev();
extern void _ZN7ee22661D1Ev();
Name_Map name_map_ee22661[] = {
  NSPAIR(_ZN7ee22661C1Ev),
  NSPAIR(_ZN7ee22661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee22661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22661[];
extern void _ZN7ee226613fooEv();
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee22661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22661[0]),
  (VTBL_ENTRY)&_ZN7ee226613fooEv,
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTI7ee22661[];
extern  VTBL_ENTRY _ZTV7ee22661[];
Class_Descriptor cd_ee22661 = {  "ee22661", // class name
  bases_ee22661, 4,
  &(vtc_ee22661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22661),4, //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  ee32661  : virtual dd2661 {
  int e;
  virtual void  foo(); // _ZN7ee326613fooEv
  ~ee32661(); // tgen
  ee32661(); // tgen
};
//SIG(1 ee32661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee32661 ::foo(){vfunc_called(this, "_ZN7ee326613fooEv");}
ee32661 ::~ee32661(){ note_dtor("ee32661", this);} // tgen
ee32661 ::ee32661(){ note_ctor("ee32661", this);} // tgen

static void Test_ee32661()
{
  extern Class_Descriptor cd_ee32661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32661, buf);
    ee32661 *dp, &lv = *(dp=new (buf) ee32661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee32661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee32661");
    check_base_class_offset(lv, (cc661*)(dd2661*), ABISELECT(16,8), "ee32661");
    check_base_class_offset(lv, (dd2661*), ABISELECT(16,8), "ee32661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32661.e");
    test_class_info(&lv, &cd_ee32661);
    dp->~ee32661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32661(Test_ee32661, "ee32661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32661C1Ev();
extern void _ZN7ee32661D1Ev();
Name_Map name_map_ee32661[] = {
  NSPAIR(_ZN7ee32661C1Ev),
  NSPAIR(_ZN7ee32661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee32661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32661[];
extern void _ZN7ee326613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee326613fooEv,_ZTv0_n12_N7ee326613fooEv)();
extern void ABISELECT(_ZThn16_N7ee326613fooEv,_ZThn8_N7ee326613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee32661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32661[0]),
  (VTBL_ENTRY)&_ZN7ee326613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee326613fooEv,_ZTv0_n12_N7ee326613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee32661[];
static  VTT_ENTRY vtt_ee32661[] = {
  {&(_ZTV7ee32661[3]),  3,10},
  {&(_ZTV7ee32661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32661[];
extern  VTBL_ENTRY _ZTV7ee32661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32661[];
static VTBL_ENTRY alt_thunk_names822[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee326613fooEv,_ZTv0_n12_N7ee326613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee326613fooEv,_ZThn8_N7ee326613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32661 = {  "ee32661", // class name
  bases_ee32661, 4,
  &(vtc_ee32661[0]), // expected_vtbl_contents
  &(vtt_ee32661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names822,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42661  : dd2661 {
  int e;
  virtual void  bar(); // _ZN7ee426613barEv
  ~ee42661(); // tgen
  ee42661(); // tgen
};
//SIG(1 ee42661) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee42661 ::bar(){vfunc_called(this, "_ZN7ee426613barEv");}
ee42661 ::~ee42661(){ note_dtor("ee42661", this);} // tgen
ee42661 ::ee42661(){ note_ctor("ee42661", this);} // tgen

static void Test_ee42661()
{
  extern Class_Descriptor cd_ee42661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42661, buf);
    ee42661 *dp, &lv = *(dp=new (buf) ee42661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), 0, "ee42661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), 0, "ee42661");
    check_base_class_offset(lv, (cc661*)(dd2661*), 0, "ee42661");
    check_base_class_offset(lv, (dd2661*), 0, "ee42661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42661.e");
    test_class_info(&lv, &cd_ee42661);
    dp->~ee42661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42661(Test_ee42661, "ee42661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42661C1Ev();
extern void _ZN7ee42661D1Ev();
Name_Map name_map_ee42661[] = {
  NSPAIR(_ZN7ee42661C1Ev),
  NSPAIR(_ZN7ee42661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee42661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42661[];
extern void _ZN6dd26613fooEv();
extern void _ZN7ee426613barEv();
static  VTBL_ENTRY vtc_ee42661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42661[0]),
  (VTBL_ENTRY)&_ZN6dd26613fooEv,
  (VTBL_ENTRY)&_ZN7ee426613barEv,
};
extern VTBL_ENTRY _ZTI7ee42661[];
extern  VTBL_ENTRY _ZTV7ee42661[];
Class_Descriptor cd_ee42661 = {  "ee42661", // class name
  bases_ee42661, 4,
  &(vtc_ee42661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42661),4, //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  ee52661  : virtual dd2661 {
  int e;
  virtual void  bar(); // _ZN7ee526613barEv
  ~ee52661(); // tgen
  ee52661(); // tgen
};
//SIG(1 ee52661) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee52661 ::bar(){vfunc_called(this, "_ZN7ee526613barEv");}
ee52661 ::~ee52661(){ note_dtor("ee52661", this);} // tgen
ee52661 ::ee52661(){ note_ctor("ee52661", this);} // tgen

static void Test_ee52661()
{
  extern Class_Descriptor cd_ee52661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52661, buf);
    ee52661 *dp, &lv = *(dp=new (buf) ee52661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee52661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee52661");
    check_base_class_offset(lv, (cc661*)(dd2661*), ABISELECT(16,8), "ee52661");
    check_base_class_offset(lv, (dd2661*), ABISELECT(16,8), "ee52661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52661.e");
    test_class_info(&lv, &cd_ee52661);
    dp->~ee52661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52661(Test_ee52661, "ee52661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52661C1Ev();
extern void _ZN7ee52661D1Ev();
Name_Map name_map_ee52661[] = {
  NSPAIR(_ZN7ee52661C1Ev),
  NSPAIR(_ZN7ee52661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee52661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52661[];
extern void _ZN7ee526613barEv();
extern void _ZN6dd26613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee526613barEv,_ZTv0_n16_N7ee526613barEv)();
extern void ABISELECT(_ZThn16_N7ee526613barEv,_ZThn8_N7ee526613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52661[0]),
  (VTBL_ENTRY)&_ZN7ee526613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52661[0]),
  (VTBL_ENTRY)&_ZN6dd26613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee526613barEv,_ZTv0_n16_N7ee526613barEv),
};
extern VTBL_ENTRY _ZTV7ee52661[];
static  VTT_ENTRY vtt_ee52661[] = {
  {&(_ZTV7ee52661[3]),  3,10},
  {&(_ZTV7ee52661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52661[];
extern  VTBL_ENTRY _ZTV7ee52661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52661[];
static VTBL_ENTRY alt_thunk_names823[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee526613barEv,_ZTv0_n16_N7ee526613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee526613barEv,_ZThn8_N7ee526613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52661 = {  "ee52661", // class name
  bases_ee52661, 4,
  &(vtc_ee52661[0]), // expected_vtbl_contents
  &(vtt_ee52661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names823,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62661  : dd2661 {
  int e;
  virtual void  foo(); // _ZN7ee626613fooEv
  virtual void  bar(); // _ZN7ee626613barEv
  ~ee62661(); // tgen
  ee62661(); // tgen
};
//SIG(1 ee62661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62661 ::foo(){vfunc_called(this, "_ZN7ee626613fooEv");}
void  ee62661 ::bar(){vfunc_called(this, "_ZN7ee626613barEv");}
ee62661 ::~ee62661(){ note_dtor("ee62661", this);} // tgen
ee62661 ::ee62661(){ note_ctor("ee62661", this);} // tgen

static void Test_ee62661()
{
  extern Class_Descriptor cd_ee62661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62661, buf);
    ee62661 *dp, &lv = *(dp=new (buf) ee62661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), 0, "ee62661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), 0, "ee62661");
    check_base_class_offset(lv, (cc661*)(dd2661*), 0, "ee62661");
    check_base_class_offset(lv, (dd2661*), 0, "ee62661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62661.e");
    test_class_info(&lv, &cd_ee62661);
    dp->~ee62661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62661(Test_ee62661, "ee62661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62661C1Ev();
extern void _ZN7ee62661D1Ev();
Name_Map name_map_ee62661[] = {
  NSPAIR(_ZN7ee62661C1Ev),
  NSPAIR(_ZN7ee62661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee62661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62661[];
extern void _ZN7ee626613fooEv();
extern void _ZN7ee626613barEv();
static  VTBL_ENTRY vtc_ee62661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62661[0]),
  (VTBL_ENTRY)&_ZN7ee626613fooEv,
  (VTBL_ENTRY)&_ZN7ee626613barEv,
};
extern VTBL_ENTRY _ZTI7ee62661[];
extern  VTBL_ENTRY _ZTV7ee62661[];
Class_Descriptor cd_ee62661 = {  "ee62661", // class name
  bases_ee62661, 4,
  &(vtc_ee62661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62661),4, //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  ee72661  : virtual dd2661 {
  int e;
  virtual void  foo(); // _ZN7ee726613fooEv
  virtual void  bar(); // _ZN7ee726613barEv
  ~ee72661(); // tgen
  ee72661(); // tgen
};
//SIG(1 ee72661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72661 ::foo(){vfunc_called(this, "_ZN7ee726613fooEv");}
void  ee72661 ::bar(){vfunc_called(this, "_ZN7ee726613barEv");}
ee72661 ::~ee72661(){ note_dtor("ee72661", this);} // tgen
ee72661 ::ee72661(){ note_ctor("ee72661", this);} // tgen

static void Test_ee72661()
{
  extern Class_Descriptor cd_ee72661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72661, buf);
    ee72661 *dp, &lv = *(dp=new (buf) ee72661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee72661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd2661*), ABISELECT(16,8), "ee72661");
    check_base_class_offset(lv, (cc661*)(dd2661*), ABISELECT(16,8), "ee72661");
    check_base_class_offset(lv, (dd2661*), ABISELECT(16,8), "ee72661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72661.e");
    test_class_info(&lv, &cd_ee72661);
    dp->~ee72661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72661(Test_ee72661, "ee72661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72661C1Ev();
extern void _ZN7ee72661D1Ev();
Name_Map name_map_ee72661[] = {
  NSPAIR(_ZN7ee72661C1Ev),
  NSPAIR(_ZN7ee72661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd2661;
extern VTBL_ENTRY _ZTI6dd2661[];
extern  VTBL_ENTRY _ZTV6dd2661[];
static Base_Class bases_ee72661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2661,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72661[];
extern void _ZN7ee726613fooEv();
extern void _ZN7ee726613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee726613fooEv,_ZTv0_n12_N7ee726613fooEv)();
extern void ABISELECT(_ZThn16_N7ee726613fooEv,_ZThn8_N7ee726613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee726613barEv,_ZTv0_n16_N7ee726613barEv)();
extern void ABISELECT(_ZThn16_N7ee726613barEv,_ZThn8_N7ee726613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72661[0]),
  (VTBL_ENTRY)&_ZN7ee726613fooEv,
  (VTBL_ENTRY)&_ZN7ee726613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee726613fooEv,_ZTv0_n12_N7ee726613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee726613barEv,_ZTv0_n16_N7ee726613barEv),
};
extern VTBL_ENTRY _ZTV7ee72661[];
static  VTT_ENTRY vtt_ee72661[] = {
  {&(_ZTV7ee72661[3]),  3,11},
  {&(_ZTV7ee72661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72661[];
extern  VTBL_ENTRY _ZTV7ee72661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72661[];
static VTBL_ENTRY alt_thunk_names824[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee726613barEv,_ZTv0_n16_N7ee726613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee726613barEv,_ZThn8_N7ee726613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee726613fooEv,_ZTv0_n12_N7ee726613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee726613fooEv,_ZThn8_N7ee726613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72661 = {  "ee72661", // class name
  bases_ee72661, 4,
  &(vtc_ee72661[0]), // expected_vtbl_contents
  &(vtt_ee72661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names824,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3661  : virtual cc661 {
  int d;
  virtual void  foo(); // _ZN6dd36613fooEv
  ~dd3661(); // tgen
  dd3661(); // tgen
};
//SIG(-1 dd3661) C1{ VBC2{ BC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd3661 ::foo(){vfunc_called(this, "_ZN6dd36613fooEv");}
dd3661 ::~dd3661(){ note_dtor("dd3661", this);} // tgen
dd3661 ::dd3661(){ note_ctor("dd3661", this);} // tgen

static void Test_dd3661()
{
  extern Class_Descriptor cd_dd3661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3661, buf);
    dd3661 *dp, &lv = *(dp=new (buf) dd3661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,8), "dd3661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,8), "dd3661");
    check_base_class_offset(lv, (cc661*), ABISELECT(16,8), "dd3661");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3661.d");
    test_class_info(&lv, &cd_dd3661);
    dp->~dd3661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3661(Test_dd3661, "dd3661", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3661C1Ev();
extern void _ZN6dd3661D1Ev();
Name_Map name_map_dd3661[] = {
  NSPAIR(_ZN6dd3661C1Ev),
  NSPAIR(_ZN6dd3661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd3661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3661[];
extern void _ZN6dd36613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_dd3661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV6dd3661[];
static  VTT_ENTRY vtt_dd3661[] = {
  {&(_ZTV6dd3661[3]),  3,10},
  {&(_ZTV6dd3661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static VTBL_ENTRY alt_thunk_names825[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3661 = {  "dd3661", // class name
  bases_dd3661, 3,
  &(vtc_dd3661[0]), // expected_vtbl_contents
  &(vtt_dd3661[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3661),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names825,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03661  : dd3661 {
  int e;
  ~ee03661(); // tgen
  ee03661(); // tgen
};
//SIG(1 ee03661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee03661 ::~ee03661(){ note_dtor("ee03661", this);} // tgen
ee03661 ::ee03661(){ note_ctor("ee03661", this);} // tgen

static void Test_ee03661()
{
  extern Class_Descriptor cd_ee03661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03661, buf);
    ee03661 *dp, &lv = *(dp=new (buf) ee03661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee03661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee03661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(16,12), "ee03661");
    check_base_class_offset(lv, (dd3661*), 0, "ee03661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03661.e");
    test_class_info(&lv, &cd_ee03661);
    dp->~ee03661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03661(Test_ee03661, "ee03661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03661C1Ev();
extern void _ZN7ee03661D1Ev();
Name_Map name_map_ee03661[] = {
  NSPAIR(_ZN7ee03661C1Ev),
  NSPAIR(_ZN7ee03661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee03661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03661[];
extern void _ZN6dd36613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee03661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee03661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee03661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee03661[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee03661[] = {
  {&(_ZTV7ee03661[3]),  3,10},
  {&(_tg__ZTV6dd3661__7ee03661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee03661[4]),  4,6},
  {&(_ZTV7ee03661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03661[];
extern  VTBL_ENTRY _ZTV7ee03661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03661[];
static VTBL_ENTRY alt_thunk_names826[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03661 = {  "ee03661", // class name
  bases_ee03661, 4,
  &(vtc_ee03661[0]), // expected_vtbl_contents
  &(vtt_ee03661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names826,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13661  : virtual dd3661 {
  int e;
  ~ee13661(); // tgen
  ee13661(); // tgen
};
//SIG(1 ee13661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee13661 ::~ee13661(){ note_dtor("ee13661", this);} // tgen
ee13661 ::ee13661(){ note_ctor("ee13661", this);} // tgen

static void Test_ee13661()
{
  extern Class_Descriptor cd_ee13661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13661, buf);
    ee13661 *dp, &lv = *(dp=new (buf) ee13661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee13661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee13661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(32,16), "ee13661");
    check_base_class_offset(lv, (dd3661*), ABISELECT(16,8), "ee13661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13661.e");
    test_class_info(&lv, &cd_ee13661);
    dp->~ee13661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13661(Test_ee13661, "ee13661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13661C1Ev();
extern void _ZN7ee13661D1Ev();
Name_Map name_map_ee13661[] = {
  NSPAIR(_ZN7ee13661C1Ev),
  NSPAIR(_ZN7ee13661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee13661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13661[];
extern void _ZN6dd36613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee13661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13661[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee13661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee13661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee13661[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee13661[] = {
  {&(_ZTV7ee13661[4]),  4,15},
  {&(_ZTV7ee13661[8]),  8,15},
  {&(_ZTV7ee13661[13]),  13,15},
  {&(_tg__ZTV6dd3661__7ee13661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee13661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13661[];
extern  VTBL_ENTRY _ZTV7ee13661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13661[];
static VTBL_ENTRY alt_thunk_names827[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13661 = {  "ee13661", // class name
  bases_ee13661, 4,
  &(vtc_ee13661[0]), // expected_vtbl_contents
  &(vtt_ee13661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13661),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names827,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23661  : dd3661 {
  int e;
  virtual void  foo(); // _ZN7ee236613fooEv
  ~ee23661(); // tgen
  ee23661(); // tgen
};
//SIG(1 ee23661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee23661 ::foo(){vfunc_called(this, "_ZN7ee236613fooEv");}
ee23661 ::~ee23661(){ note_dtor("ee23661", this);} // tgen
ee23661 ::ee23661(){ note_ctor("ee23661", this);} // tgen

static void Test_ee23661()
{
  extern Class_Descriptor cd_ee23661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23661, buf);
    ee23661 *dp, &lv = *(dp=new (buf) ee23661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee23661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee23661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(16,12), "ee23661");
    check_base_class_offset(lv, (dd3661*), 0, "ee23661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23661.e");
    test_class_info(&lv, &cd_ee23661);
    dp->~ee23661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23661(Test_ee23661, "ee23661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23661C1Ev();
extern void _ZN7ee23661D1Ev();
Name_Map name_map_ee23661[] = {
  NSPAIR(_ZN7ee23661C1Ev),
  NSPAIR(_ZN7ee23661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee23661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23661[];
extern void _ZN7ee236613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee236613fooEv,_ZTv0_n12_N7ee236613fooEv)();
extern void ABISELECT(_ZThn16_N7ee236613fooEv,_ZThn12_N7ee236613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee23661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23661[0]),
  (VTBL_ENTRY)&_ZN7ee236613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee236613fooEv,_ZTv0_n12_N7ee236613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee23661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee23661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee23661[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee23661[] = {
  {&(_ZTV7ee23661[3]),  3,10},
  {&(_tg__ZTV6dd3661__7ee23661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee23661[4]),  4,6},
  {&(_ZTV7ee23661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23661[];
extern  VTBL_ENTRY _ZTV7ee23661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23661[];
static VTBL_ENTRY alt_thunk_names828[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee236613fooEv,_ZTv0_n12_N7ee236613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee236613fooEv,_ZThn12_N7ee236613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23661 = {  "ee23661", // class name
  bases_ee23661, 4,
  &(vtc_ee23661[0]), // expected_vtbl_contents
  &(vtt_ee23661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names828,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33661  : virtual dd3661 {
  int e;
  virtual void  foo(); // _ZN7ee336613fooEv
  ~ee33661(); // tgen
  ee33661(); // tgen
};
//SIG(1 ee33661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee33661 ::foo(){vfunc_called(this, "_ZN7ee336613fooEv");}
ee33661 ::~ee33661(){ note_dtor("ee33661", this);} // tgen
ee33661 ::ee33661(){ note_ctor("ee33661", this);} // tgen

static void Test_ee33661()
{
  extern Class_Descriptor cd_ee33661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33661, buf);
    ee33661 *dp, &lv = *(dp=new (buf) ee33661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee33661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee33661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(32,16), "ee33661");
    check_base_class_offset(lv, (dd3661*), ABISELECT(16,8), "ee33661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33661.e");
    test_class_info(&lv, &cd_ee33661);
    dp->~ee33661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33661(Test_ee33661, "ee33661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33661C1Ev();
extern void _ZN7ee33661D1Ev();
Name_Map name_map_ee33661[] = {
  NSPAIR(_ZN7ee33661C1Ev),
  NSPAIR(_ZN7ee33661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee33661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33661[];
extern void _ZN7ee336613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee336613fooEv,_ZTv0_n16_N7ee336613fooEv)();
extern void ABISELECT(_ZThn16_N7ee336613fooEv,_ZThn8_N7ee336613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee336613fooEv,_ZTv0_n12_N7ee336613fooEv)();
extern void ABISELECT(_ZThn32_N7ee336613fooEv,_ZThn16_N7ee336613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY vtc_ee33661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33661[0]),
  (VTBL_ENTRY)&_ZN7ee336613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee336613fooEv,_ZTv0_n16_N7ee336613fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee336613fooEv,_ZTv0_n12_N7ee336613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
extern VTBL_ENTRY _ZTV7ee33661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee33661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee33661[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee33661[] = {
  {&(_ZTV7ee33661[4]),  4,16},
  {&(_ZTV7ee33661[9]),  9,16},
  {&(_ZTV7ee33661[14]),  14,16},
  {&(_tg__ZTV6dd3661__7ee33661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee33661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33661[];
extern  VTBL_ENTRY _ZTV7ee33661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33661[];
static VTBL_ENTRY alt_thunk_names829[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee336613fooEv,_ZTv0_n12_N7ee336613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee336613fooEv,_ZThn16_N7ee336613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee336613fooEv,_ZTv0_n16_N7ee336613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee336613fooEv,_ZThn8_N7ee336613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33661 = {  "ee33661", // class name
  bases_ee33661, 4,
  &(vtc_ee33661[0]), // expected_vtbl_contents
  &(vtt_ee33661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33661),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names829,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43661  : dd3661 {
  int e;
  virtual void  bar(); // _ZN7ee436613barEv
  ~ee43661(); // tgen
  ee43661(); // tgen
};
//SIG(1 ee43661) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee43661 ::bar(){vfunc_called(this, "_ZN7ee436613barEv");}
ee43661 ::~ee43661(){ note_dtor("ee43661", this);} // tgen
ee43661 ::ee43661(){ note_ctor("ee43661", this);} // tgen

static void Test_ee43661()
{
  extern Class_Descriptor cd_ee43661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43661, buf);
    ee43661 *dp, &lv = *(dp=new (buf) ee43661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee43661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee43661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(16,12), "ee43661");
    check_base_class_offset(lv, (dd3661*), 0, "ee43661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43661.e");
    test_class_info(&lv, &cd_ee43661);
    dp->~ee43661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43661(Test_ee43661, "ee43661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43661C1Ev();
extern void _ZN7ee43661D1Ev();
Name_Map name_map_ee43661[] = {
  NSPAIR(_ZN7ee43661C1Ev),
  NSPAIR(_ZN7ee43661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee43661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43661[];
extern void _ZN6dd36613fooEv();
extern void _ZN7ee436613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee436613barEv,_ZTv0_n16_N7ee436613barEv)();
extern void ABISELECT(_ZThn16_N7ee436613barEv,_ZThn12_N7ee436613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
  (VTBL_ENTRY)&_ZN7ee436613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee436613barEv,_ZTv0_n16_N7ee436613barEv),
};
extern VTBL_ENTRY _ZTV7ee43661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee43661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee43661[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee43661[] = {
  {&(_ZTV7ee43661[3]),  3,11},
  {&(_tg__ZTV6dd3661__7ee43661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee43661[4]),  4,6},
  {&(_ZTV7ee43661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43661[];
extern  VTBL_ENTRY _ZTV7ee43661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43661[];
static VTBL_ENTRY alt_thunk_names830[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee436613barEv,_ZTv0_n16_N7ee436613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee436613barEv,_ZThn12_N7ee436613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43661 = {  "ee43661", // class name
  bases_ee43661, 4,
  &(vtc_ee43661[0]), // expected_vtbl_contents
  &(vtt_ee43661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names830,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53661  : virtual dd3661 {
  int e;
  virtual void  bar(); // _ZN7ee536613barEv
  ~ee53661(); // tgen
  ee53661(); // tgen
};
//SIG(1 ee53661) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee53661 ::bar(){vfunc_called(this, "_ZN7ee536613barEv");}
ee53661 ::~ee53661(){ note_dtor("ee53661", this);} // tgen
ee53661 ::ee53661(){ note_ctor("ee53661", this);} // tgen

static void Test_ee53661()
{
  extern Class_Descriptor cd_ee53661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53661, buf);
    ee53661 *dp, &lv = *(dp=new (buf) ee53661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee53661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee53661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(32,16), "ee53661");
    check_base_class_offset(lv, (dd3661*), ABISELECT(16,8), "ee53661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53661.e");
    test_class_info(&lv, &cd_ee53661);
    dp->~ee53661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53661(Test_ee53661, "ee53661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53661C1Ev();
extern void _ZN7ee53661D1Ev();
Name_Map name_map_ee53661[] = {
  NSPAIR(_ZN7ee53661C1Ev),
  NSPAIR(_ZN7ee53661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee53661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53661[];
extern void _ZN7ee536613barEv();
extern void _ZN6dd36613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee536613barEv,_ZTv0_n16_N7ee536613barEv)();
extern void ABISELECT(_ZThn32_N7ee536613barEv,_ZThn16_N7ee536613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53661[0]),
  (VTBL_ENTRY)&_ZN7ee536613barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee536613barEv,_ZTv0_n16_N7ee536613barEv),
};
extern VTBL_ENTRY _ZTV7ee53661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee53661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee53661[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee53661[] = {
  {&(_ZTV7ee53661[4]),  4,16},
  {&(_ZTV7ee53661[9]),  9,16},
  {&(_ZTV7ee53661[14]),  14,16},
  {&(_tg__ZTV6dd3661__7ee53661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee53661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53661[];
extern  VTBL_ENTRY _ZTV7ee53661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53661[];
static VTBL_ENTRY alt_thunk_names831[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee536613barEv,_ZTv0_n16_N7ee536613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee536613barEv,_ZThn16_N7ee536613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53661 = {  "ee53661", // class name
  bases_ee53661, 4,
  &(vtc_ee53661[0]), // expected_vtbl_contents
  &(vtt_ee53661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53661),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names831,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63661  : dd3661 {
  int e;
  virtual void  foo(); // _ZN7ee636613fooEv
  virtual void  bar(); // _ZN7ee636613barEv
  ~ee63661(); // tgen
  ee63661(); // tgen
};
//SIG(1 ee63661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63661 ::foo(){vfunc_called(this, "_ZN7ee636613fooEv");}
void  ee63661 ::bar(){vfunc_called(this, "_ZN7ee636613barEv");}
ee63661 ::~ee63661(){ note_dtor("ee63661", this);} // tgen
ee63661 ::ee63661(){ note_ctor("ee63661", this);} // tgen

static void Test_ee63661()
{
  extern Class_Descriptor cd_ee63661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63661, buf);
    ee63661 *dp, &lv = *(dp=new (buf) ee63661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee63661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee63661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(16,12), "ee63661");
    check_base_class_offset(lv, (dd3661*), 0, "ee63661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63661.e");
    test_class_info(&lv, &cd_ee63661);
    dp->~ee63661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63661(Test_ee63661, "ee63661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63661C1Ev();
extern void _ZN7ee63661D1Ev();
Name_Map name_map_ee63661[] = {
  NSPAIR(_ZN7ee63661C1Ev),
  NSPAIR(_ZN7ee63661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee63661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63661[];
extern void _ZN7ee636613fooEv();
extern void _ZN7ee636613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee636613fooEv,_ZTv0_n12_N7ee636613fooEv)();
extern void ABISELECT(_ZThn16_N7ee636613fooEv,_ZThn12_N7ee636613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee636613barEv,_ZTv0_n16_N7ee636613barEv)();
extern void ABISELECT(_ZThn16_N7ee636613barEv,_ZThn12_N7ee636613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63661[0]),
  (VTBL_ENTRY)&_ZN7ee636613fooEv,
  (VTBL_ENTRY)&_ZN7ee636613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee636613fooEv,_ZTv0_n12_N7ee636613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee636613barEv,_ZTv0_n16_N7ee636613barEv),
};
extern VTBL_ENTRY _ZTV7ee63661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee63661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee63661[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee63661[] = {
  {&(_ZTV7ee63661[3]),  3,11},
  {&(_tg__ZTV6dd3661__7ee63661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee63661[4]),  4,6},
  {&(_ZTV7ee63661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63661[];
extern  VTBL_ENTRY _ZTV7ee63661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63661[];
static VTBL_ENTRY alt_thunk_names832[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn12_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee636613barEv,_ZTv0_n16_N7ee636613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee636613barEv,_ZThn12_N7ee636613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee636613fooEv,_ZTv0_n12_N7ee636613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee636613fooEv,_ZThn12_N7ee636613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63661 = {  "ee63661", // class name
  bases_ee63661, 4,
  &(vtc_ee63661[0]), // expected_vtbl_contents
  &(vtt_ee63661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names832,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73661  : virtual dd3661 {
  int e;
  virtual void  foo(); // _ZN7ee736613fooEv
  virtual void  bar(); // _ZN7ee736613barEv
  ~ee73661(); // tgen
  ee73661(); // tgen
};
//SIG(1 ee73661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73661 ::foo(){vfunc_called(this, "_ZN7ee736613fooEv");}
void  ee73661 ::bar(){vfunc_called(this, "_ZN7ee736613barEv");}
ee73661 ::~ee73661(){ note_dtor("ee73661", this);} // tgen
ee73661 ::ee73661(){ note_ctor("ee73661", this);} // tgen

static void Test_ee73661()
{
  extern Class_Descriptor cd_ee73661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73661, buf);
    ee73661 *dp, &lv = *(dp=new (buf) ee73661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee73661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee73661");
    check_base_class_offset(lv, (cc661*)(dd3661*), ABISELECT(32,16), "ee73661");
    check_base_class_offset(lv, (dd3661*), ABISELECT(16,8), "ee73661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73661.e");
    test_class_info(&lv, &cd_ee73661);
    dp->~ee73661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73661(Test_ee73661, "ee73661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73661C1Ev();
extern void _ZN7ee73661D1Ev();
Name_Map name_map_ee73661[] = {
  NSPAIR(_ZN7ee73661C1Ev),
  NSPAIR(_ZN7ee73661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd3661;
extern VTBL_ENTRY _ZTI6dd3661[];
extern  VTBL_ENTRY _ZTV6dd3661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3661[];
static Base_Class bases_ee73661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3661,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73661[];
extern void _ZN7ee736613fooEv();
extern void _ZN7ee736613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee736613fooEv,_ZTv0_n16_N7ee736613fooEv)();
extern void ABISELECT(_ZThn16_N7ee736613fooEv,_ZThn8_N7ee736613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee736613fooEv,_ZTv0_n12_N7ee736613fooEv)();
extern void ABISELECT(_ZThn32_N7ee736613fooEv,_ZThn16_N7ee736613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee736613barEv,_ZTv0_n16_N7ee736613barEv)();
extern void ABISELECT(_ZThn32_N7ee736613barEv,_ZThn16_N7ee736613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73661[0]),
  (VTBL_ENTRY)&_ZN7ee736613fooEv,
  (VTBL_ENTRY)&_ZN7ee736613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee736613fooEv,_ZTv0_n16_N7ee736613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee736613fooEv,_ZTv0_n12_N7ee736613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee736613barEv,_ZTv0_n16_N7ee736613barEv),
};
extern VTBL_ENTRY _ZTV7ee73661[];
extern void _ZN6dd36613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3661__7ee73661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&_ZN6dd36613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv)();
extern void ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv)() __attribute__((weak));
extern void _ZN5cc6613barEv();
static  VTBL_ENTRY _tg__ZTV5cc661__6dd3661__7ee73661[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv),
  (VTBL_ENTRY)&_ZN5cc6613barEv,
};
static  VTT_ENTRY vtt_ee73661[] = {
  {&(_ZTV7ee73661[4]),  4,17},
  {&(_ZTV7ee73661[10]),  10,17},
  {&(_ZTV7ee73661[15]),  15,17},
  {&(_tg__ZTV6dd3661__7ee73661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd3661__7ee73661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73661[];
extern  VTBL_ENTRY _ZTV7ee73661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73661[];
static VTBL_ENTRY alt_thunk_names833[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36613fooEv,_ZTv0_n12_N6dd36613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36613fooEv,_ZThn8_N6dd36613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee736613barEv,_ZTv0_n16_N7ee736613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee736613barEv,_ZThn16_N7ee736613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee736613fooEv,_ZTv0_n12_N7ee736613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee736613fooEv,_ZThn16_N7ee736613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee736613fooEv,_ZTv0_n16_N7ee736613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee736613fooEv,_ZThn8_N7ee736613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73661 = {  "ee73661", // class name
  bases_ee73661, 4,
  &(vtc_ee73661[0]), // expected_vtbl_contents
  &(vtt_ee73661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73661),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names833,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4661  : cc661 {
  int d;
  virtual void  bar(); // _ZN6dd46613barEv
  ~dd4661(); // tgen
  dd4661(); // tgen
};
//SIG(-1 dd4661) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd4661 ::bar(){vfunc_called(this, "_ZN6dd46613barEv");}
dd4661 ::~dd4661(){ note_dtor("dd4661", this);} // tgen
dd4661 ::dd4661(){ note_ctor("dd4661", this);} // tgen

static void Test_dd4661()
{
  extern Class_Descriptor cd_dd4661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4661, buf);
    dd4661 *dp, &lv = *(dp=new (buf) dd4661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), 0, "dd4661");
    check_base_class_offset(lv, (bb61*)(cc661*), 0, "dd4661");
    check_base_class_offset(lv, (cc661*), 0, "dd4661");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4661.d");
    test_class_info(&lv, &cd_dd4661);
    dp->~dd4661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4661(Test_dd4661, "dd4661", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4661C1Ev();
extern void _ZN6dd4661D1Ev();
Name_Map name_map_dd4661[] = {
  NSPAIR(_ZN6dd4661C1Ev),
  NSPAIR(_ZN6dd4661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd4661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4661[];
extern void _ZN5cc6613fooEv();
extern void _ZN6dd46613barEv();
static  VTBL_ENTRY vtc_dd4661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN6dd46613barEv,
};
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
Class_Descriptor cd_dd4661 = {  "dd4661", // class name
  bases_dd4661, 3,
  &(vtc_dd4661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4661),4, //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  ee04661  : dd4661 {
  int e;
  ~ee04661(); // tgen
  ee04661(); // tgen
};
//SIG(1 ee04661) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee04661 ::~ee04661(){ note_dtor("ee04661", this);} // tgen
ee04661 ::ee04661(){ note_ctor("ee04661", this);} // tgen

static void Test_ee04661()
{
  extern Class_Descriptor cd_ee04661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04661, buf);
    ee04661 *dp, &lv = *(dp=new (buf) ee04661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), 0, "ee04661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), 0, "ee04661");
    check_base_class_offset(lv, (cc661*)(dd4661*), 0, "ee04661");
    check_base_class_offset(lv, (dd4661*), 0, "ee04661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04661.e");
    test_class_info(&lv, &cd_ee04661);
    dp->~ee04661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04661(Test_ee04661, "ee04661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04661C1Ev();
extern void _ZN7ee04661D1Ev();
Name_Map name_map_ee04661[] = {
  NSPAIR(_ZN7ee04661C1Ev),
  NSPAIR(_ZN7ee04661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee04661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04661[];
extern void _ZN5cc6613fooEv();
extern void _ZN6dd46613barEv();
static  VTBL_ENTRY vtc_ee04661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN6dd46613barEv,
};
extern VTBL_ENTRY _ZTI7ee04661[];
extern  VTBL_ENTRY _ZTV7ee04661[];
Class_Descriptor cd_ee04661 = {  "ee04661", // class name
  bases_ee04661, 4,
  &(vtc_ee04661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04661),4, //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  ee14661  : virtual dd4661 {
  int e;
  ~ee14661(); // tgen
  ee14661(); // tgen
};
//SIG(1 ee14661) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee14661 ::~ee14661(){ note_dtor("ee14661", this);} // tgen
ee14661 ::ee14661(){ note_ctor("ee14661", this);} // tgen

static void Test_ee14661()
{
  extern Class_Descriptor cd_ee14661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14661, buf);
    ee14661 *dp, &lv = *(dp=new (buf) ee14661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee14661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee14661");
    check_base_class_offset(lv, (cc661*)(dd4661*), ABISELECT(16,8), "ee14661");
    check_base_class_offset(lv, (dd4661*), ABISELECT(16,8), "ee14661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14661.e");
    test_class_info(&lv, &cd_ee14661);
    dp->~ee14661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14661(Test_ee14661, "ee14661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14661C1Ev();
extern void _ZN7ee14661D1Ev();
Name_Map name_map_ee14661[] = {
  NSPAIR(_ZN7ee14661C1Ev),
  NSPAIR(_ZN7ee14661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee14661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14661[];
extern void _ZN5cc6613fooEv();
extern void _ZN6dd46613barEv();
static  VTBL_ENTRY vtc_ee14661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14661[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN6dd46613barEv,
};
extern VTBL_ENTRY _ZTV7ee14661[];
static  VTT_ENTRY vtt_ee14661[] = {
  {&(_ZTV7ee14661[3]),  3,9},
  {&(_ZTV7ee14661[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14661[];
extern  VTBL_ENTRY _ZTV7ee14661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14661[];
Class_Descriptor cd_ee14661 = {  "ee14661", // class name
  bases_ee14661, 4,
  &(vtc_ee14661[0]), // expected_vtbl_contents
  &(vtt_ee14661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14661),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14661),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  ee24661  : dd4661 {
  int e;
  virtual void  foo(); // _ZN7ee246613fooEv
  ~ee24661(); // tgen
  ee24661(); // tgen
};
//SIG(1 ee24661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee24661 ::foo(){vfunc_called(this, "_ZN7ee246613fooEv");}
ee24661 ::~ee24661(){ note_dtor("ee24661", this);} // tgen
ee24661 ::ee24661(){ note_ctor("ee24661", this);} // tgen

static void Test_ee24661()
{
  extern Class_Descriptor cd_ee24661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24661, buf);
    ee24661 *dp, &lv = *(dp=new (buf) ee24661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), 0, "ee24661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), 0, "ee24661");
    check_base_class_offset(lv, (cc661*)(dd4661*), 0, "ee24661");
    check_base_class_offset(lv, (dd4661*), 0, "ee24661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24661.e");
    test_class_info(&lv, &cd_ee24661);
    dp->~ee24661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24661(Test_ee24661, "ee24661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24661C1Ev();
extern void _ZN7ee24661D1Ev();
Name_Map name_map_ee24661[] = {
  NSPAIR(_ZN7ee24661C1Ev),
  NSPAIR(_ZN7ee24661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee24661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24661[];
extern void _ZN7ee246613fooEv();
extern void _ZN6dd46613barEv();
static  VTBL_ENTRY vtc_ee24661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24661[0]),
  (VTBL_ENTRY)&_ZN7ee246613fooEv,
  (VTBL_ENTRY)&_ZN6dd46613barEv,
};
extern VTBL_ENTRY _ZTI7ee24661[];
extern  VTBL_ENTRY _ZTV7ee24661[];
Class_Descriptor cd_ee24661 = {  "ee24661", // class name
  bases_ee24661, 4,
  &(vtc_ee24661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24661),4, //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  ee34661  : virtual dd4661 {
  int e;
  virtual void  foo(); // _ZN7ee346613fooEv
  ~ee34661(); // tgen
  ee34661(); // tgen
};
//SIG(1 ee34661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee34661 ::foo(){vfunc_called(this, "_ZN7ee346613fooEv");}
ee34661 ::~ee34661(){ note_dtor("ee34661", this);} // tgen
ee34661 ::ee34661(){ note_ctor("ee34661", this);} // tgen

static void Test_ee34661()
{
  extern Class_Descriptor cd_ee34661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34661, buf);
    ee34661 *dp, &lv = *(dp=new (buf) ee34661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee34661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee34661");
    check_base_class_offset(lv, (cc661*)(dd4661*), ABISELECT(16,8), "ee34661");
    check_base_class_offset(lv, (dd4661*), ABISELECT(16,8), "ee34661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34661.e");
    test_class_info(&lv, &cd_ee34661);
    dp->~ee34661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34661(Test_ee34661, "ee34661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34661C1Ev();
extern void _ZN7ee34661D1Ev();
Name_Map name_map_ee34661[] = {
  NSPAIR(_ZN7ee34661C1Ev),
  NSPAIR(_ZN7ee34661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee34661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34661[];
extern void _ZN7ee346613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee346613fooEv,_ZTv0_n12_N7ee346613fooEv)();
extern void ABISELECT(_ZThn16_N7ee346613fooEv,_ZThn8_N7ee346613fooEv)() __attribute__((weak));
extern void _ZN6dd46613barEv();
static  VTBL_ENTRY vtc_ee34661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34661[0]),
  (VTBL_ENTRY)&_ZN7ee346613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee346613fooEv,_ZTv0_n12_N7ee346613fooEv),
  (VTBL_ENTRY)&_ZN6dd46613barEv,
};
extern VTBL_ENTRY _ZTV7ee34661[];
static  VTT_ENTRY vtt_ee34661[] = {
  {&(_ZTV7ee34661[3]),  3,10},
  {&(_ZTV7ee34661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34661[];
extern  VTBL_ENTRY _ZTV7ee34661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34661[];
static VTBL_ENTRY alt_thunk_names834[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee346613fooEv,_ZTv0_n12_N7ee346613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee346613fooEv,_ZThn8_N7ee346613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34661 = {  "ee34661", // class name
  bases_ee34661, 4,
  &(vtc_ee34661[0]), // expected_vtbl_contents
  &(vtt_ee34661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names834,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44661  : dd4661 {
  int e;
  virtual void  bar(); // _ZN7ee446613barEv
  ~ee44661(); // tgen
  ee44661(); // tgen
};
//SIG(1 ee44661) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee44661 ::bar(){vfunc_called(this, "_ZN7ee446613barEv");}
ee44661 ::~ee44661(){ note_dtor("ee44661", this);} // tgen
ee44661 ::ee44661(){ note_ctor("ee44661", this);} // tgen

static void Test_ee44661()
{
  extern Class_Descriptor cd_ee44661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44661, buf);
    ee44661 *dp, &lv = *(dp=new (buf) ee44661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), 0, "ee44661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), 0, "ee44661");
    check_base_class_offset(lv, (cc661*)(dd4661*), 0, "ee44661");
    check_base_class_offset(lv, (dd4661*), 0, "ee44661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44661.e");
    test_class_info(&lv, &cd_ee44661);
    dp->~ee44661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44661(Test_ee44661, "ee44661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44661C1Ev();
extern void _ZN7ee44661D1Ev();
Name_Map name_map_ee44661[] = {
  NSPAIR(_ZN7ee44661C1Ev),
  NSPAIR(_ZN7ee44661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee44661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44661[];
extern void _ZN5cc6613fooEv();
extern void _ZN7ee446613barEv();
static  VTBL_ENTRY vtc_ee44661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&_ZN7ee446613barEv,
};
extern VTBL_ENTRY _ZTI7ee44661[];
extern  VTBL_ENTRY _ZTV7ee44661[];
Class_Descriptor cd_ee44661 = {  "ee44661", // class name
  bases_ee44661, 4,
  &(vtc_ee44661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44661),4, //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  ee54661  : virtual dd4661 {
  int e;
  virtual void  bar(); // _ZN7ee546613barEv
  ~ee54661(); // tgen
  ee54661(); // tgen
};
//SIG(1 ee54661) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee54661 ::bar(){vfunc_called(this, "_ZN7ee546613barEv");}
ee54661 ::~ee54661(){ note_dtor("ee54661", this);} // tgen
ee54661 ::ee54661(){ note_ctor("ee54661", this);} // tgen

static void Test_ee54661()
{
  extern Class_Descriptor cd_ee54661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54661, buf);
    ee54661 *dp, &lv = *(dp=new (buf) ee54661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee54661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee54661");
    check_base_class_offset(lv, (cc661*)(dd4661*), ABISELECT(16,8), "ee54661");
    check_base_class_offset(lv, (dd4661*), ABISELECT(16,8), "ee54661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54661.e");
    test_class_info(&lv, &cd_ee54661);
    dp->~ee54661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54661(Test_ee54661, "ee54661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54661C1Ev();
extern void _ZN7ee54661D1Ev();
Name_Map name_map_ee54661[] = {
  NSPAIR(_ZN7ee54661C1Ev),
  NSPAIR(_ZN7ee54661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee54661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54661[];
extern void _ZN7ee546613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee546613barEv,_ZTv0_n16_N7ee546613barEv)();
extern void ABISELECT(_ZThn16_N7ee546613barEv,_ZThn8_N7ee546613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54661[0]),
  (VTBL_ENTRY)&_ZN7ee546613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee546613barEv,_ZTv0_n16_N7ee546613barEv),
};
extern VTBL_ENTRY _ZTV7ee54661[];
static  VTT_ENTRY vtt_ee54661[] = {
  {&(_ZTV7ee54661[3]),  3,10},
  {&(_ZTV7ee54661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54661[];
extern  VTBL_ENTRY _ZTV7ee54661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54661[];
static VTBL_ENTRY alt_thunk_names835[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee546613barEv,_ZTv0_n16_N7ee546613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee546613barEv,_ZThn8_N7ee546613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54661 = {  "ee54661", // class name
  bases_ee54661, 4,
  &(vtc_ee54661[0]), // expected_vtbl_contents
  &(vtt_ee54661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names835,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64661  : dd4661 {
  int e;
  virtual void  foo(); // _ZN7ee646613fooEv
  virtual void  bar(); // _ZN7ee646613barEv
  ~ee64661(); // tgen
  ee64661(); // tgen
};
//SIG(1 ee64661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64661 ::foo(){vfunc_called(this, "_ZN7ee646613fooEv");}
void  ee64661 ::bar(){vfunc_called(this, "_ZN7ee646613barEv");}
ee64661 ::~ee64661(){ note_dtor("ee64661", this);} // tgen
ee64661 ::ee64661(){ note_ctor("ee64661", this);} // tgen

static void Test_ee64661()
{
  extern Class_Descriptor cd_ee64661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64661, buf);
    ee64661 *dp, &lv = *(dp=new (buf) ee64661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), 0, "ee64661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), 0, "ee64661");
    check_base_class_offset(lv, (cc661*)(dd4661*), 0, "ee64661");
    check_base_class_offset(lv, (dd4661*), 0, "ee64661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64661.e");
    test_class_info(&lv, &cd_ee64661);
    dp->~ee64661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64661(Test_ee64661, "ee64661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64661C1Ev();
extern void _ZN7ee64661D1Ev();
Name_Map name_map_ee64661[] = {
  NSPAIR(_ZN7ee64661C1Ev),
  NSPAIR(_ZN7ee64661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee64661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64661[];
extern void _ZN7ee646613fooEv();
extern void _ZN7ee646613barEv();
static  VTBL_ENTRY vtc_ee64661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64661[0]),
  (VTBL_ENTRY)&_ZN7ee646613fooEv,
  (VTBL_ENTRY)&_ZN7ee646613barEv,
};
extern VTBL_ENTRY _ZTI7ee64661[];
extern  VTBL_ENTRY _ZTV7ee64661[];
Class_Descriptor cd_ee64661 = {  "ee64661", // class name
  bases_ee64661, 4,
  &(vtc_ee64661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64661),4, //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  ee74661  : virtual dd4661 {
  int e;
  virtual void  foo(); // _ZN7ee746613fooEv
  virtual void  bar(); // _ZN7ee746613barEv
  ~ee74661(); // tgen
  ee74661(); // tgen
};
//SIG(1 ee74661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74661 ::foo(){vfunc_called(this, "_ZN7ee746613fooEv");}
void  ee74661 ::bar(){vfunc_called(this, "_ZN7ee746613barEv");}
ee74661 ::~ee74661(){ note_dtor("ee74661", this);} // tgen
ee74661 ::ee74661(){ note_ctor("ee74661", this);} // tgen

static void Test_ee74661()
{
  extern Class_Descriptor cd_ee74661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74661, buf);
    ee74661 *dp, &lv = *(dp=new (buf) ee74661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee74661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd4661*), ABISELECT(16,8), "ee74661");
    check_base_class_offset(lv, (cc661*)(dd4661*), ABISELECT(16,8), "ee74661");
    check_base_class_offset(lv, (dd4661*), ABISELECT(16,8), "ee74661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74661.e");
    test_class_info(&lv, &cd_ee74661);
    dp->~ee74661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74661(Test_ee74661, "ee74661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74661C1Ev();
extern void _ZN7ee74661D1Ev();
Name_Map name_map_ee74661[] = {
  NSPAIR(_ZN7ee74661C1Ev),
  NSPAIR(_ZN7ee74661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd4661;
extern VTBL_ENTRY _ZTI6dd4661[];
extern  VTBL_ENTRY _ZTV6dd4661[];
static Base_Class bases_ee74661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4661,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74661[];
extern void _ZN7ee746613fooEv();
extern void _ZN7ee746613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee746613fooEv,_ZTv0_n12_N7ee746613fooEv)();
extern void ABISELECT(_ZThn16_N7ee746613fooEv,_ZThn8_N7ee746613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee746613barEv,_ZTv0_n16_N7ee746613barEv)();
extern void ABISELECT(_ZThn16_N7ee746613barEv,_ZThn8_N7ee746613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74661[0]),
  (VTBL_ENTRY)&_ZN7ee746613fooEv,
  (VTBL_ENTRY)&_ZN7ee746613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee746613fooEv,_ZTv0_n12_N7ee746613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee746613barEv,_ZTv0_n16_N7ee746613barEv),
};
extern VTBL_ENTRY _ZTV7ee74661[];
static  VTT_ENTRY vtt_ee74661[] = {
  {&(_ZTV7ee74661[3]),  3,11},
  {&(_ZTV7ee74661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74661[];
extern  VTBL_ENTRY _ZTV7ee74661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74661[];
static VTBL_ENTRY alt_thunk_names836[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee746613barEv,_ZTv0_n16_N7ee746613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee746613barEv,_ZThn8_N7ee746613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee746613fooEv,_ZTv0_n12_N7ee746613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee746613fooEv,_ZThn8_N7ee746613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74661 = {  "ee74661", // class name
  bases_ee74661, 4,
  &(vtc_ee74661[0]), // expected_vtbl_contents
  &(vtt_ee74661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names836,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5661  : virtual cc661 {
  int d;
  virtual void  bar(); // _ZN6dd56613barEv
  ~dd5661(); // tgen
  dd5661(); // tgen
};
//SIG(-1 dd5661) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd5661 ::bar(){vfunc_called(this, "_ZN6dd56613barEv");}
dd5661 ::~dd5661(){ note_dtor("dd5661", this);} // tgen
dd5661 ::dd5661(){ note_ctor("dd5661", this);} // tgen

static void Test_dd5661()
{
  extern Class_Descriptor cd_dd5661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5661, buf);
    dd5661 *dp, &lv = *(dp=new (buf) dd5661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,8), "dd5661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,8), "dd5661");
    check_base_class_offset(lv, (cc661*), ABISELECT(16,8), "dd5661");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5661.d");
    test_class_info(&lv, &cd_dd5661);
    dp->~dd5661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5661(Test_dd5661, "dd5661", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5661C1Ev();
extern void _ZN6dd5661D1Ev();
Name_Map name_map_dd5661[] = {
  NSPAIR(_ZN6dd5661C1Ev),
  NSPAIR(_ZN6dd5661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd5661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5661[];
extern void _ZN6dd56613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
extern VTBL_ENTRY _ZTV6dd5661[];
static  VTT_ENTRY vtt_dd5661[] = {
  {&(_ZTV6dd5661[3]),  3,10},
  {&(_ZTV6dd5661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static VTBL_ENTRY alt_thunk_names837[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5661 = {  "dd5661", // class name
  bases_dd5661, 3,
  &(vtc_dd5661[0]), // expected_vtbl_contents
  &(vtt_dd5661[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5661),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names837,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05661  : dd5661 {
  int e;
  ~ee05661(); // tgen
  ee05661(); // tgen
};
//SIG(1 ee05661) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee05661 ::~ee05661(){ note_dtor("ee05661", this);} // tgen
ee05661 ::ee05661(){ note_ctor("ee05661", this);} // tgen

static void Test_ee05661()
{
  extern Class_Descriptor cd_ee05661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05661, buf);
    ee05661 *dp, &lv = *(dp=new (buf) ee05661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee05661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee05661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(16,12), "ee05661");
    check_base_class_offset(lv, (dd5661*), 0, "ee05661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05661.e");
    test_class_info(&lv, &cd_ee05661);
    dp->~ee05661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05661(Test_ee05661, "ee05661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05661C1Ev();
extern void _ZN7ee05661D1Ev();
Name_Map name_map_ee05661[] = {
  NSPAIR(_ZN7ee05661C1Ev),
  NSPAIR(_ZN7ee05661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee05661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05661[];
extern void _ZN6dd56613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
extern VTBL_ENTRY _ZTV7ee05661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee05661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee05661[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee05661[] = {
  {&(_ZTV7ee05661[3]),  3,10},
  {&(_tg__ZTV6dd5661__7ee05661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee05661[4]),  4,6},
  {&(_ZTV7ee05661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05661[];
extern  VTBL_ENTRY _ZTV7ee05661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05661[];
static VTBL_ENTRY alt_thunk_names838[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05661 = {  "ee05661", // class name
  bases_ee05661, 4,
  &(vtc_ee05661[0]), // expected_vtbl_contents
  &(vtt_ee05661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names838,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15661  : virtual dd5661 {
  int e;
  ~ee15661(); // tgen
  ee15661(); // tgen
};
//SIG(1 ee15661) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee15661 ::~ee15661(){ note_dtor("ee15661", this);} // tgen
ee15661 ::ee15661(){ note_ctor("ee15661", this);} // tgen

static void Test_ee15661()
{
  extern Class_Descriptor cd_ee15661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15661, buf);
    ee15661 *dp, &lv = *(dp=new (buf) ee15661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee15661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee15661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(32,16), "ee15661");
    check_base_class_offset(lv, (dd5661*), ABISELECT(16,8), "ee15661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15661.e");
    test_class_info(&lv, &cd_ee15661);
    dp->~ee15661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15661(Test_ee15661, "ee15661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15661C1Ev();
extern void _ZN7ee15661D1Ev();
Name_Map name_map_ee15661[] = {
  NSPAIR(_ZN7ee15661C1Ev),
  NSPAIR(_ZN7ee15661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee15661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15661[];
extern void _ZN6dd56613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15661[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
extern VTBL_ENTRY _ZTV7ee15661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee15661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee15661[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee15661[] = {
  {&(_ZTV7ee15661[4]),  4,15},
  {&(_ZTV7ee15661[8]),  8,15},
  {&(_ZTV7ee15661[13]),  13,15},
  {&(_tg__ZTV6dd5661__7ee15661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee15661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15661[];
extern  VTBL_ENTRY _ZTV7ee15661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15661[];
static VTBL_ENTRY alt_thunk_names839[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15661 = {  "ee15661", // class name
  bases_ee15661, 4,
  &(vtc_ee15661[0]), // expected_vtbl_contents
  &(vtt_ee15661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15661),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names839,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25661  : dd5661 {
  int e;
  virtual void  foo(); // _ZN7ee256613fooEv
  ~ee25661(); // tgen
  ee25661(); // tgen
};
//SIG(1 ee25661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee25661 ::foo(){vfunc_called(this, "_ZN7ee256613fooEv");}
ee25661 ::~ee25661(){ note_dtor("ee25661", this);} // tgen
ee25661 ::ee25661(){ note_ctor("ee25661", this);} // tgen

static void Test_ee25661()
{
  extern Class_Descriptor cd_ee25661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25661, buf);
    ee25661 *dp, &lv = *(dp=new (buf) ee25661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee25661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee25661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(16,12), "ee25661");
    check_base_class_offset(lv, (dd5661*), 0, "ee25661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25661.e");
    test_class_info(&lv, &cd_ee25661);
    dp->~ee25661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25661(Test_ee25661, "ee25661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25661C1Ev();
extern void _ZN7ee25661D1Ev();
Name_Map name_map_ee25661[] = {
  NSPAIR(_ZN7ee25661C1Ev),
  NSPAIR(_ZN7ee25661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee25661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25661[];
extern void _ZN6dd56613barEv();
extern void _ZN7ee256613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee256613fooEv,_ZTv0_n12_N7ee256613fooEv)();
extern void ABISELECT(_ZThn16_N7ee256613fooEv,_ZThn12_N7ee256613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
  (VTBL_ENTRY)&_ZN7ee256613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee256613fooEv,_ZTv0_n12_N7ee256613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
extern VTBL_ENTRY _ZTV7ee25661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee25661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee25661[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee25661[] = {
  {&(_ZTV7ee25661[3]),  3,11},
  {&(_tg__ZTV6dd5661__7ee25661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee25661[4]),  4,6},
  {&(_ZTV7ee25661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25661[];
extern  VTBL_ENTRY _ZTV7ee25661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25661[];
static VTBL_ENTRY alt_thunk_names840[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee256613fooEv,_ZTv0_n12_N7ee256613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee256613fooEv,_ZThn12_N7ee256613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25661 = {  "ee25661", // class name
  bases_ee25661, 4,
  &(vtc_ee25661[0]), // expected_vtbl_contents
  &(vtt_ee25661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names840,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35661  : virtual dd5661 {
  int e;
  virtual void  foo(); // _ZN7ee356613fooEv
  ~ee35661(); // tgen
  ee35661(); // tgen
};
//SIG(1 ee35661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee35661 ::foo(){vfunc_called(this, "_ZN7ee356613fooEv");}
ee35661 ::~ee35661(){ note_dtor("ee35661", this);} // tgen
ee35661 ::ee35661(){ note_ctor("ee35661", this);} // tgen

static void Test_ee35661()
{
  extern Class_Descriptor cd_ee35661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35661, buf);
    ee35661 *dp, &lv = *(dp=new (buf) ee35661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee35661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee35661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(32,16), "ee35661");
    check_base_class_offset(lv, (dd5661*), ABISELECT(16,8), "ee35661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35661.e");
    test_class_info(&lv, &cd_ee35661);
    dp->~ee35661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35661(Test_ee35661, "ee35661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35661C1Ev();
extern void _ZN7ee35661D1Ev();
Name_Map name_map_ee35661[] = {
  NSPAIR(_ZN7ee35661C1Ev),
  NSPAIR(_ZN7ee35661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee35661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35661[];
extern void _ZN7ee356613fooEv();
extern void _ZN6dd56613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee356613fooEv,_ZTv0_n12_N7ee356613fooEv)();
extern void ABISELECT(_ZThn32_N7ee356613fooEv,_ZThn16_N7ee356613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35661[0]),
  (VTBL_ENTRY)&_ZN7ee356613fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee356613fooEv,_ZTv0_n12_N7ee356613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
extern VTBL_ENTRY _ZTV7ee35661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee35661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee35661[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee35661[] = {
  {&(_ZTV7ee35661[4]),  4,16},
  {&(_ZTV7ee35661[9]),  9,16},
  {&(_ZTV7ee35661[14]),  14,16},
  {&(_tg__ZTV6dd5661__7ee35661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee35661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35661[];
extern  VTBL_ENTRY _ZTV7ee35661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35661[];
static VTBL_ENTRY alt_thunk_names841[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee356613fooEv,_ZTv0_n12_N7ee356613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee356613fooEv,_ZThn16_N7ee356613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35661 = {  "ee35661", // class name
  bases_ee35661, 4,
  &(vtc_ee35661[0]), // expected_vtbl_contents
  &(vtt_ee35661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35661),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names841,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45661  : dd5661 {
  int e;
  virtual void  bar(); // _ZN7ee456613barEv
  ~ee45661(); // tgen
  ee45661(); // tgen
};
//SIG(1 ee45661) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee45661 ::bar(){vfunc_called(this, "_ZN7ee456613barEv");}
ee45661 ::~ee45661(){ note_dtor("ee45661", this);} // tgen
ee45661 ::ee45661(){ note_ctor("ee45661", this);} // tgen

static void Test_ee45661()
{
  extern Class_Descriptor cd_ee45661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45661, buf);
    ee45661 *dp, &lv = *(dp=new (buf) ee45661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee45661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee45661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(16,12), "ee45661");
    check_base_class_offset(lv, (dd5661*), 0, "ee45661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45661.e");
    test_class_info(&lv, &cd_ee45661);
    dp->~ee45661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45661(Test_ee45661, "ee45661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45661C1Ev();
extern void _ZN7ee45661D1Ev();
Name_Map name_map_ee45661[] = {
  NSPAIR(_ZN7ee45661C1Ev),
  NSPAIR(_ZN7ee45661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee45661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45661[];
extern void _ZN7ee456613barEv();
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee456613barEv,_ZTv0_n16_N7ee456613barEv)();
extern void ABISELECT(_ZThn16_N7ee456613barEv,_ZThn12_N7ee456613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45661[0]),
  (VTBL_ENTRY)&_ZN7ee456613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee456613barEv,_ZTv0_n16_N7ee456613barEv),
};
extern VTBL_ENTRY _ZTV7ee45661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee45661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee45661[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee45661[] = {
  {&(_ZTV7ee45661[3]),  3,10},
  {&(_tg__ZTV6dd5661__7ee45661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee45661[4]),  4,6},
  {&(_ZTV7ee45661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45661[];
extern  VTBL_ENTRY _ZTV7ee45661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45661[];
static VTBL_ENTRY alt_thunk_names842[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee456613barEv,_ZTv0_n16_N7ee456613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee456613barEv,_ZThn12_N7ee456613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45661 = {  "ee45661", // class name
  bases_ee45661, 4,
  &(vtc_ee45661[0]), // expected_vtbl_contents
  &(vtt_ee45661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names842,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55661  : virtual dd5661 {
  int e;
  virtual void  bar(); // _ZN7ee556613barEv
  ~ee55661(); // tgen
  ee55661(); // tgen
};
//SIG(1 ee55661) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee55661 ::bar(){vfunc_called(this, "_ZN7ee556613barEv");}
ee55661 ::~ee55661(){ note_dtor("ee55661", this);} // tgen
ee55661 ::ee55661(){ note_ctor("ee55661", this);} // tgen

static void Test_ee55661()
{
  extern Class_Descriptor cd_ee55661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55661, buf);
    ee55661 *dp, &lv = *(dp=new (buf) ee55661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee55661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee55661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(32,16), "ee55661");
    check_base_class_offset(lv, (dd5661*), ABISELECT(16,8), "ee55661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55661.e");
    test_class_info(&lv, &cd_ee55661);
    dp->~ee55661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55661(Test_ee55661, "ee55661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55661C1Ev();
extern void _ZN7ee55661D1Ev();
Name_Map name_map_ee55661[] = {
  NSPAIR(_ZN7ee55661C1Ev),
  NSPAIR(_ZN7ee55661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee55661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55661[];
extern void _ZN7ee556613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee556613barEv,_ZTv0_n16_N7ee556613barEv)();
extern void ABISELECT(_ZThn16_N7ee556613barEv,_ZThn8_N7ee556613barEv)() __attribute__((weak));
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee556613barEv,_ZTv0_n16_N7ee556613barEv)();
extern void ABISELECT(_ZThn32_N7ee556613barEv,_ZThn16_N7ee556613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55661[0]),
  (VTBL_ENTRY)&_ZN7ee556613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee556613barEv,_ZTv0_n16_N7ee556613barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee556613barEv,_ZTv0_n16_N7ee556613barEv),
};
extern VTBL_ENTRY _ZTV7ee55661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee55661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee55661[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee55661[] = {
  {&(_ZTV7ee55661[4]),  4,16},
  {&(_ZTV7ee55661[9]),  9,16},
  {&(_ZTV7ee55661[14]),  14,16},
  {&(_tg__ZTV6dd5661__7ee55661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee55661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55661[];
extern  VTBL_ENTRY _ZTV7ee55661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55661[];
static VTBL_ENTRY alt_thunk_names843[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee556613barEv,_ZTv0_n16_N7ee556613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee556613barEv,_ZThn16_N7ee556613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee556613barEv,_ZThn8_N7ee556613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55661 = {  "ee55661", // class name
  bases_ee55661, 4,
  &(vtc_ee55661[0]), // expected_vtbl_contents
  &(vtt_ee55661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55661),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names843,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65661  : dd5661 {
  int e;
  virtual void  foo(); // _ZN7ee656613fooEv
  virtual void  bar(); // _ZN7ee656613barEv
  ~ee65661(); // tgen
  ee65661(); // tgen
};
//SIG(1 ee65661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65661 ::foo(){vfunc_called(this, "_ZN7ee656613fooEv");}
void  ee65661 ::bar(){vfunc_called(this, "_ZN7ee656613barEv");}
ee65661 ::~ee65661(){ note_dtor("ee65661", this);} // tgen
ee65661 ::ee65661(){ note_ctor("ee65661", this);} // tgen

static void Test_ee65661()
{
  extern Class_Descriptor cd_ee65661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65661, buf);
    ee65661 *dp, &lv = *(dp=new (buf) ee65661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee65661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee65661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(16,12), "ee65661");
    check_base_class_offset(lv, (dd5661*), 0, "ee65661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65661.e");
    test_class_info(&lv, &cd_ee65661);
    dp->~ee65661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65661(Test_ee65661, "ee65661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65661C1Ev();
extern void _ZN7ee65661D1Ev();
Name_Map name_map_ee65661[] = {
  NSPAIR(_ZN7ee65661C1Ev),
  NSPAIR(_ZN7ee65661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee65661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65661[];
extern void _ZN7ee656613barEv();
extern void _ZN7ee656613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee656613fooEv,_ZTv0_n12_N7ee656613fooEv)();
extern void ABISELECT(_ZThn16_N7ee656613fooEv,_ZThn12_N7ee656613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee656613barEv,_ZTv0_n16_N7ee656613barEv)();
extern void ABISELECT(_ZThn16_N7ee656613barEv,_ZThn12_N7ee656613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65661[0]),
  (VTBL_ENTRY)&_ZN7ee656613barEv,
  (VTBL_ENTRY)&_ZN7ee656613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee656613fooEv,_ZTv0_n12_N7ee656613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee656613barEv,_ZTv0_n16_N7ee656613barEv),
};
extern VTBL_ENTRY _ZTV7ee65661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee65661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee65661[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee65661[] = {
  {&(_ZTV7ee65661[3]),  3,11},
  {&(_tg__ZTV6dd5661__7ee65661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee65661[4]),  4,6},
  {&(_ZTV7ee65661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65661[];
extern  VTBL_ENTRY _ZTV7ee65661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65661[];
static VTBL_ENTRY alt_thunk_names844[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn12_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee656613barEv,_ZTv0_n16_N7ee656613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee656613barEv,_ZThn12_N7ee656613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee656613fooEv,_ZTv0_n12_N7ee656613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee656613fooEv,_ZThn12_N7ee656613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65661 = {  "ee65661", // class name
  bases_ee65661, 4,
  &(vtc_ee65661[0]), // expected_vtbl_contents
  &(vtt_ee65661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names844,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75661  : virtual dd5661 {
  int e;
  virtual void  foo(); // _ZN7ee756613fooEv
  virtual void  bar(); // _ZN7ee756613barEv
  ~ee75661(); // tgen
  ee75661(); // tgen
};
//SIG(1 ee75661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75661 ::foo(){vfunc_called(this, "_ZN7ee756613fooEv");}
void  ee75661 ::bar(){vfunc_called(this, "_ZN7ee756613barEv");}
ee75661 ::~ee75661(){ note_dtor("ee75661", this);} // tgen
ee75661 ::ee75661(){ note_ctor("ee75661", this);} // tgen

static void Test_ee75661()
{
  extern Class_Descriptor cd_ee75661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75661, buf);
    ee75661 *dp, &lv = *(dp=new (buf) ee75661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee75661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee75661");
    check_base_class_offset(lv, (cc661*)(dd5661*), ABISELECT(32,16), "ee75661");
    check_base_class_offset(lv, (dd5661*), ABISELECT(16,8), "ee75661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75661.e");
    test_class_info(&lv, &cd_ee75661);
    dp->~ee75661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75661(Test_ee75661, "ee75661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75661C1Ev();
extern void _ZN7ee75661D1Ev();
Name_Map name_map_ee75661[] = {
  NSPAIR(_ZN7ee75661C1Ev),
  NSPAIR(_ZN7ee75661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd5661;
extern VTBL_ENTRY _ZTI6dd5661[];
extern  VTBL_ENTRY _ZTV6dd5661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5661[];
static Base_Class bases_ee75661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5661,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75661[];
extern void _ZN7ee756613fooEv();
extern void _ZN7ee756613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee756613barEv,_ZTv0_n16_N7ee756613barEv)();
extern void ABISELECT(_ZThn16_N7ee756613barEv,_ZThn8_N7ee756613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee756613fooEv,_ZTv0_n12_N7ee756613fooEv)();
extern void ABISELECT(_ZThn32_N7ee756613fooEv,_ZThn16_N7ee756613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee756613barEv,_ZTv0_n16_N7ee756613barEv)();
extern void ABISELECT(_ZThn32_N7ee756613barEv,_ZThn16_N7ee756613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75661[0]),
  (VTBL_ENTRY)&_ZN7ee756613fooEv,
  (VTBL_ENTRY)&_ZN7ee756613barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee756613barEv,_ZTv0_n16_N7ee756613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee756613fooEv,_ZTv0_n12_N7ee756613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee756613barEv,_ZTv0_n16_N7ee756613barEv),
};
extern VTBL_ENTRY _ZTV7ee75661[];
extern void _ZN6dd56613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5661__7ee75661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN6dd56613barEv,
};
extern void _ZN5cc6613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv)();
extern void ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd5661__7ee75661[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5661[0]),
  (VTBL_ENTRY)&_ZN5cc6613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv),
};
static  VTT_ENTRY vtt_ee75661[] = {
  {&(_ZTV7ee75661[4]),  4,17},
  {&(_ZTV7ee75661[10]),  10,17},
  {&(_ZTV7ee75661[15]),  15,17},
  {&(_tg__ZTV6dd5661__7ee75661[3]),  3,4},
  {&(_tg__ZTV5cc661__6dd5661__7ee75661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75661[];
extern  VTBL_ENTRY _ZTV7ee75661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75661[];
static VTBL_ENTRY alt_thunk_names845[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56613barEv,_ZTv0_n16_N6dd56613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56613barEv,_ZThn8_N6dd56613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee756613fooEv,_ZTv0_n12_N7ee756613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee756613fooEv,_ZThn16_N7ee756613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee756613barEv,_ZTv0_n16_N7ee756613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee756613barEv,_ZThn16_N7ee756613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee756613barEv,_ZThn8_N7ee756613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75661 = {  "ee75661", // class name
  bases_ee75661, 4,
  &(vtc_ee75661[0]), // expected_vtbl_contents
  &(vtt_ee75661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75661),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names845,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6661  : cc661 {
  int d;
  virtual void  bar(); // _ZN6dd66613barEv
  virtual void  foo(); // _ZN6dd66613fooEv
  ~dd6661(); // tgen
  dd6661(); // tgen
};
//SIG(-1 dd6661) C1{ BC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd6661 ::bar(){vfunc_called(this, "_ZN6dd66613barEv");}
void  dd6661 ::foo(){vfunc_called(this, "_ZN6dd66613fooEv");}
dd6661 ::~dd6661(){ note_dtor("dd6661", this);} // tgen
dd6661 ::dd6661(){ note_ctor("dd6661", this);} // tgen

static void Test_dd6661()
{
  extern Class_Descriptor cd_dd6661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6661, buf);
    dd6661 *dp, &lv = *(dp=new (buf) dd6661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), 0, "dd6661");
    check_base_class_offset(lv, (bb61*)(cc661*), 0, "dd6661");
    check_base_class_offset(lv, (cc661*), 0, "dd6661");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6661.d");
    test_class_info(&lv, &cd_dd6661);
    dp->~dd6661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6661(Test_dd6661, "dd6661", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6661C1Ev();
extern void _ZN6dd6661D1Ev();
Name_Map name_map_dd6661[] = {
  NSPAIR(_ZN6dd6661C1Ev),
  NSPAIR(_ZN6dd6661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd6661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6661[];
extern void _ZN6dd66613fooEv();
extern void _ZN6dd66613barEv();
static  VTBL_ENTRY vtc_dd6661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6661[0]),
  (VTBL_ENTRY)&_ZN6dd66613fooEv,
  (VTBL_ENTRY)&_ZN6dd66613barEv,
};
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
Class_Descriptor cd_dd6661 = {  "dd6661", // class name
  bases_dd6661, 3,
  &(vtc_dd6661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6661),4, //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  ee06661  : dd6661 {
  int e;
  ~ee06661(); // tgen
  ee06661(); // tgen
};
//SIG(1 ee06661) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee06661 ::~ee06661(){ note_dtor("ee06661", this);} // tgen
ee06661 ::ee06661(){ note_ctor("ee06661", this);} // tgen

static void Test_ee06661()
{
  extern Class_Descriptor cd_ee06661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06661, buf);
    ee06661 *dp, &lv = *(dp=new (buf) ee06661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), 0, "ee06661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), 0, "ee06661");
    check_base_class_offset(lv, (cc661*)(dd6661*), 0, "ee06661");
    check_base_class_offset(lv, (dd6661*), 0, "ee06661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06661.e");
    test_class_info(&lv, &cd_ee06661);
    dp->~ee06661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06661(Test_ee06661, "ee06661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06661C1Ev();
extern void _ZN7ee06661D1Ev();
Name_Map name_map_ee06661[] = {
  NSPAIR(_ZN7ee06661C1Ev),
  NSPAIR(_ZN7ee06661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee06661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06661[];
extern void _ZN6dd66613fooEv();
extern void _ZN6dd66613barEv();
static  VTBL_ENTRY vtc_ee06661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06661[0]),
  (VTBL_ENTRY)&_ZN6dd66613fooEv,
  (VTBL_ENTRY)&_ZN6dd66613barEv,
};
extern VTBL_ENTRY _ZTI7ee06661[];
extern  VTBL_ENTRY _ZTV7ee06661[];
Class_Descriptor cd_ee06661 = {  "ee06661", // class name
  bases_ee06661, 4,
  &(vtc_ee06661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06661),4, //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  ee16661  : virtual dd6661 {
  int e;
  ~ee16661(); // tgen
  ee16661(); // tgen
};
//SIG(1 ee16661) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee16661 ::~ee16661(){ note_dtor("ee16661", this);} // tgen
ee16661 ::ee16661(){ note_ctor("ee16661", this);} // tgen

static void Test_ee16661()
{
  extern Class_Descriptor cd_ee16661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16661, buf);
    ee16661 *dp, &lv = *(dp=new (buf) ee16661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee16661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee16661");
    check_base_class_offset(lv, (cc661*)(dd6661*), ABISELECT(16,8), "ee16661");
    check_base_class_offset(lv, (dd6661*), ABISELECT(16,8), "ee16661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16661.e");
    test_class_info(&lv, &cd_ee16661);
    dp->~ee16661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16661(Test_ee16661, "ee16661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16661C1Ev();
extern void _ZN7ee16661D1Ev();
Name_Map name_map_ee16661[] = {
  NSPAIR(_ZN7ee16661C1Ev),
  NSPAIR(_ZN7ee16661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee16661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16661[];
extern void _ZN6dd66613fooEv();
extern void _ZN6dd66613barEv();
static  VTBL_ENTRY vtc_ee16661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16661[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16661[0]),
  (VTBL_ENTRY)&_ZN6dd66613fooEv,
  (VTBL_ENTRY)&_ZN6dd66613barEv,
};
extern VTBL_ENTRY _ZTV7ee16661[];
static  VTT_ENTRY vtt_ee16661[] = {
  {&(_ZTV7ee16661[3]),  3,9},
  {&(_ZTV7ee16661[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16661[];
extern  VTBL_ENTRY _ZTV7ee16661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16661[];
Class_Descriptor cd_ee16661 = {  "ee16661", // class name
  bases_ee16661, 4,
  &(vtc_ee16661[0]), // expected_vtbl_contents
  &(vtt_ee16661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16661),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16661),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  ee26661  : dd6661 {
  int e;
  virtual void  foo(); // _ZN7ee266613fooEv
  ~ee26661(); // tgen
  ee26661(); // tgen
};
//SIG(1 ee26661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26661 ::foo(){vfunc_called(this, "_ZN7ee266613fooEv");}
ee26661 ::~ee26661(){ note_dtor("ee26661", this);} // tgen
ee26661 ::ee26661(){ note_ctor("ee26661", this);} // tgen

static void Test_ee26661()
{
  extern Class_Descriptor cd_ee26661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26661, buf);
    ee26661 *dp, &lv = *(dp=new (buf) ee26661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), 0, "ee26661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), 0, "ee26661");
    check_base_class_offset(lv, (cc661*)(dd6661*), 0, "ee26661");
    check_base_class_offset(lv, (dd6661*), 0, "ee26661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26661.e");
    test_class_info(&lv, &cd_ee26661);
    dp->~ee26661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26661(Test_ee26661, "ee26661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26661C1Ev();
extern void _ZN7ee26661D1Ev();
Name_Map name_map_ee26661[] = {
  NSPAIR(_ZN7ee26661C1Ev),
  NSPAIR(_ZN7ee26661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee26661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26661[];
extern void _ZN7ee266613fooEv();
extern void _ZN6dd66613barEv();
static  VTBL_ENTRY vtc_ee26661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26661[0]),
  (VTBL_ENTRY)&_ZN7ee266613fooEv,
  (VTBL_ENTRY)&_ZN6dd66613barEv,
};
extern VTBL_ENTRY _ZTI7ee26661[];
extern  VTBL_ENTRY _ZTV7ee26661[];
Class_Descriptor cd_ee26661 = {  "ee26661", // class name
  bases_ee26661, 4,
  &(vtc_ee26661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26661),4, //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  ee36661  : virtual dd6661 {
  int e;
  virtual void  foo(); // _ZN7ee366613fooEv
  ~ee36661(); // tgen
  ee36661(); // tgen
};
//SIG(1 ee36661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36661 ::foo(){vfunc_called(this, "_ZN7ee366613fooEv");}
ee36661 ::~ee36661(){ note_dtor("ee36661", this);} // tgen
ee36661 ::ee36661(){ note_ctor("ee36661", this);} // tgen

static void Test_ee36661()
{
  extern Class_Descriptor cd_ee36661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36661, buf);
    ee36661 *dp, &lv = *(dp=new (buf) ee36661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee36661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee36661");
    check_base_class_offset(lv, (cc661*)(dd6661*), ABISELECT(16,8), "ee36661");
    check_base_class_offset(lv, (dd6661*), ABISELECT(16,8), "ee36661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36661.e");
    test_class_info(&lv, &cd_ee36661);
    dp->~ee36661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36661(Test_ee36661, "ee36661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36661C1Ev();
extern void _ZN7ee36661D1Ev();
Name_Map name_map_ee36661[] = {
  NSPAIR(_ZN7ee36661C1Ev),
  NSPAIR(_ZN7ee36661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee36661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36661[];
extern void _ZN7ee366613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee366613fooEv,_ZTv0_n12_N7ee366613fooEv)();
extern void ABISELECT(_ZThn16_N7ee366613fooEv,_ZThn8_N7ee366613fooEv)() __attribute__((weak));
extern void _ZN6dd66613barEv();
static  VTBL_ENTRY vtc_ee36661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36661[0]),
  (VTBL_ENTRY)&_ZN7ee366613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee366613fooEv,_ZTv0_n12_N7ee366613fooEv),
  (VTBL_ENTRY)&_ZN6dd66613barEv,
};
extern VTBL_ENTRY _ZTV7ee36661[];
static  VTT_ENTRY vtt_ee36661[] = {
  {&(_ZTV7ee36661[3]),  3,10},
  {&(_ZTV7ee36661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36661[];
extern  VTBL_ENTRY _ZTV7ee36661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36661[];
static VTBL_ENTRY alt_thunk_names846[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee366613fooEv,_ZTv0_n12_N7ee366613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee366613fooEv,_ZThn8_N7ee366613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36661 = {  "ee36661", // class name
  bases_ee36661, 4,
  &(vtc_ee36661[0]), // expected_vtbl_contents
  &(vtt_ee36661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names846,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46661  : dd6661 {
  int e;
  virtual void  bar(); // _ZN7ee466613barEv
  ~ee46661(); // tgen
  ee46661(); // tgen
};
//SIG(1 ee46661) C1{ BC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46661 ::bar(){vfunc_called(this, "_ZN7ee466613barEv");}
ee46661 ::~ee46661(){ note_dtor("ee46661", this);} // tgen
ee46661 ::ee46661(){ note_ctor("ee46661", this);} // tgen

static void Test_ee46661()
{
  extern Class_Descriptor cd_ee46661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46661, buf);
    ee46661 *dp, &lv = *(dp=new (buf) ee46661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), 0, "ee46661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), 0, "ee46661");
    check_base_class_offset(lv, (cc661*)(dd6661*), 0, "ee46661");
    check_base_class_offset(lv, (dd6661*), 0, "ee46661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46661.e");
    test_class_info(&lv, &cd_ee46661);
    dp->~ee46661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46661(Test_ee46661, "ee46661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46661C1Ev();
extern void _ZN7ee46661D1Ev();
Name_Map name_map_ee46661[] = {
  NSPAIR(_ZN7ee46661C1Ev),
  NSPAIR(_ZN7ee46661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee46661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46661[];
extern void _ZN6dd66613fooEv();
extern void _ZN7ee466613barEv();
static  VTBL_ENTRY vtc_ee46661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46661[0]),
  (VTBL_ENTRY)&_ZN6dd66613fooEv,
  (VTBL_ENTRY)&_ZN7ee466613barEv,
};
extern VTBL_ENTRY _ZTI7ee46661[];
extern  VTBL_ENTRY _ZTV7ee46661[];
Class_Descriptor cd_ee46661 = {  "ee46661", // class name
  bases_ee46661, 4,
  &(vtc_ee46661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46661),4, //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  ee56661  : virtual dd6661 {
  int e;
  virtual void  bar(); // _ZN7ee566613barEv
  ~ee56661(); // tgen
  ee56661(); // tgen
};
//SIG(1 ee56661) C1{ VBC2{ BC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56661 ::bar(){vfunc_called(this, "_ZN7ee566613barEv");}
ee56661 ::~ee56661(){ note_dtor("ee56661", this);} // tgen
ee56661 ::ee56661(){ note_ctor("ee56661", this);} // tgen

static void Test_ee56661()
{
  extern Class_Descriptor cd_ee56661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56661, buf);
    ee56661 *dp, &lv = *(dp=new (buf) ee56661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee56661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee56661");
    check_base_class_offset(lv, (cc661*)(dd6661*), ABISELECT(16,8), "ee56661");
    check_base_class_offset(lv, (dd6661*), ABISELECT(16,8), "ee56661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56661.e");
    test_class_info(&lv, &cd_ee56661);
    dp->~ee56661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56661(Test_ee56661, "ee56661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56661C1Ev();
extern void _ZN7ee56661D1Ev();
Name_Map name_map_ee56661[] = {
  NSPAIR(_ZN7ee56661C1Ev),
  NSPAIR(_ZN7ee56661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee56661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56661[];
extern void _ZN7ee566613barEv();
extern void _ZN6dd66613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee566613barEv,_ZTv0_n16_N7ee566613barEv)();
extern void ABISELECT(_ZThn16_N7ee566613barEv,_ZThn8_N7ee566613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56661[0]),
  (VTBL_ENTRY)&_ZN7ee566613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56661[0]),
  (VTBL_ENTRY)&_ZN6dd66613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee566613barEv,_ZTv0_n16_N7ee566613barEv),
};
extern VTBL_ENTRY _ZTV7ee56661[];
static  VTT_ENTRY vtt_ee56661[] = {
  {&(_ZTV7ee56661[3]),  3,10},
  {&(_ZTV7ee56661[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56661[];
extern  VTBL_ENTRY _ZTV7ee56661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56661[];
static VTBL_ENTRY alt_thunk_names847[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee566613barEv,_ZTv0_n16_N7ee566613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee566613barEv,_ZThn8_N7ee566613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56661 = {  "ee56661", // class name
  bases_ee56661, 4,
  &(vtc_ee56661[0]), // expected_vtbl_contents
  &(vtt_ee56661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56661),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names847,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66661  : dd6661 {
  int e;
  virtual void  foo(); // _ZN7ee666613fooEv
  virtual void  bar(); // _ZN7ee666613barEv
  ~ee66661(); // tgen
  ee66661(); // tgen
};
//SIG(1 ee66661) C1{ BC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66661 ::foo(){vfunc_called(this, "_ZN7ee666613fooEv");}
void  ee66661 ::bar(){vfunc_called(this, "_ZN7ee666613barEv");}
ee66661 ::~ee66661(){ note_dtor("ee66661", this);} // tgen
ee66661 ::ee66661(){ note_ctor("ee66661", this);} // tgen

static void Test_ee66661()
{
  extern Class_Descriptor cd_ee66661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66661, buf);
    ee66661 *dp, &lv = *(dp=new (buf) ee66661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), 0, "ee66661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), 0, "ee66661");
    check_base_class_offset(lv, (cc661*)(dd6661*), 0, "ee66661");
    check_base_class_offset(lv, (dd6661*), 0, "ee66661");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66661.e");
    test_class_info(&lv, &cd_ee66661);
    dp->~ee66661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66661(Test_ee66661, "ee66661", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66661C1Ev();
extern void _ZN7ee66661D1Ev();
Name_Map name_map_ee66661[] = {
  NSPAIR(_ZN7ee66661C1Ev),
  NSPAIR(_ZN7ee66661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee66661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66661[];
extern void _ZN7ee666613fooEv();
extern void _ZN7ee666613barEv();
static  VTBL_ENTRY vtc_ee66661[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66661[0]),
  (VTBL_ENTRY)&_ZN7ee666613fooEv,
  (VTBL_ENTRY)&_ZN7ee666613barEv,
};
extern VTBL_ENTRY _ZTI7ee66661[];
extern  VTBL_ENTRY _ZTV7ee66661[];
Class_Descriptor cd_ee66661 = {  "ee66661", // class name
  bases_ee66661, 4,
  &(vtc_ee66661[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66661),4, //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  ee76661  : virtual dd6661 {
  int e;
  virtual void  foo(); // _ZN7ee766613fooEv
  virtual void  bar(); // _ZN7ee766613barEv
  ~ee76661(); // tgen
  ee76661(); // tgen
};
//SIG(1 ee76661) C1{ VBC2{ BC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76661 ::foo(){vfunc_called(this, "_ZN7ee766613fooEv");}
void  ee76661 ::bar(){vfunc_called(this, "_ZN7ee766613barEv");}
ee76661 ::~ee76661(){ note_dtor("ee76661", this);} // tgen
ee76661 ::ee76661(){ note_ctor("ee76661", this);} // tgen

static void Test_ee76661()
{
  extern Class_Descriptor cd_ee76661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76661, buf);
    ee76661 *dp, &lv = *(dp=new (buf) ee76661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee76661");
    check_base_class_offset(lv, (bb61*)(cc661*)(dd6661*), ABISELECT(16,8), "ee76661");
    check_base_class_offset(lv, (cc661*)(dd6661*), ABISELECT(16,8), "ee76661");
    check_base_class_offset(lv, (dd6661*), ABISELECT(16,8), "ee76661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76661.e");
    test_class_info(&lv, &cd_ee76661);
    dp->~ee76661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76661(Test_ee76661, "ee76661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76661C1Ev();
extern void _ZN7ee76661D1Ev();
Name_Map name_map_ee76661[] = {
  NSPAIR(_ZN7ee76661C1Ev),
  NSPAIR(_ZN7ee76661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd6661;
extern VTBL_ENTRY _ZTI6dd6661[];
extern  VTBL_ENTRY _ZTV6dd6661[];
static Base_Class bases_ee76661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6661,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76661[];
extern void _ZN7ee766613fooEv();
extern void _ZN7ee766613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee766613fooEv,_ZTv0_n12_N7ee766613fooEv)();
extern void ABISELECT(_ZThn16_N7ee766613fooEv,_ZThn8_N7ee766613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee766613barEv,_ZTv0_n16_N7ee766613barEv)();
extern void ABISELECT(_ZThn16_N7ee766613barEv,_ZThn8_N7ee766613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76661[0]),
  (VTBL_ENTRY)&_ZN7ee766613fooEv,
  (VTBL_ENTRY)&_ZN7ee766613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee766613fooEv,_ZTv0_n12_N7ee766613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee766613barEv,_ZTv0_n16_N7ee766613barEv),
};
extern VTBL_ENTRY _ZTV7ee76661[];
static  VTT_ENTRY vtt_ee76661[] = {
  {&(_ZTV7ee76661[3]),  3,11},
  {&(_ZTV7ee76661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76661[];
extern  VTBL_ENTRY _ZTV7ee76661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76661[];
static VTBL_ENTRY alt_thunk_names848[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee766613barEv,_ZTv0_n16_N7ee766613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee766613barEv,_ZThn8_N7ee766613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee766613fooEv,_ZTv0_n12_N7ee766613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee766613fooEv,_ZThn8_N7ee766613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76661 = {  "ee76661", // class name
  bases_ee76661, 4,
  &(vtc_ee76661[0]), // expected_vtbl_contents
  &(vtt_ee76661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76661),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names848,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7661  : virtual cc661 {
  int d;
  virtual void  bar(); // _ZN6dd76613barEv
  virtual void  foo(); // _ZN6dd76613fooEv
  ~dd7661(); // tgen
  dd7661(); // tgen
};
//SIG(-1 dd7661) C1{ VBC2{ BC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd7661 ::bar(){vfunc_called(this, "_ZN6dd76613barEv");}
void  dd7661 ::foo(){vfunc_called(this, "_ZN6dd76613fooEv");}
dd7661 ::~dd7661(){ note_dtor("dd7661", this);} // tgen
dd7661 ::dd7661(){ note_ctor("dd7661", this);} // tgen

static void Test_dd7661()
{
  extern Class_Descriptor cd_dd7661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7661, buf);
    dd7661 *dp, &lv = *(dp=new (buf) dd7661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,8), "dd7661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,8), "dd7661");
    check_base_class_offset(lv, (cc661*), ABISELECT(16,8), "dd7661");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7661.d");
    test_class_info(&lv, &cd_dd7661);
    dp->~dd7661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7661(Test_dd7661, "dd7661", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7661C1Ev();
extern void _ZN6dd7661D1Ev();
Name_Map name_map_dd7661[] = {
  NSPAIR(_ZN6dd7661C1Ev),
  NSPAIR(_ZN6dd7661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
static Base_Class bases_dd7661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
extern VTBL_ENTRY _ZTV6dd7661[];
static  VTT_ENTRY vtt_dd7661[] = {
  {&(_ZTV6dd7661[3]),  3,11},
  {&(_ZTV6dd7661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static VTBL_ENTRY alt_thunk_names849[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7661 = {  "dd7661", // class name
  bases_dd7661, 3,
  &(vtc_dd7661[0]), // expected_vtbl_contents
  &(vtt_dd7661[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7661),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names849,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07661  : dd7661 {
  int e;
  ~ee07661(); // tgen
  ee07661(); // tgen
};
//SIG(1 ee07661) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee07661 ::~ee07661(){ note_dtor("ee07661", this);} // tgen
ee07661 ::ee07661(){ note_ctor("ee07661", this);} // tgen

static void Test_ee07661()
{
  extern Class_Descriptor cd_ee07661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07661, buf);
    ee07661 *dp, &lv = *(dp=new (buf) ee07661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee07661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee07661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(16,12), "ee07661");
    check_base_class_offset(lv, (dd7661*), 0, "ee07661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07661.e");
    test_class_info(&lv, &cd_ee07661);
    dp->~ee07661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07661(Test_ee07661, "ee07661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07661C1Ev();
extern void _ZN7ee07661D1Ev();
Name_Map name_map_ee07661[] = {
  NSPAIR(_ZN7ee07661C1Ev),
  NSPAIR(_ZN7ee07661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee07661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
extern VTBL_ENTRY _ZTV7ee07661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee07661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee07661[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee07661[] = {
  {&(_ZTV7ee07661[3]),  3,11},
  {&(_tg__ZTV6dd7661__7ee07661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee07661[4]),  4,6},
  {&(_ZTV7ee07661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07661[];
extern  VTBL_ENTRY _ZTV7ee07661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07661[];
static VTBL_ENTRY alt_thunk_names850[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07661 = {  "ee07661", // class name
  bases_ee07661, 4,
  &(vtc_ee07661[0]), // expected_vtbl_contents
  &(vtt_ee07661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names850,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17661  : virtual dd7661 {
  int e;
  ~ee17661(); // tgen
  ee17661(); // tgen
};
//SIG(1 ee17661) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee17661 ::~ee17661(){ note_dtor("ee17661", this);} // tgen
ee17661 ::ee17661(){ note_ctor("ee17661", this);} // tgen

static void Test_ee17661()
{
  extern Class_Descriptor cd_ee17661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17661, buf);
    ee17661 *dp, &lv = *(dp=new (buf) ee17661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee17661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee17661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(32,16), "ee17661");
    check_base_class_offset(lv, (dd7661*), ABISELECT(16,8), "ee17661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17661.e");
    test_class_info(&lv, &cd_ee17661);
    dp->~ee17661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17661(Test_ee17661, "ee17661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17661C1Ev();
extern void _ZN7ee17661D1Ev();
Name_Map name_map_ee17661[] = {
  NSPAIR(_ZN7ee17661C1Ev),
  NSPAIR(_ZN7ee17661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee17661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17661[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
extern VTBL_ENTRY _ZTV7ee17661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee17661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee17661[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee17661[] = {
  {&(_ZTV7ee17661[4]),  4,17},
  {&(_ZTV7ee17661[9]),  9,17},
  {&(_ZTV7ee17661[15]),  15,17},
  {&(_tg__ZTV6dd7661__7ee17661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee17661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17661[];
extern  VTBL_ENTRY _ZTV7ee17661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17661[];
static VTBL_ENTRY alt_thunk_names851[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17661 = {  "ee17661", // class name
  bases_ee17661, 4,
  &(vtc_ee17661[0]), // expected_vtbl_contents
  &(vtt_ee17661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17661),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names851,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27661  : dd7661 {
  int e;
  virtual void  foo(); // _ZN7ee276613fooEv
  ~ee27661(); // tgen
  ee27661(); // tgen
};
//SIG(1 ee27661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27661 ::foo(){vfunc_called(this, "_ZN7ee276613fooEv");}
ee27661 ::~ee27661(){ note_dtor("ee27661", this);} // tgen
ee27661 ::ee27661(){ note_ctor("ee27661", this);} // tgen

static void Test_ee27661()
{
  extern Class_Descriptor cd_ee27661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27661, buf);
    ee27661 *dp, &lv = *(dp=new (buf) ee27661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee27661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee27661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(16,12), "ee27661");
    check_base_class_offset(lv, (dd7661*), 0, "ee27661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27661.e");
    test_class_info(&lv, &cd_ee27661);
    dp->~ee27661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27661(Test_ee27661, "ee27661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27661C1Ev();
extern void _ZN7ee27661D1Ev();
Name_Map name_map_ee27661[] = {
  NSPAIR(_ZN7ee27661C1Ev),
  NSPAIR(_ZN7ee27661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee27661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27661[];
extern void _ZN6dd76613barEv();
extern void _ZN7ee276613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee276613fooEv,_ZTv0_n12_N7ee276613fooEv)();
extern void ABISELECT(_ZThn16_N7ee276613fooEv,_ZThn12_N7ee276613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN7ee276613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee276613fooEv,_ZTv0_n12_N7ee276613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
extern VTBL_ENTRY _ZTV7ee27661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee27661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee27661[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee27661[] = {
  {&(_ZTV7ee27661[3]),  3,11},
  {&(_tg__ZTV6dd7661__7ee27661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee27661[4]),  4,6},
  {&(_ZTV7ee27661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27661[];
extern  VTBL_ENTRY _ZTV7ee27661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27661[];
static VTBL_ENTRY alt_thunk_names852[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee276613fooEv,_ZTv0_n12_N7ee276613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee276613fooEv,_ZThn12_N7ee276613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27661 = {  "ee27661", // class name
  bases_ee27661, 4,
  &(vtc_ee27661[0]), // expected_vtbl_contents
  &(vtt_ee27661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names852,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37661  : virtual dd7661 {
  int e;
  virtual void  foo(); // _ZN7ee376613fooEv
  ~ee37661(); // tgen
  ee37661(); // tgen
};
//SIG(1 ee37661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37661 ::foo(){vfunc_called(this, "_ZN7ee376613fooEv");}
ee37661 ::~ee37661(){ note_dtor("ee37661", this);} // tgen
ee37661 ::ee37661(){ note_ctor("ee37661", this);} // tgen

static void Test_ee37661()
{
  extern Class_Descriptor cd_ee37661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37661, buf);
    ee37661 *dp, &lv = *(dp=new (buf) ee37661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee37661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee37661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(32,16), "ee37661");
    check_base_class_offset(lv, (dd7661*), ABISELECT(16,8), "ee37661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37661.e");
    test_class_info(&lv, &cd_ee37661);
    dp->~ee37661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37661(Test_ee37661, "ee37661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37661C1Ev();
extern void _ZN7ee37661D1Ev();
Name_Map name_map_ee37661[] = {
  NSPAIR(_ZN7ee37661C1Ev),
  NSPAIR(_ZN7ee37661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee37661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37661[];
extern void _ZN7ee376613fooEv();
extern void _ZN6dd76613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee376613fooEv,_ZTv0_n20_N7ee376613fooEv)();
extern void ABISELECT(_ZThn16_N7ee376613fooEv,_ZThn8_N7ee376613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee376613fooEv,_ZTv0_n12_N7ee376613fooEv)();
extern void ABISELECT(_ZThn32_N7ee376613fooEv,_ZThn16_N7ee376613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37661[0]),
  (VTBL_ENTRY)&_ZN7ee376613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee376613fooEv,_ZTv0_n20_N7ee376613fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee376613fooEv,_ZTv0_n12_N7ee376613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
extern VTBL_ENTRY _ZTV7ee37661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee37661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee37661[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee37661[] = {
  {&(_ZTV7ee37661[4]),  4,18},
  {&(_ZTV7ee37661[10]),  10,18},
  {&(_ZTV7ee37661[16]),  16,18},
  {&(_tg__ZTV6dd7661__7ee37661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee37661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37661[];
extern  VTBL_ENTRY _ZTV7ee37661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37661[];
static VTBL_ENTRY alt_thunk_names853[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee376613fooEv,_ZTv0_n12_N7ee376613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee376613fooEv,_ZThn16_N7ee376613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee376613fooEv,_ZTv0_n20_N7ee376613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee376613fooEv,_ZThn8_N7ee376613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37661 = {  "ee37661", // class name
  bases_ee37661, 4,
  &(vtc_ee37661[0]), // expected_vtbl_contents
  &(vtt_ee37661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37661),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names853,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47661  : dd7661 {
  int e;
  virtual void  bar(); // _ZN7ee476613barEv
  ~ee47661(); // tgen
  ee47661(); // tgen
};
//SIG(1 ee47661) C1{ BC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47661 ::bar(){vfunc_called(this, "_ZN7ee476613barEv");}
ee47661 ::~ee47661(){ note_dtor("ee47661", this);} // tgen
ee47661 ::ee47661(){ note_ctor("ee47661", this);} // tgen

static void Test_ee47661()
{
  extern Class_Descriptor cd_ee47661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47661, buf);
    ee47661 *dp, &lv = *(dp=new (buf) ee47661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee47661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee47661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(16,12), "ee47661");
    check_base_class_offset(lv, (dd7661*), 0, "ee47661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47661.e");
    test_class_info(&lv, &cd_ee47661);
    dp->~ee47661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47661(Test_ee47661, "ee47661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47661C1Ev();
extern void _ZN7ee47661D1Ev();
Name_Map name_map_ee47661[] = {
  NSPAIR(_ZN7ee47661C1Ev),
  NSPAIR(_ZN7ee47661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee47661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47661[];
extern void _ZN7ee476613barEv();
extern void _ZN6dd76613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee476613barEv,_ZTv0_n16_N7ee476613barEv)();
extern void ABISELECT(_ZThn16_N7ee476613barEv,_ZThn12_N7ee476613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47661[0]),
  (VTBL_ENTRY)&_ZN7ee476613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee476613barEv,_ZTv0_n16_N7ee476613barEv),
};
extern VTBL_ENTRY _ZTV7ee47661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee47661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee47661[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee47661[] = {
  {&(_ZTV7ee47661[3]),  3,11},
  {&(_tg__ZTV6dd7661__7ee47661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee47661[4]),  4,6},
  {&(_ZTV7ee47661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47661[];
extern  VTBL_ENTRY _ZTV7ee47661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47661[];
static VTBL_ENTRY alt_thunk_names854[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee476613barEv,_ZTv0_n16_N7ee476613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee476613barEv,_ZThn12_N7ee476613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47661 = {  "ee47661", // class name
  bases_ee47661, 4,
  &(vtc_ee47661[0]), // expected_vtbl_contents
  &(vtt_ee47661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names854,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57661  : virtual dd7661 {
  int e;
  virtual void  bar(); // _ZN7ee576613barEv
  ~ee57661(); // tgen
  ee57661(); // tgen
};
//SIG(1 ee57661) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57661 ::bar(){vfunc_called(this, "_ZN7ee576613barEv");}
ee57661 ::~ee57661(){ note_dtor("ee57661", this);} // tgen
ee57661 ::ee57661(){ note_ctor("ee57661", this);} // tgen

static void Test_ee57661()
{
  extern Class_Descriptor cd_ee57661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57661, buf);
    ee57661 *dp, &lv = *(dp=new (buf) ee57661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee57661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee57661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(32,16), "ee57661");
    check_base_class_offset(lv, (dd7661*), ABISELECT(16,8), "ee57661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57661.e");
    test_class_info(&lv, &cd_ee57661);
    dp->~ee57661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57661(Test_ee57661, "ee57661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57661C1Ev();
extern void _ZN7ee57661D1Ev();
Name_Map name_map_ee57661[] = {
  NSPAIR(_ZN7ee57661C1Ev),
  NSPAIR(_ZN7ee57661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee57661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57661[];
extern void _ZN7ee576613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee576613barEv,_ZTv0_n16_N7ee576613barEv)();
extern void ABISELECT(_ZThn16_N7ee576613barEv,_ZThn8_N7ee576613barEv)() __attribute__((weak));
extern void _ZN6dd76613fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee576613barEv,_ZTv0_n16_N7ee576613barEv)();
extern void ABISELECT(_ZThn32_N7ee576613barEv,_ZThn16_N7ee576613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57661[0]),
  (VTBL_ENTRY)&_ZN7ee576613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee576613barEv,_ZTv0_n16_N7ee576613barEv),
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee576613barEv,_ZTv0_n16_N7ee576613barEv),
};
extern VTBL_ENTRY _ZTV7ee57661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee57661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee57661[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee57661[] = {
  {&(_ZTV7ee57661[4]),  4,18},
  {&(_ZTV7ee57661[10]),  10,18},
  {&(_ZTV7ee57661[16]),  16,18},
  {&(_tg__ZTV6dd7661__7ee57661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee57661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57661[];
extern  VTBL_ENTRY _ZTV7ee57661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57661[];
static VTBL_ENTRY alt_thunk_names855[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee576613barEv,_ZTv0_n16_N7ee576613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee576613barEv,_ZThn16_N7ee576613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee576613barEv,_ZThn8_N7ee576613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57661 = {  "ee57661", // class name
  bases_ee57661, 4,
  &(vtc_ee57661[0]), // expected_vtbl_contents
  &(vtt_ee57661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57661),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names855,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67661  : dd7661 {
  int e;
  virtual void  foo(); // _ZN7ee676613fooEv
  virtual void  bar(); // _ZN7ee676613barEv
  ~ee67661(); // tgen
  ee67661(); // tgen
};
//SIG(1 ee67661) C1{ BC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67661 ::foo(){vfunc_called(this, "_ZN7ee676613fooEv");}
void  ee67661 ::bar(){vfunc_called(this, "_ZN7ee676613barEv");}
ee67661 ::~ee67661(){ note_dtor("ee67661", this);} // tgen
ee67661 ::ee67661(){ note_ctor("ee67661", this);} // tgen

static void Test_ee67661()
{
  extern Class_Descriptor cd_ee67661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67661, buf);
    ee67661 *dp, &lv = *(dp=new (buf) ee67661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(16,12), "ee67661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(16,12), "ee67661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(16,12), "ee67661");
    check_base_class_offset(lv, (dd7661*), 0, "ee67661");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67661.e");
    test_class_info(&lv, &cd_ee67661);
    dp->~ee67661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67661(Test_ee67661, "ee67661", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67661C1Ev();
extern void _ZN7ee67661D1Ev();
Name_Map name_map_ee67661[] = {
  NSPAIR(_ZN7ee67661C1Ev),
  NSPAIR(_ZN7ee67661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee67661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc661,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67661[];
extern void _ZN7ee676613barEv();
extern void _ZN7ee676613fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee676613fooEv,_ZTv0_n12_N7ee676613fooEv)();
extern void ABISELECT(_ZThn16_N7ee676613fooEv,_ZThn12_N7ee676613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee676613barEv,_ZTv0_n16_N7ee676613barEv)();
extern void ABISELECT(_ZThn16_N7ee676613barEv,_ZThn12_N7ee676613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67661[0]),
  (VTBL_ENTRY)&_ZN7ee676613barEv,
  (VTBL_ENTRY)&_ZN7ee676613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee676613fooEv,_ZTv0_n12_N7ee676613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee676613barEv,_ZTv0_n16_N7ee676613barEv),
};
extern VTBL_ENTRY _ZTV7ee67661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee67661[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee67661[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee67661[] = {
  {&(_ZTV7ee67661[3]),  3,11},
  {&(_tg__ZTV6dd7661__7ee67661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee67661[4]),  4,6},
  {&(_ZTV7ee67661[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67661[];
extern  VTBL_ENTRY _ZTV7ee67661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67661[];
static VTBL_ENTRY alt_thunk_names856[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn12_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn12_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee676613barEv,_ZTv0_n16_N7ee676613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee676613barEv,_ZThn12_N7ee676613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee676613fooEv,_ZTv0_n12_N7ee676613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee676613fooEv,_ZThn12_N7ee676613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67661 = {  "ee67661", // class name
  bases_ee67661, 4,
  &(vtc_ee67661[0]), // expected_vtbl_contents
  &(vtt_ee67661[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67661),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67661),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67661),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names856,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77661  : virtual dd7661 {
  int e;
  virtual void  foo(); // _ZN7ee776613fooEv
  virtual void  bar(); // _ZN7ee776613barEv
  ~ee77661(); // tgen
  ee77661(); // tgen
};
//SIG(1 ee77661) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77661 ::foo(){vfunc_called(this, "_ZN7ee776613fooEv");}
void  ee77661 ::bar(){vfunc_called(this, "_ZN7ee776613barEv");}
ee77661 ::~ee77661(){ note_dtor("ee77661", this);} // tgen
ee77661 ::ee77661(){ note_ctor("ee77661", this);} // tgen

static void Test_ee77661()
{
  extern Class_Descriptor cd_ee77661;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77661, buf);
    ee77661 *dp, &lv = *(dp=new (buf) ee77661());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77661)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77661)");
    check_base_class_offset(lv, (aa1*)(bb61*)(cc661*), ABISELECT(32,16), "ee77661");
    check_base_class_offset(lv, (bb61*)(cc661*), ABISELECT(32,16), "ee77661");
    check_base_class_offset(lv, (cc661*)(dd7661*), ABISELECT(32,16), "ee77661");
    check_base_class_offset(lv, (dd7661*), ABISELECT(16,8), "ee77661");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77661.e");
    test_class_info(&lv, &cd_ee77661);
    dp->~ee77661();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77661(Test_ee77661, "ee77661", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77661C1Ev();
extern void _ZN7ee77661D1Ev();
Name_Map name_map_ee77661[] = {
  NSPAIR(_ZN7ee77661C1Ev),
  NSPAIR(_ZN7ee77661D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc661;
extern VTBL_ENTRY _ZTI5cc661[];
extern  VTBL_ENTRY _ZTV5cc661[];
extern Class_Descriptor cd_dd7661;
extern VTBL_ENTRY _ZTI6dd7661[];
extern  VTBL_ENTRY _ZTV6dd7661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7661[];
static Base_Class bases_ee77661[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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_cc661,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7661,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77661[];
extern void _ZN7ee776613fooEv();
extern void _ZN7ee776613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee776613barEv,_ZTv0_n16_N7ee776613barEv)();
extern void ABISELECT(_ZThn16_N7ee776613barEv,_ZThn8_N7ee776613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee776613fooEv,_ZTv0_n20_N7ee776613fooEv)();
extern void ABISELECT(_ZThn16_N7ee776613fooEv,_ZThn8_N7ee776613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee776613fooEv,_ZTv0_n12_N7ee776613fooEv)();
extern void ABISELECT(_ZThn32_N7ee776613fooEv,_ZThn16_N7ee776613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee776613barEv,_ZTv0_n16_N7ee776613barEv)();
extern void ABISELECT(_ZThn32_N7ee776613barEv,_ZThn16_N7ee776613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77661[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77661[0]),
  (VTBL_ENTRY)&_ZN7ee776613fooEv,
  (VTBL_ENTRY)&_ZN7ee776613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee776613barEv,_ZTv0_n16_N7ee776613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee776613fooEv,_ZTv0_n20_N7ee776613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee776613fooEv,_ZTv0_n12_N7ee776613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee776613barEv,_ZTv0_n16_N7ee776613barEv),
};
extern VTBL_ENTRY _ZTV7ee77661[];
extern void _ZN6dd76613barEv();
extern void _ZN6dd76613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7661__7ee77661[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&_ZN6dd76613barEv,
  (VTBL_ENTRY)&_ZN6dd76613fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv)();
extern void ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv)();
extern void ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc661__6dd7661__7ee77661[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7661[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv),
};
static  VTT_ENTRY vtt_ee77661[] = {
  {&(_ZTV7ee77661[4]),  4,19},
  {&(_ZTV7ee77661[11]),  11,19},
  {&(_ZTV7ee77661[17]),  17,19},
  {&(_tg__ZTV6dd7661__7ee77661[3]),  3,5},
  {&(_tg__ZTV5cc661__6dd7661__7ee77661[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77661[];
extern  VTBL_ENTRY _ZTV7ee77661[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77661[];
static VTBL_ENTRY alt_thunk_names857[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76613barEv,_ZTv0_n16_N6dd76613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613barEv,_ZThn8_N6dd76613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76613fooEv,_ZTv0_n12_N6dd76613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76613fooEv,_ZThn8_N6dd76613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee776613fooEv,_ZTv0_n12_N7ee776613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee776613fooEv,_ZThn16_N7ee776613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee776613fooEv,_ZTv0_n20_N7ee776613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee776613fooEv,_ZThn8_N7ee776613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee776613barEv,_ZTv0_n16_N7ee776613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee776613barEv,_ZThn16_N7ee776613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee776613barEv,_ZThn8_N7ee776613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77661 = {  "ee77661", // class name
  bases_ee77661, 4,
  &(vtc_ee77661[0]), // expected_vtbl_contents
  &(vtt_ee77661[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77661),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77661),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77661),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names857,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc761  : virtual bb61 {
  int c;
  virtual void  foo(); // _ZN5cc7613fooEv
  virtual void  bar(); // _ZN5cc7613barEv
  ~cc761(); // tgen
  cc761(); // tgen
};
//SIG(-1 cc761) C1{ VBC2{ BC3{ v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  cc761 ::foo(){vfunc_called(this, "_ZN5cc7613fooEv");}
void  cc761 ::bar(){vfunc_called(this, "_ZN5cc7613barEv");}
cc761 ::~cc761(){ note_dtor("cc761", this);} // tgen
cc761 ::cc761(){ note_ctor("cc761", this);} // tgen

static void Test_cc761()
{
  extern Class_Descriptor cd_cc761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc761, buf);
    cc761 *dp, &lv = *(dp=new (buf) cc761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,8), "cc761");
    check_base_class_offset(lv, (bb61*), ABISELECT(16,8), "cc761");
    check_field_offset(lv, c, ABISELECT(8,4), "cc761.c");
    test_class_info(&lv, &cd_cc761);
    dp->~cc761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc761(Test_cc761, "cc761", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc761C1Ev();
extern void _ZN5cc761D1Ev();
Name_Map name_map_cc761[] = {
  NSPAIR(_ZN5cc761C1Ev),
  NSPAIR(_ZN5cc761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
static Base_Class bases_cc761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5cc761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_cc761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV5cc761[];
static  VTT_ENTRY vtt_cc761[] = {
  {&(_ZTV5cc761[3]),  3,11},
  {&(_ZTV5cc761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static VTBL_ENTRY alt_thunk_names858[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc761 = {  "cc761", // class name
  bases_cc761, 2,
  &(vtc_cc761[0]), // expected_vtbl_contents
  &(vtt_cc761[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc761),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names858,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0761  : cc761 {
  int d;
  ~dd0761(); // tgen
  dd0761(); // tgen
};
//SIG(-1 dd0761) C1{ BC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd0761 ::~dd0761(){ note_dtor("dd0761", this);} // tgen
dd0761 ::dd0761(){ note_ctor("dd0761", this);} // tgen

static void Test_dd0761()
{
  extern Class_Descriptor cd_dd0761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0761, buf);
    dd0761 *dp, &lv = *(dp=new (buf) dd0761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd0761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(16,12), "dd0761");
    check_base_class_offset(lv, (cc761*), 0, "dd0761");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0761.d");
    test_class_info(&lv, &cd_dd0761);
    dp->~dd0761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0761(Test_dd0761, "dd0761", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0761C1Ev();
extern void _ZN6dd0761D1Ev();
Name_Map name_map_dd0761[] = {
  NSPAIR(_ZN6dd0761C1Ev),
  NSPAIR(_ZN6dd0761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd0761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd0761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV6dd0761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd0761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd0761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd0761[] = {
  {&(_ZTV6dd0761[3]),  3,11},
  {&(_tg__ZTV5cc761__6dd0761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd0761[4]),  4,6},
  {&(_ZTV6dd0761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static VTBL_ENTRY alt_thunk_names859[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0761 = {  "dd0761", // class name
  bases_dd0761, 3,
  &(vtc_dd0761[0]), // expected_vtbl_contents
  &(vtt_dd0761[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0761),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names859,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00761  : dd0761 {
  int e;
  ~ee00761(); // tgen
  ee00761(); // tgen
};
//SIG(1 ee00761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee00761 ::~ee00761(){ note_dtor("ee00761", this);} // tgen
ee00761 ::ee00761(){ note_ctor("ee00761", this);} // tgen

static void Test_ee00761()
{
  extern Class_Descriptor cd_ee00761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00761, buf);
    ee00761 *dp, &lv = *(dp=new (buf) ee00761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee00761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(24,16), "ee00761");
    check_base_class_offset(lv, (cc761*)(dd0761*), 0, "ee00761");
    check_base_class_offset(lv, (dd0761*), 0, "ee00761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00761.e");
    test_class_info(&lv, &cd_ee00761);
    dp->~ee00761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00761(Test_ee00761, "ee00761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00761C1Ev();
extern void _ZN7ee00761D1Ev();
Name_Map name_map_ee00761[] = {
  NSPAIR(_ZN7ee00761C1Ev),
  NSPAIR(_ZN7ee00761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee00761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee00761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee00761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee00761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee00761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee00761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee00761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee00761[] = {
  {&(_ZTV7ee00761[3]),  3,11},
  {&(_tg__ZTV6dd0761__7ee00761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee00761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee00761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee00761[4]),  4,6},
  {&(_ZTV7ee00761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee00761[];
extern  VTBL_ENTRY _ZTV7ee00761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00761[];
static VTBL_ENTRY alt_thunk_names860[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00761 = {  "ee00761", // class name
  bases_ee00761, 4,
  &(vtc_ee00761[0]), // expected_vtbl_contents
  &(vtt_ee00761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names860,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10761  : virtual dd0761 {
  int e;
  ~ee10761(); // tgen
  ee10761(); // tgen
};
//SIG(1 ee10761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee10761 ::~ee10761(){ note_dtor("ee10761", this);} // tgen
ee10761 ::ee10761(){ note_ctor("ee10761", this);} // tgen

static void Test_ee10761()
{
  extern Class_Descriptor cd_ee10761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10761, buf);
    ee10761 *dp, &lv = *(dp=new (buf) ee10761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee10761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(32,20), "ee10761");
    check_base_class_offset(lv, (cc761*)(dd0761*), ABISELECT(16,8), "ee10761");
    check_base_class_offset(lv, (dd0761*), ABISELECT(16,8), "ee10761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10761.e");
    test_class_info(&lv, &cd_ee10761);
    dp->~ee10761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10761(Test_ee10761, "ee10761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10761C1Ev();
extern void _ZN7ee10761D1Ev();
Name_Map name_map_ee10761[] = {
  NSPAIR(_ZN7ee10761C1Ev),
  NSPAIR(_ZN7ee10761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee10761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee10761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10761[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee10761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee10761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee10761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee10761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee10761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee10761[] = {
  {&(_ZTV7ee10761[4]),  4,17},
  {&(_ZTV7ee10761[9]),  9,17},
  {&(_ZTV7ee10761[15]),  15,17},
  {&(_tg__ZTV6dd0761__7ee10761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee10761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee10761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee10761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10761[];
extern  VTBL_ENTRY _ZTV7ee10761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10761[];
static VTBL_ENTRY alt_thunk_names861[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10761 = {  "ee10761", // class name
  bases_ee10761, 4,
  &(vtc_ee10761[0]), // expected_vtbl_contents
  &(vtt_ee10761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10761),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names861,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20761  : dd0761 {
  int e;
  virtual void  foo(); // _ZN7ee207613fooEv
  ~ee20761(); // tgen
  ee20761(); // tgen
};
//SIG(1 ee20761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee20761 ::foo(){vfunc_called(this, "_ZN7ee207613fooEv");}
ee20761 ::~ee20761(){ note_dtor("ee20761", this);} // tgen
ee20761 ::ee20761(){ note_ctor("ee20761", this);} // tgen

static void Test_ee20761()
{
  extern Class_Descriptor cd_ee20761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20761, buf);
    ee20761 *dp, &lv = *(dp=new (buf) ee20761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee20761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(24,16), "ee20761");
    check_base_class_offset(lv, (cc761*)(dd0761*), 0, "ee20761");
    check_base_class_offset(lv, (dd0761*), 0, "ee20761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20761.e");
    test_class_info(&lv, &cd_ee20761);
    dp->~ee20761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20761(Test_ee20761, "ee20761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20761C1Ev();
extern void _ZN7ee20761D1Ev();
Name_Map name_map_ee20761[] = {
  NSPAIR(_ZN7ee20761C1Ev),
  NSPAIR(_ZN7ee20761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee20761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20761[];
extern void _ZN7ee207613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee207613fooEv,_ZTv0_n12_N7ee207613fooEv)();
extern void ABISELECT(_ZThn24_N7ee207613fooEv,_ZThn16_N7ee207613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20761[0]),
  (VTBL_ENTRY)&_ZN7ee207613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee207613fooEv,_ZTv0_n12_N7ee207613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee20761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee20761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee20761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee20761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee20761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee20761[] = {
  {&(_ZTV7ee20761[3]),  3,11},
  {&(_tg__ZTV6dd0761__7ee20761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee20761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee20761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee20761[4]),  4,6},
  {&(_ZTV7ee20761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee20761[];
extern  VTBL_ENTRY _ZTV7ee20761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20761[];
static VTBL_ENTRY alt_thunk_names862[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee207613fooEv,_ZTv0_n12_N7ee207613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee207613fooEv,_ZThn16_N7ee207613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20761 = {  "ee20761", // class name
  bases_ee20761, 4,
  &(vtc_ee20761[0]), // expected_vtbl_contents
  &(vtt_ee20761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names862,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30761  : virtual dd0761 {
  int e;
  virtual void  foo(); // _ZN7ee307613fooEv
  ~ee30761(); // tgen
  ee30761(); // tgen
};
//SIG(1 ee30761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee30761 ::foo(){vfunc_called(this, "_ZN7ee307613fooEv");}
ee30761 ::~ee30761(){ note_dtor("ee30761", this);} // tgen
ee30761 ::ee30761(){ note_ctor("ee30761", this);} // tgen

static void Test_ee30761()
{
  extern Class_Descriptor cd_ee30761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30761, buf);
    ee30761 *dp, &lv = *(dp=new (buf) ee30761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee30761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(32,20), "ee30761");
    check_base_class_offset(lv, (cc761*)(dd0761*), ABISELECT(16,8), "ee30761");
    check_base_class_offset(lv, (dd0761*), ABISELECT(16,8), "ee30761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30761.e");
    test_class_info(&lv, &cd_ee30761);
    dp->~ee30761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30761(Test_ee30761, "ee30761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30761C1Ev();
extern void _ZN7ee30761D1Ev();
Name_Map name_map_ee30761[] = {
  NSPAIR(_ZN7ee30761C1Ev),
  NSPAIR(_ZN7ee30761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee30761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30761[];
extern void _ZN7ee307613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee307613fooEv,_ZTv0_n16_N7ee307613fooEv)();
extern void ABISELECT(_ZThn16_N7ee307613fooEv,_ZThn8_N7ee307613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee307613fooEv,_ZTv0_n12_N7ee307613fooEv)();
extern void ABISELECT(_ZThn32_N7ee307613fooEv,_ZThn20_N7ee307613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30761[0]),
  (VTBL_ENTRY)&_ZN7ee307613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee307613fooEv,_ZTv0_n16_N7ee307613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee307613fooEv,_ZTv0_n12_N7ee307613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee30761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee30761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee30761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee30761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee30761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee30761[] = {
  {&(_ZTV7ee30761[4]),  4,18},
  {&(_ZTV7ee30761[10]),  10,18},
  {&(_ZTV7ee30761[16]),  16,18},
  {&(_tg__ZTV6dd0761__7ee30761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee30761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee30761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee30761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30761[];
extern  VTBL_ENTRY _ZTV7ee30761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30761[];
static VTBL_ENTRY alt_thunk_names863[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee307613fooEv,_ZTv0_n12_N7ee307613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee307613fooEv,_ZThn20_N7ee307613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee307613fooEv,_ZTv0_n16_N7ee307613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee307613fooEv,_ZThn8_N7ee307613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30761 = {  "ee30761", // class name
  bases_ee30761, 4,
  &(vtc_ee30761[0]), // expected_vtbl_contents
  &(vtt_ee30761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names863,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40761  : dd0761 {
  int e;
  virtual void  bar(); // _ZN7ee407613barEv
  ~ee40761(); // tgen
  ee40761(); // tgen
};
//SIG(1 ee40761) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee40761 ::bar(){vfunc_called(this, "_ZN7ee407613barEv");}
ee40761 ::~ee40761(){ note_dtor("ee40761", this);} // tgen
ee40761 ::ee40761(){ note_ctor("ee40761", this);} // tgen

static void Test_ee40761()
{
  extern Class_Descriptor cd_ee40761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40761, buf);
    ee40761 *dp, &lv = *(dp=new (buf) ee40761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee40761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(24,16), "ee40761");
    check_base_class_offset(lv, (cc761*)(dd0761*), 0, "ee40761");
    check_base_class_offset(lv, (dd0761*), 0, "ee40761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40761.e");
    test_class_info(&lv, &cd_ee40761);
    dp->~ee40761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40761(Test_ee40761, "ee40761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40761C1Ev();
extern void _ZN7ee40761D1Ev();
Name_Map name_map_ee40761[] = {
  NSPAIR(_ZN7ee40761C1Ev),
  NSPAIR(_ZN7ee40761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee40761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40761[];
extern void _ZN5cc7613fooEv();
extern void _ZN7ee407613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee407613barEv,_ZTv0_n16_N7ee407613barEv)();
extern void ABISELECT(_ZThn24_N7ee407613barEv,_ZThn16_N7ee407613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN7ee407613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee407613barEv,_ZTv0_n16_N7ee407613barEv),
};
extern VTBL_ENTRY _ZTV7ee40761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee40761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee40761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee40761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee40761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee40761[] = {
  {&(_ZTV7ee40761[3]),  3,11},
  {&(_tg__ZTV6dd0761__7ee40761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee40761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee40761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee40761[4]),  4,6},
  {&(_ZTV7ee40761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee40761[];
extern  VTBL_ENTRY _ZTV7ee40761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40761[];
static VTBL_ENTRY alt_thunk_names864[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee407613barEv,_ZTv0_n16_N7ee407613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee407613barEv,_ZThn16_N7ee407613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40761 = {  "ee40761", // class name
  bases_ee40761, 4,
  &(vtc_ee40761[0]), // expected_vtbl_contents
  &(vtt_ee40761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names864,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50761  : virtual dd0761 {
  int e;
  virtual void  bar(); // _ZN7ee507613barEv
  ~ee50761(); // tgen
  ee50761(); // tgen
};
//SIG(1 ee50761) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee50761 ::bar(){vfunc_called(this, "_ZN7ee507613barEv");}
ee50761 ::~ee50761(){ note_dtor("ee50761", this);} // tgen
ee50761 ::ee50761(){ note_ctor("ee50761", this);} // tgen

static void Test_ee50761()
{
  extern Class_Descriptor cd_ee50761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50761, buf);
    ee50761 *dp, &lv = *(dp=new (buf) ee50761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee50761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(32,20), "ee50761");
    check_base_class_offset(lv, (cc761*)(dd0761*), ABISELECT(16,8), "ee50761");
    check_base_class_offset(lv, (dd0761*), ABISELECT(16,8), "ee50761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50761.e");
    test_class_info(&lv, &cd_ee50761);
    dp->~ee50761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50761(Test_ee50761, "ee50761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50761C1Ev();
extern void _ZN7ee50761D1Ev();
Name_Map name_map_ee50761[] = {
  NSPAIR(_ZN7ee50761C1Ev),
  NSPAIR(_ZN7ee50761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee50761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50761[];
extern void _ZN7ee507613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee507613barEv,_ZTv0_n20_N7ee507613barEv)();
extern void ABISELECT(_ZThn16_N7ee507613barEv,_ZThn8_N7ee507613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee507613barEv,_ZTv0_n16_N7ee507613barEv)();
extern void ABISELECT(_ZThn32_N7ee507613barEv,_ZThn20_N7ee507613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50761[0]),
  (VTBL_ENTRY)&_ZN7ee507613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee507613barEv,_ZTv0_n20_N7ee507613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee507613barEv,_ZTv0_n16_N7ee507613barEv),
};
extern VTBL_ENTRY _ZTV7ee50761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee50761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee50761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee50761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee50761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee50761[] = {
  {&(_ZTV7ee50761[4]),  4,18},
  {&(_ZTV7ee50761[10]),  10,18},
  {&(_ZTV7ee50761[16]),  16,18},
  {&(_tg__ZTV6dd0761__7ee50761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee50761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee50761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee50761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50761[];
extern  VTBL_ENTRY _ZTV7ee50761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50761[];
static VTBL_ENTRY alt_thunk_names865[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee507613barEv,_ZTv0_n16_N7ee507613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee507613barEv,_ZThn20_N7ee507613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee507613barEv,_ZTv0_n20_N7ee507613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee507613barEv,_ZThn8_N7ee507613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50761 = {  "ee50761", // class name
  bases_ee50761, 4,
  &(vtc_ee50761[0]), // expected_vtbl_contents
  &(vtt_ee50761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names865,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60761  : dd0761 {
  int e;
  virtual void  foo(); // _ZN7ee607613fooEv
  virtual void  bar(); // _ZN7ee607613barEv
  ~ee60761(); // tgen
  ee60761(); // tgen
};
//SIG(1 ee60761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee60761 ::foo(){vfunc_called(this, "_ZN7ee607613fooEv");}
void  ee60761 ::bar(){vfunc_called(this, "_ZN7ee607613barEv");}
ee60761 ::~ee60761(){ note_dtor("ee60761", this);} // tgen
ee60761 ::ee60761(){ note_ctor("ee60761", this);} // tgen

static void Test_ee60761()
{
  extern Class_Descriptor cd_ee60761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60761, buf);
    ee60761 *dp, &lv = *(dp=new (buf) ee60761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee60761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(24,16), "ee60761");
    check_base_class_offset(lv, (cc761*)(dd0761*), 0, "ee60761");
    check_base_class_offset(lv, (dd0761*), 0, "ee60761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60761.e");
    test_class_info(&lv, &cd_ee60761);
    dp->~ee60761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60761(Test_ee60761, "ee60761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60761C1Ev();
extern void _ZN7ee60761D1Ev();
Name_Map name_map_ee60761[] = {
  NSPAIR(_ZN7ee60761C1Ev),
  NSPAIR(_ZN7ee60761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee60761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60761[];
extern void _ZN7ee607613fooEv();
extern void _ZN7ee607613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee607613fooEv,_ZTv0_n12_N7ee607613fooEv)();
extern void ABISELECT(_ZThn24_N7ee607613fooEv,_ZThn16_N7ee607613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee607613barEv,_ZTv0_n16_N7ee607613barEv)();
extern void ABISELECT(_ZThn24_N7ee607613barEv,_ZThn16_N7ee607613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60761[0]),
  (VTBL_ENTRY)&_ZN7ee607613fooEv,
  (VTBL_ENTRY)&_ZN7ee607613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee607613fooEv,_ZTv0_n12_N7ee607613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee607613barEv,_ZTv0_n16_N7ee607613barEv),
};
extern VTBL_ENTRY _ZTV7ee60761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee60761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee60761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee60761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee60761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee60761[] = {
  {&(_ZTV7ee60761[3]),  3,11},
  {&(_tg__ZTV6dd0761__7ee60761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee60761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee60761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee60761[4]),  4,6},
  {&(_ZTV7ee60761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60761[];
extern  VTBL_ENTRY _ZTV7ee60761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60761[];
static VTBL_ENTRY alt_thunk_names866[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee607613barEv,_ZTv0_n16_N7ee607613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee607613barEv,_ZThn16_N7ee607613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee607613fooEv,_ZTv0_n12_N7ee607613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee607613fooEv,_ZThn16_N7ee607613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60761 = {  "ee60761", // class name
  bases_ee60761, 4,
  &(vtc_ee60761[0]), // expected_vtbl_contents
  &(vtt_ee60761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names866,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70761  : virtual dd0761 {
  int e;
  virtual void  foo(); // _ZN7ee707613fooEv
  virtual void  bar(); // _ZN7ee707613barEv
  ~ee70761(); // tgen
  ee70761(); // tgen
};
//SIG(1 ee70761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee70761 ::foo(){vfunc_called(this, "_ZN7ee707613fooEv");}
void  ee70761 ::bar(){vfunc_called(this, "_ZN7ee707613barEv");}
ee70761 ::~ee70761(){ note_dtor("ee70761", this);} // tgen
ee70761 ::ee70761(){ note_ctor("ee70761", this);} // tgen

static void Test_ee70761()
{
  extern Class_Descriptor cd_ee70761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70761, buf);
    ee70761 *dp, &lv = *(dp=new (buf) ee70761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee70761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd0761*), ABISELECT(32,20), "ee70761");
    check_base_class_offset(lv, (cc761*)(dd0761*), ABISELECT(16,8), "ee70761");
    check_base_class_offset(lv, (dd0761*), ABISELECT(16,8), "ee70761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70761.e");
    test_class_info(&lv, &cd_ee70761);
    dp->~ee70761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70761(Test_ee70761, "ee70761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70761C1Ev();
extern void _ZN7ee70761D1Ev();
Name_Map name_map_ee70761[] = {
  NSPAIR(_ZN7ee70761C1Ev),
  NSPAIR(_ZN7ee70761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd0761;
extern VTBL_ENTRY _ZTI6dd0761[];
extern  VTBL_ENTRY _ZTV6dd0761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0761[];
static Base_Class bases_ee70761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70761[];
extern void _ZN7ee707613fooEv();
extern void _ZN7ee707613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee707613fooEv,_ZTv0_n16_N7ee707613fooEv)();
extern void ABISELECT(_ZThn16_N7ee707613fooEv,_ZThn8_N7ee707613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee707613barEv,_ZTv0_n20_N7ee707613barEv)();
extern void ABISELECT(_ZThn16_N7ee707613barEv,_ZThn8_N7ee707613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee707613fooEv,_ZTv0_n12_N7ee707613fooEv)();
extern void ABISELECT(_ZThn32_N7ee707613fooEv,_ZThn20_N7ee707613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee707613barEv,_ZTv0_n16_N7ee707613barEv)();
extern void ABISELECT(_ZThn32_N7ee707613barEv,_ZThn20_N7ee707613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70761[0]),
  (VTBL_ENTRY)&_ZN7ee707613fooEv,
  (VTBL_ENTRY)&_ZN7ee707613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee707613fooEv,_ZTv0_n16_N7ee707613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee707613barEv,_ZTv0_n20_N7ee707613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee707613fooEv,_ZTv0_n12_N7ee707613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee707613barEv,_ZTv0_n16_N7ee707613barEv),
};
extern VTBL_ENTRY _ZTV7ee70761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd0761__7ee70761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd0761__7ee70761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd0761__7ee70761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd0761__7ee70761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee70761[] = {
  {&(_ZTV7ee70761[4]),  4,19},
  {&(_ZTV7ee70761[11]),  11,19},
  {&(_ZTV7ee70761[17]),  17,19},
  {&(_tg__ZTV6dd0761__7ee70761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd0761__7ee70761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd0761__7ee70761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd0761__7ee70761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70761[];
extern  VTBL_ENTRY _ZTV7ee70761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70761[];
static VTBL_ENTRY alt_thunk_names867[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee707613barEv,_ZTv0_n16_N7ee707613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee707613barEv,_ZThn20_N7ee707613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee707613fooEv,_ZTv0_n12_N7ee707613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee707613fooEv,_ZThn20_N7ee707613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee707613barEv,_ZTv0_n20_N7ee707613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee707613barEv,_ZThn8_N7ee707613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee707613fooEv,_ZTv0_n16_N7ee707613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee707613fooEv,_ZThn8_N7ee707613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70761 = {  "ee70761", // class name
  bases_ee70761, 4,
  &(vtc_ee70761[0]), // expected_vtbl_contents
  &(vtt_ee70761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names867,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1761  : virtual cc761 {
  int d;
  ~dd1761(); // tgen
  dd1761(); // tgen
};
//SIG(-1 dd1761) C1{ VBC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd1761 ::~dd1761(){ note_dtor("dd1761", this);} // tgen
dd1761 ::dd1761(){ note_ctor("dd1761", this);} // tgen

static void Test_dd1761()
{
  extern Class_Descriptor cd_dd1761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1761, buf);
    dd1761 *dp, &lv = *(dp=new (buf) dd1761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd1761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,16), "dd1761");
    check_base_class_offset(lv, (cc761*), ABISELECT(16,8), "dd1761");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1761.d");
    test_class_info(&lv, &cd_dd1761);
    dp->~dd1761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1761(Test_dd1761, "dd1761", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1761C1Ev();
extern void _ZN6dd1761D1Ev();
Name_Map name_map_dd1761[] = {
  NSPAIR(_ZN6dd1761C1Ev),
  NSPAIR(_ZN6dd1761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd1761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc761,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd1761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV6dd1761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd1761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd1761[] = {
  {&(_ZTV6dd1761[4]),  4,17},
  {&(_ZTV6dd1761[9]),  9,17},
  {&(_ZTV6dd1761[15]),  15,17},
  {&(_tg__ZTV5cc761__6dd1761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd1761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static VTBL_ENTRY alt_thunk_names868[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1761 = {  "dd1761", // class name
  bases_dd1761, 3,
  &(vtc_dd1761[0]), // expected_vtbl_contents
  &(vtt_dd1761[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1761),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1761),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names868,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01761  : dd1761 {
  int e;
  ~ee01761(); // tgen
  ee01761(); // tgen
};
//SIG(1 ee01761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee01761 ::~ee01761(){ note_dtor("ee01761", this);} // tgen
ee01761 ::ee01761(){ note_ctor("ee01761", this);} // tgen

static void Test_ee01761()
{
  extern Class_Descriptor cd_ee01761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01761, buf);
    ee01761 *dp, &lv = *(dp=new (buf) ee01761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee01761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee01761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(16,12), "ee01761");
    check_base_class_offset(lv, (dd1761*), 0, "ee01761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01761.e");
    test_class_info(&lv, &cd_ee01761);
    dp->~ee01761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01761(Test_ee01761, "ee01761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01761C1Ev();
extern void _ZN7ee01761D1Ev();
Name_Map name_map_ee01761[] = {
  NSPAIR(_ZN7ee01761C1Ev),
  NSPAIR(_ZN7ee01761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee01761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //bcp->offset
    4, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee01761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01761[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee01761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee01761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee01761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee01761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee01761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee01761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee01761[] = {
  {&(_ZTV7ee01761[4]),  4,17},
  {&(_tg__ZTV6dd1761__7ee01761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee01761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee01761[4]),  4,6},
  {&(_ZTV7ee01761[9]),  9,17},
  {&(_ZTV7ee01761[15]),  15,17},
  {&(_tg__ZTV5cc761__7ee01761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee01761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01761[];
extern  VTBL_ENTRY _ZTV7ee01761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01761[];
static VTBL_ENTRY alt_thunk_names869[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01761 = {  "ee01761", // class name
  bases_ee01761, 4,
  &(vtc_ee01761[0]), // expected_vtbl_contents
  &(vtt_ee01761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01761),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names869,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11761  : virtual dd1761 {
  int e;
  ~ee11761(); // tgen
  ee11761(); // tgen
};
//SIG(1 ee11761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee11761 ::~ee11761(){ note_dtor("ee11761", this);} // tgen
ee11761 ::ee11761(){ note_ctor("ee11761", this);} // tgen

static void Test_ee11761()
{
  extern Class_Descriptor cd_ee11761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11761, buf);
    ee11761 *dp, &lv = *(dp=new (buf) ee11761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee11761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee11761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(32,16), "ee11761");
    check_base_class_offset(lv, (dd1761*), ABISELECT(16,8), "ee11761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11761.e");
    test_class_info(&lv, &cd_ee11761);
    dp->~ee11761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11761(Test_ee11761, "ee11761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11761C1Ev();
extern void _ZN7ee11761D1Ev();
Name_Map name_map_ee11761[] = {
  NSPAIR(_ZN7ee11761C1Ev),
  NSPAIR(_ZN7ee11761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee11761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    9, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee11761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11761[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11761[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee11761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee11761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee11761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee11761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee11761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee11761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee11761[] = {
  {&(_ZTV7ee11761[5]),  5,22},
  {&(_ZTV7ee11761[9]),  9,22},
  {&(_ZTV7ee11761[14]),  14,22},
  {&(_ZTV7ee11761[20]),  20,22},
  {&(_tg__ZTV6dd1761__7ee11761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee11761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee11761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee11761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee11761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11761[];
extern  VTBL_ENTRY _ZTV7ee11761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11761[];
static VTBL_ENTRY alt_thunk_names870[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11761 = {  "ee11761", // class name
  bases_ee11761, 4,
  &(vtc_ee11761[0]), // expected_vtbl_contents
  &(vtt_ee11761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11761),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names870,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21761  : dd1761 {
  int e;
  virtual void  foo(); // _ZN7ee217613fooEv
  ~ee21761(); // tgen
  ee21761(); // tgen
};
//SIG(1 ee21761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee21761 ::foo(){vfunc_called(this, "_ZN7ee217613fooEv");}
ee21761 ::~ee21761(){ note_dtor("ee21761", this);} // tgen
ee21761 ::ee21761(){ note_ctor("ee21761", this);} // tgen

static void Test_ee21761()
{
  extern Class_Descriptor cd_ee21761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21761, buf);
    ee21761 *dp, &lv = *(dp=new (buf) ee21761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee21761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee21761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(16,12), "ee21761");
    check_base_class_offset(lv, (dd1761*), 0, "ee21761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21761.e");
    test_class_info(&lv, &cd_ee21761);
    dp->~ee21761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21761(Test_ee21761, "ee21761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21761C1Ev();
extern void _ZN7ee21761D1Ev();
Name_Map name_map_ee21761[] = {
  NSPAIR(_ZN7ee21761C1Ev),
  NSPAIR(_ZN7ee21761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee21761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21761[];
extern void _ZN7ee217613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee217613fooEv,_ZTv0_n16_N7ee217613fooEv)();
extern void ABISELECT(_ZThn16_N7ee217613fooEv,_ZThn12_N7ee217613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee217613fooEv,_ZTv0_n12_N7ee217613fooEv)();
extern void ABISELECT(_ZThn32_N7ee217613fooEv,_ZThn20_N7ee217613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21761[0]),
  (VTBL_ENTRY)&_ZN7ee217613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee217613fooEv,_ZTv0_n16_N7ee217613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee217613fooEv,_ZTv0_n12_N7ee217613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee21761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee21761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee21761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee21761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee21761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee21761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee21761[] = {
  {&(_ZTV7ee21761[4]),  4,18},
  {&(_tg__ZTV6dd1761__7ee21761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee21761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee21761[4]),  4,6},
  {&(_ZTV7ee21761[10]),  10,18},
  {&(_ZTV7ee21761[16]),  16,18},
  {&(_tg__ZTV5cc761__7ee21761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee21761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21761[];
extern  VTBL_ENTRY _ZTV7ee21761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21761[];
static VTBL_ENTRY alt_thunk_names871[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee217613fooEv,_ZTv0_n12_N7ee217613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee217613fooEv,_ZThn20_N7ee217613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee217613fooEv,_ZTv0_n16_N7ee217613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee217613fooEv,_ZThn12_N7ee217613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21761 = {  "ee21761", // class name
  bases_ee21761, 4,
  &(vtc_ee21761[0]), // expected_vtbl_contents
  &(vtt_ee21761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names871,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31761  : virtual dd1761 {
  int e;
  virtual void  foo(); // _ZN7ee317613fooEv
  ~ee31761(); // tgen
  ee31761(); // tgen
};
//SIG(1 ee31761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee31761 ::foo(){vfunc_called(this, "_ZN7ee317613fooEv");}
ee31761 ::~ee31761(){ note_dtor("ee31761", this);} // tgen
ee31761 ::ee31761(){ note_ctor("ee31761", this);} // tgen

static void Test_ee31761()
{
  extern Class_Descriptor cd_ee31761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31761, buf);
    ee31761 *dp, &lv = *(dp=new (buf) ee31761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee31761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee31761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(32,16), "ee31761");
    check_base_class_offset(lv, (dd1761*), ABISELECT(16,8), "ee31761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31761.e");
    test_class_info(&lv, &cd_ee31761);
    dp->~ee31761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31761(Test_ee31761, "ee31761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31761C1Ev();
extern void _ZN7ee31761D1Ev();
Name_Map name_map_ee31761[] = {
  NSPAIR(_ZN7ee31761C1Ev),
  NSPAIR(_ZN7ee31761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee31761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    10, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31761[];
extern void _ZN7ee317613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee317613fooEv,_ZTv0_n16_N7ee317613fooEv)();
extern void ABISELECT(_ZThn32_N7ee317613fooEv,_ZThn16_N7ee317613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee317613fooEv,_ZTv0_n12_N7ee317613fooEv)();
extern void ABISELECT(_ZThn48_N7ee317613fooEv,_ZThn24_N7ee317613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31761[0]),
  (VTBL_ENTRY)&_ZN7ee317613fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31761[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee317613fooEv,_ZTv0_n16_N7ee317613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee317613fooEv,_ZTv0_n12_N7ee317613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee31761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee31761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee31761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee31761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee31761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee31761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee31761[] = {
  {&(_ZTV7ee31761[5]),  5,23},
  {&(_ZTV7ee31761[10]),  10,23},
  {&(_ZTV7ee31761[15]),  15,23},
  {&(_ZTV7ee31761[21]),  21,23},
  {&(_tg__ZTV6dd1761__7ee31761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee31761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee31761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee31761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee31761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31761[];
extern  VTBL_ENTRY _ZTV7ee31761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31761[];
static VTBL_ENTRY alt_thunk_names872[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee317613fooEv,_ZTv0_n12_N7ee317613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee317613fooEv,_ZThn24_N7ee317613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee317613fooEv,_ZTv0_n16_N7ee317613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee317613fooEv,_ZThn16_N7ee317613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31761 = {  "ee31761", // class name
  bases_ee31761, 4,
  &(vtc_ee31761[0]), // expected_vtbl_contents
  &(vtt_ee31761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31761),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names872,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41761  : dd1761 {
  int e;
  virtual void  bar(); // _ZN7ee417613barEv
  ~ee41761(); // tgen
  ee41761(); // tgen
};
//SIG(1 ee41761) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee41761 ::bar(){vfunc_called(this, "_ZN7ee417613barEv");}
ee41761 ::~ee41761(){ note_dtor("ee41761", this);} // tgen
ee41761 ::ee41761(){ note_ctor("ee41761", this);} // tgen

static void Test_ee41761()
{
  extern Class_Descriptor cd_ee41761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41761, buf);
    ee41761 *dp, &lv = *(dp=new (buf) ee41761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee41761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee41761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(16,12), "ee41761");
    check_base_class_offset(lv, (dd1761*), 0, "ee41761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41761.e");
    test_class_info(&lv, &cd_ee41761);
    dp->~ee41761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41761(Test_ee41761, "ee41761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41761C1Ev();
extern void _ZN7ee41761D1Ev();
Name_Map name_map_ee41761[] = {
  NSPAIR(_ZN7ee41761C1Ev),
  NSPAIR(_ZN7ee41761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee41761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41761[];
extern void _ZN7ee417613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee417613barEv,_ZTv0_n20_N7ee417613barEv)();
extern void ABISELECT(_ZThn16_N7ee417613barEv,_ZThn12_N7ee417613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee417613barEv,_ZTv0_n16_N7ee417613barEv)();
extern void ABISELECT(_ZThn32_N7ee417613barEv,_ZThn20_N7ee417613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41761[0]),
  (VTBL_ENTRY)&_ZN7ee417613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee417613barEv,_ZTv0_n20_N7ee417613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee417613barEv,_ZTv0_n16_N7ee417613barEv),
};
extern VTBL_ENTRY _ZTV7ee41761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee41761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee41761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee41761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee41761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee41761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee41761[] = {
  {&(_ZTV7ee41761[4]),  4,18},
  {&(_tg__ZTV6dd1761__7ee41761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee41761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee41761[4]),  4,6},
  {&(_ZTV7ee41761[10]),  10,18},
  {&(_ZTV7ee41761[16]),  16,18},
  {&(_tg__ZTV5cc761__7ee41761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee41761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41761[];
extern  VTBL_ENTRY _ZTV7ee41761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41761[];
static VTBL_ENTRY alt_thunk_names873[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee417613barEv,_ZTv0_n16_N7ee417613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee417613barEv,_ZThn20_N7ee417613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee417613barEv,_ZTv0_n20_N7ee417613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee417613barEv,_ZThn12_N7ee417613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41761 = {  "ee41761", // class name
  bases_ee41761, 4,
  &(vtc_ee41761[0]), // expected_vtbl_contents
  &(vtt_ee41761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names873,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51761  : virtual dd1761 {
  int e;
  virtual void  bar(); // _ZN7ee517613barEv
  ~ee51761(); // tgen
  ee51761(); // tgen
};
//SIG(1 ee51761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee51761 ::bar(){vfunc_called(this, "_ZN7ee517613barEv");}
ee51761 ::~ee51761(){ note_dtor("ee51761", this);} // tgen
ee51761 ::ee51761(){ note_ctor("ee51761", this);} // tgen

static void Test_ee51761()
{
  extern Class_Descriptor cd_ee51761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51761, buf);
    ee51761 *dp, &lv = *(dp=new (buf) ee51761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee51761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee51761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(32,16), "ee51761");
    check_base_class_offset(lv, (dd1761*), ABISELECT(16,8), "ee51761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51761.e");
    test_class_info(&lv, &cd_ee51761);
    dp->~ee51761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51761(Test_ee51761, "ee51761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51761C1Ev();
extern void _ZN7ee51761D1Ev();
Name_Map name_map_ee51761[] = {
  NSPAIR(_ZN7ee51761C1Ev),
  NSPAIR(_ZN7ee51761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee51761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    10, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51761[];
extern void _ZN7ee517613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee517613barEv,_ZTv0_n20_N7ee517613barEv)();
extern void ABISELECT(_ZThn32_N7ee517613barEv,_ZThn16_N7ee517613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee517613barEv,_ZTv0_n16_N7ee517613barEv)();
extern void ABISELECT(_ZThn48_N7ee517613barEv,_ZThn24_N7ee517613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51761[0]),
  (VTBL_ENTRY)&_ZN7ee517613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51761[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee517613barEv,_ZTv0_n20_N7ee517613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee517613barEv,_ZTv0_n16_N7ee517613barEv),
};
extern VTBL_ENTRY _ZTV7ee51761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee51761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee51761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee51761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee51761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee51761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee51761[] = {
  {&(_ZTV7ee51761[5]),  5,23},
  {&(_ZTV7ee51761[10]),  10,23},
  {&(_ZTV7ee51761[15]),  15,23},
  {&(_ZTV7ee51761[21]),  21,23},
  {&(_tg__ZTV6dd1761__7ee51761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee51761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee51761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee51761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee51761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51761[];
extern  VTBL_ENTRY _ZTV7ee51761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51761[];
static VTBL_ENTRY alt_thunk_names874[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee517613barEv,_ZTv0_n16_N7ee517613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee517613barEv,_ZThn24_N7ee517613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee517613barEv,_ZTv0_n20_N7ee517613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee517613barEv,_ZThn16_N7ee517613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51761 = {  "ee51761", // class name
  bases_ee51761, 4,
  &(vtc_ee51761[0]), // expected_vtbl_contents
  &(vtt_ee51761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51761),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names874,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61761  : dd1761 {
  int e;
  virtual void  foo(); // _ZN7ee617613fooEv
  virtual void  bar(); // _ZN7ee617613barEv
  ~ee61761(); // tgen
  ee61761(); // tgen
};
//SIG(1 ee61761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee61761 ::foo(){vfunc_called(this, "_ZN7ee617613fooEv");}
void  ee61761 ::bar(){vfunc_called(this, "_ZN7ee617613barEv");}
ee61761 ::~ee61761(){ note_dtor("ee61761", this);} // tgen
ee61761 ::ee61761(){ note_ctor("ee61761", this);} // tgen

static void Test_ee61761()
{
  extern Class_Descriptor cd_ee61761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61761, buf);
    ee61761 *dp, &lv = *(dp=new (buf) ee61761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee61761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee61761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(16,12), "ee61761");
    check_base_class_offset(lv, (dd1761*), 0, "ee61761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61761.e");
    test_class_info(&lv, &cd_ee61761);
    dp->~ee61761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61761(Test_ee61761, "ee61761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61761C1Ev();
extern void _ZN7ee61761D1Ev();
Name_Map name_map_ee61761[] = {
  NSPAIR(_ZN7ee61761C1Ev),
  NSPAIR(_ZN7ee61761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee61761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61761[];
extern void _ZN7ee617613fooEv();
extern void _ZN7ee617613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee617613fooEv,_ZTv0_n16_N7ee617613fooEv)();
extern void ABISELECT(_ZThn16_N7ee617613fooEv,_ZThn12_N7ee617613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee617613barEv,_ZTv0_n20_N7ee617613barEv)();
extern void ABISELECT(_ZThn16_N7ee617613barEv,_ZThn12_N7ee617613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee617613fooEv,_ZTv0_n12_N7ee617613fooEv)();
extern void ABISELECT(_ZThn32_N7ee617613fooEv,_ZThn20_N7ee617613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee617613barEv,_ZTv0_n16_N7ee617613barEv)();
extern void ABISELECT(_ZThn32_N7ee617613barEv,_ZThn20_N7ee617613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61761[0]),
  (VTBL_ENTRY)&_ZN7ee617613fooEv,
  (VTBL_ENTRY)&_ZN7ee617613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee617613fooEv,_ZTv0_n16_N7ee617613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee617613barEv,_ZTv0_n20_N7ee617613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee617613fooEv,_ZTv0_n12_N7ee617613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee617613barEv,_ZTv0_n16_N7ee617613barEv),
};
extern VTBL_ENTRY _ZTV7ee61761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee61761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee61761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee61761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee61761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee61761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee61761[] = {
  {&(_ZTV7ee61761[4]),  4,19},
  {&(_tg__ZTV6dd1761__7ee61761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee61761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee61761[4]),  4,6},
  {&(_ZTV7ee61761[11]),  11,19},
  {&(_ZTV7ee61761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee61761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee61761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61761[];
extern  VTBL_ENTRY _ZTV7ee61761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61761[];
static VTBL_ENTRY alt_thunk_names875[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee617613barEv,_ZTv0_n16_N7ee617613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee617613barEv,_ZThn20_N7ee617613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee617613fooEv,_ZTv0_n12_N7ee617613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee617613fooEv,_ZThn20_N7ee617613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee617613barEv,_ZTv0_n20_N7ee617613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee617613barEv,_ZThn12_N7ee617613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee617613fooEv,_ZTv0_n16_N7ee617613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee617613fooEv,_ZThn12_N7ee617613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61761 = {  "ee61761", // class name
  bases_ee61761, 4,
  &(vtc_ee61761[0]), // expected_vtbl_contents
  &(vtt_ee61761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names875,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71761  : virtual dd1761 {
  int e;
  virtual void  foo(); // _ZN7ee717613fooEv
  virtual void  bar(); // _ZN7ee717613barEv
  ~ee71761(); // tgen
  ee71761(); // tgen
};
//SIG(1 ee71761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee71761 ::foo(){vfunc_called(this, "_ZN7ee717613fooEv");}
void  ee71761 ::bar(){vfunc_called(this, "_ZN7ee717613barEv");}
ee71761 ::~ee71761(){ note_dtor("ee71761", this);} // tgen
ee71761 ::ee71761(){ note_ctor("ee71761", this);} // tgen

static void Test_ee71761()
{
  extern Class_Descriptor cd_ee71761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71761, buf);
    ee71761 *dp, &lv = *(dp=new (buf) ee71761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee71761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee71761");
    check_base_class_offset(lv, (cc761*)(dd1761*), ABISELECT(32,16), "ee71761");
    check_base_class_offset(lv, (dd1761*), ABISELECT(16,8), "ee71761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71761.e");
    test_class_info(&lv, &cd_ee71761);
    dp->~ee71761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71761(Test_ee71761, "ee71761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71761C1Ev();
extern void _ZN7ee71761D1Ev();
Name_Map name_map_ee71761[] = {
  NSPAIR(_ZN7ee71761C1Ev),
  NSPAIR(_ZN7ee71761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd1761;
extern VTBL_ENTRY _ZTI6dd1761[];
extern  VTBL_ENTRY _ZTV6dd1761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1761[];
static Base_Class bases_ee71761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1761,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71761[];
extern void _ZN7ee717613fooEv();
extern void _ZN7ee717613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee717613fooEv,_ZTv0_n16_N7ee717613fooEv)();
extern void ABISELECT(_ZThn32_N7ee717613fooEv,_ZThn16_N7ee717613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee717613barEv,_ZTv0_n20_N7ee717613barEv)();
extern void ABISELECT(_ZThn32_N7ee717613barEv,_ZThn16_N7ee717613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee717613fooEv,_ZTv0_n12_N7ee717613fooEv)();
extern void ABISELECT(_ZThn48_N7ee717613fooEv,_ZThn24_N7ee717613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee717613barEv,_ZTv0_n16_N7ee717613barEv)();
extern void ABISELECT(_ZThn48_N7ee717613barEv,_ZThn24_N7ee717613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71761[0]),
  (VTBL_ENTRY)&_ZN7ee717613fooEv,
  (VTBL_ENTRY)&_ZN7ee717613barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71761[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee717613fooEv,_ZTv0_n16_N7ee717613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee717613barEv,_ZTv0_n20_N7ee717613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee717613fooEv,_ZTv0_n12_N7ee717613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee717613barEv,_ZTv0_n16_N7ee717613barEv),
};
extern VTBL_ENTRY _ZTV7ee71761[];
static  VTBL_ENTRY _tg__ZTV6dd1761__7ee71761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd1761__7ee71761[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd1761__7ee71761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee71761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee71761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee71761[] = {
  {&(_ZTV7ee71761[5]),  5,24},
  {&(_ZTV7ee71761[11]),  11,24},
  {&(_ZTV7ee71761[16]),  16,24},
  {&(_ZTV7ee71761[22]),  22,24},
  {&(_tg__ZTV6dd1761__7ee71761[4]),  4,4},
  {&(_tg__ZTV5cc761__6dd1761__7ee71761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd1761__7ee71761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee71761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee71761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71761[];
extern  VTBL_ENTRY _ZTV7ee71761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71761[];
static VTBL_ENTRY alt_thunk_names876[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee717613barEv,_ZTv0_n16_N7ee717613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee717613barEv,_ZThn24_N7ee717613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee717613fooEv,_ZTv0_n12_N7ee717613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee717613fooEv,_ZThn24_N7ee717613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee717613barEv,_ZTv0_n20_N7ee717613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee717613barEv,_ZThn16_N7ee717613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee717613fooEv,_ZTv0_n16_N7ee717613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee717613fooEv,_ZThn16_N7ee717613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71761 = {  "ee71761", // class name
  bases_ee71761, 4,
  &(vtc_ee71761[0]), // expected_vtbl_contents
  &(vtt_ee71761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71761),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names876,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2761  : cc761 {
  int d;
  virtual void  foo(); // _ZN6dd27613fooEv
  ~dd2761(); // tgen
  dd2761(); // tgen
};
//SIG(-1 dd2761) C1{ BC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd2761 ::foo(){vfunc_called(this, "_ZN6dd27613fooEv");}
dd2761 ::~dd2761(){ note_dtor("dd2761", this);} // tgen
dd2761 ::dd2761(){ note_ctor("dd2761", this);} // tgen

static void Test_dd2761()
{
  extern Class_Descriptor cd_dd2761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2761, buf);
    dd2761 *dp, &lv = *(dp=new (buf) dd2761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd2761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(16,12), "dd2761");
    check_base_class_offset(lv, (cc761*), 0, "dd2761");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2761.d");
    test_class_info(&lv, &cd_dd2761);
    dp->~dd2761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2761(Test_dd2761, "dd2761", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2761C1Ev();
extern void _ZN6dd2761D1Ev();
Name_Map name_map_dd2761[] = {
  NSPAIR(_ZN6dd2761C1Ev),
  NSPAIR(_ZN6dd2761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd2761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV6dd2761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd2761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd2761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd2761[] = {
  {&(_ZTV6dd2761[3]),  3,11},
  {&(_tg__ZTV5cc761__6dd2761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd2761[4]),  4,6},
  {&(_ZTV6dd2761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static VTBL_ENTRY alt_thunk_names877[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2761 = {  "dd2761", // class name
  bases_dd2761, 3,
  &(vtc_dd2761[0]), // expected_vtbl_contents
  &(vtt_dd2761[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2761),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names877,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02761  : dd2761 {
  int e;
  ~ee02761(); // tgen
  ee02761(); // tgen
};
//SIG(1 ee02761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee02761 ::~ee02761(){ note_dtor("ee02761", this);} // tgen
ee02761 ::ee02761(){ note_ctor("ee02761", this);} // tgen

static void Test_ee02761()
{
  extern Class_Descriptor cd_ee02761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02761, buf);
    ee02761 *dp, &lv = *(dp=new (buf) ee02761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee02761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(24,16), "ee02761");
    check_base_class_offset(lv, (cc761*)(dd2761*), 0, "ee02761");
    check_base_class_offset(lv, (dd2761*), 0, "ee02761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02761.e");
    test_class_info(&lv, &cd_ee02761);
    dp->~ee02761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02761(Test_ee02761, "ee02761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02761C1Ev();
extern void _ZN7ee02761D1Ev();
Name_Map name_map_ee02761[] = {
  NSPAIR(_ZN7ee02761C1Ev),
  NSPAIR(_ZN7ee02761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee02761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee02761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee02761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee02761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee02761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee02761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee02761[] = {
  {&(_ZTV7ee02761[3]),  3,11},
  {&(_tg__ZTV6dd2761__7ee02761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee02761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee02761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee02761[4]),  4,6},
  {&(_ZTV7ee02761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee02761[];
extern  VTBL_ENTRY _ZTV7ee02761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02761[];
static VTBL_ENTRY alt_thunk_names878[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02761 = {  "ee02761", // class name
  bases_ee02761, 4,
  &(vtc_ee02761[0]), // expected_vtbl_contents
  &(vtt_ee02761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names878,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12761  : virtual dd2761 {
  int e;
  ~ee12761(); // tgen
  ee12761(); // tgen
};
//SIG(1 ee12761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee12761 ::~ee12761(){ note_dtor("ee12761", this);} // tgen
ee12761 ::ee12761(){ note_ctor("ee12761", this);} // tgen

static void Test_ee12761()
{
  extern Class_Descriptor cd_ee12761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12761, buf);
    ee12761 *dp, &lv = *(dp=new (buf) ee12761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee12761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(32,20), "ee12761");
    check_base_class_offset(lv, (cc761*)(dd2761*), ABISELECT(16,8), "ee12761");
    check_base_class_offset(lv, (dd2761*), ABISELECT(16,8), "ee12761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12761.e");
    test_class_info(&lv, &cd_ee12761);
    dp->~ee12761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12761(Test_ee12761, "ee12761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12761C1Ev();
extern void _ZN7ee12761D1Ev();
Name_Map name_map_ee12761[] = {
  NSPAIR(_ZN7ee12761C1Ev),
  NSPAIR(_ZN7ee12761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee12761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12761[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee12761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee12761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee12761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee12761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee12761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee12761[] = {
  {&(_ZTV7ee12761[4]),  4,17},
  {&(_ZTV7ee12761[9]),  9,17},
  {&(_ZTV7ee12761[15]),  15,17},
  {&(_tg__ZTV6dd2761__7ee12761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee12761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee12761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee12761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12761[];
extern  VTBL_ENTRY _ZTV7ee12761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12761[];
static VTBL_ENTRY alt_thunk_names879[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12761 = {  "ee12761", // class name
  bases_ee12761, 4,
  &(vtc_ee12761[0]), // expected_vtbl_contents
  &(vtt_ee12761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12761),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names879,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22761  : dd2761 {
  int e;
  virtual void  foo(); // _ZN7ee227613fooEv
  ~ee22761(); // tgen
  ee22761(); // tgen
};
//SIG(1 ee22761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee22761 ::foo(){vfunc_called(this, "_ZN7ee227613fooEv");}
ee22761 ::~ee22761(){ note_dtor("ee22761", this);} // tgen
ee22761 ::ee22761(){ note_ctor("ee22761", this);} // tgen

static void Test_ee22761()
{
  extern Class_Descriptor cd_ee22761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22761, buf);
    ee22761 *dp, &lv = *(dp=new (buf) ee22761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee22761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(24,16), "ee22761");
    check_base_class_offset(lv, (cc761*)(dd2761*), 0, "ee22761");
    check_base_class_offset(lv, (dd2761*), 0, "ee22761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22761.e");
    test_class_info(&lv, &cd_ee22761);
    dp->~ee22761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22761(Test_ee22761, "ee22761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22761C1Ev();
extern void _ZN7ee22761D1Ev();
Name_Map name_map_ee22761[] = {
  NSPAIR(_ZN7ee22761C1Ev),
  NSPAIR(_ZN7ee22761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee22761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22761[];
extern void _ZN7ee227613fooEv();
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee227613fooEv,_ZTv0_n12_N7ee227613fooEv)();
extern void ABISELECT(_ZThn24_N7ee227613fooEv,_ZThn16_N7ee227613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22761[0]),
  (VTBL_ENTRY)&_ZN7ee227613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee227613fooEv,_ZTv0_n12_N7ee227613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee22761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee22761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee22761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee22761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee22761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee22761[] = {
  {&(_ZTV7ee22761[3]),  3,11},
  {&(_tg__ZTV6dd2761__7ee22761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee22761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee22761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee22761[4]),  4,6},
  {&(_ZTV7ee22761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee22761[];
extern  VTBL_ENTRY _ZTV7ee22761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22761[];
static VTBL_ENTRY alt_thunk_names880[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee227613fooEv,_ZTv0_n12_N7ee227613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee227613fooEv,_ZThn16_N7ee227613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22761 = {  "ee22761", // class name
  bases_ee22761, 4,
  &(vtc_ee22761[0]), // expected_vtbl_contents
  &(vtt_ee22761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names880,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32761  : virtual dd2761 {
  int e;
  virtual void  foo(); // _ZN7ee327613fooEv
  ~ee32761(); // tgen
  ee32761(); // tgen
};
//SIG(1 ee32761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee32761 ::foo(){vfunc_called(this, "_ZN7ee327613fooEv");}
ee32761 ::~ee32761(){ note_dtor("ee32761", this);} // tgen
ee32761 ::ee32761(){ note_ctor("ee32761", this);} // tgen

static void Test_ee32761()
{
  extern Class_Descriptor cd_ee32761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32761, buf);
    ee32761 *dp, &lv = *(dp=new (buf) ee32761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee32761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(32,20), "ee32761");
    check_base_class_offset(lv, (cc761*)(dd2761*), ABISELECT(16,8), "ee32761");
    check_base_class_offset(lv, (dd2761*), ABISELECT(16,8), "ee32761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32761.e");
    test_class_info(&lv, &cd_ee32761);
    dp->~ee32761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32761(Test_ee32761, "ee32761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32761C1Ev();
extern void _ZN7ee32761D1Ev();
Name_Map name_map_ee32761[] = {
  NSPAIR(_ZN7ee32761C1Ev),
  NSPAIR(_ZN7ee32761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee32761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32761[];
extern void _ZN7ee327613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee327613fooEv,_ZTv0_n16_N7ee327613fooEv)();
extern void ABISELECT(_ZThn16_N7ee327613fooEv,_ZThn8_N7ee327613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee327613fooEv,_ZTv0_n12_N7ee327613fooEv)();
extern void ABISELECT(_ZThn32_N7ee327613fooEv,_ZThn20_N7ee327613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32761[0]),
  (VTBL_ENTRY)&_ZN7ee327613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee327613fooEv,_ZTv0_n16_N7ee327613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee327613fooEv,_ZTv0_n12_N7ee327613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee32761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee32761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee32761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee32761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee32761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee32761[] = {
  {&(_ZTV7ee32761[4]),  4,18},
  {&(_ZTV7ee32761[10]),  10,18},
  {&(_ZTV7ee32761[16]),  16,18},
  {&(_tg__ZTV6dd2761__7ee32761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee32761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee32761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee32761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32761[];
extern  VTBL_ENTRY _ZTV7ee32761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32761[];
static VTBL_ENTRY alt_thunk_names881[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee327613fooEv,_ZTv0_n12_N7ee327613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee327613fooEv,_ZThn20_N7ee327613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee327613fooEv,_ZTv0_n16_N7ee327613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee327613fooEv,_ZThn8_N7ee327613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32761 = {  "ee32761", // class name
  bases_ee32761, 4,
  &(vtc_ee32761[0]), // expected_vtbl_contents
  &(vtt_ee32761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names881,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42761  : dd2761 {
  int e;
  virtual void  bar(); // _ZN7ee427613barEv
  ~ee42761(); // tgen
  ee42761(); // tgen
};
//SIG(1 ee42761) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee42761 ::bar(){vfunc_called(this, "_ZN7ee427613barEv");}
ee42761 ::~ee42761(){ note_dtor("ee42761", this);} // tgen
ee42761 ::ee42761(){ note_ctor("ee42761", this);} // tgen

static void Test_ee42761()
{
  extern Class_Descriptor cd_ee42761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42761, buf);
    ee42761 *dp, &lv = *(dp=new (buf) ee42761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee42761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(24,16), "ee42761");
    check_base_class_offset(lv, (cc761*)(dd2761*), 0, "ee42761");
    check_base_class_offset(lv, (dd2761*), 0, "ee42761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42761.e");
    test_class_info(&lv, &cd_ee42761);
    dp->~ee42761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42761(Test_ee42761, "ee42761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42761C1Ev();
extern void _ZN7ee42761D1Ev();
Name_Map name_map_ee42761[] = {
  NSPAIR(_ZN7ee42761C1Ev),
  NSPAIR(_ZN7ee42761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee42761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42761[];
extern void _ZN6dd27613fooEv();
extern void _ZN7ee427613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee427613barEv,_ZTv0_n16_N7ee427613barEv)();
extern void ABISELECT(_ZThn24_N7ee427613barEv,_ZThn16_N7ee427613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN7ee427613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee427613barEv,_ZTv0_n16_N7ee427613barEv),
};
extern VTBL_ENTRY _ZTV7ee42761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee42761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee42761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee42761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee42761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee42761[] = {
  {&(_ZTV7ee42761[3]),  3,11},
  {&(_tg__ZTV6dd2761__7ee42761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee42761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee42761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee42761[4]),  4,6},
  {&(_ZTV7ee42761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42761[];
extern  VTBL_ENTRY _ZTV7ee42761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42761[];
static VTBL_ENTRY alt_thunk_names882[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee427613barEv,_ZTv0_n16_N7ee427613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee427613barEv,_ZThn16_N7ee427613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42761 = {  "ee42761", // class name
  bases_ee42761, 4,
  &(vtc_ee42761[0]), // expected_vtbl_contents
  &(vtt_ee42761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names882,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52761  : virtual dd2761 {
  int e;
  virtual void  bar(); // _ZN7ee527613barEv
  ~ee52761(); // tgen
  ee52761(); // tgen
};
//SIG(1 ee52761) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee52761 ::bar(){vfunc_called(this, "_ZN7ee527613barEv");}
ee52761 ::~ee52761(){ note_dtor("ee52761", this);} // tgen
ee52761 ::ee52761(){ note_ctor("ee52761", this);} // tgen

static void Test_ee52761()
{
  extern Class_Descriptor cd_ee52761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52761, buf);
    ee52761 *dp, &lv = *(dp=new (buf) ee52761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee52761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(32,20), "ee52761");
    check_base_class_offset(lv, (cc761*)(dd2761*), ABISELECT(16,8), "ee52761");
    check_base_class_offset(lv, (dd2761*), ABISELECT(16,8), "ee52761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52761.e");
    test_class_info(&lv, &cd_ee52761);
    dp->~ee52761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52761(Test_ee52761, "ee52761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52761C1Ev();
extern void _ZN7ee52761D1Ev();
Name_Map name_map_ee52761[] = {
  NSPAIR(_ZN7ee52761C1Ev),
  NSPAIR(_ZN7ee52761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee52761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52761[];
extern void _ZN7ee527613barEv();
extern void _ZN6dd27613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee527613barEv,_ZTv0_n20_N7ee527613barEv)();
extern void ABISELECT(_ZThn16_N7ee527613barEv,_ZThn8_N7ee527613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee527613barEv,_ZTv0_n16_N7ee527613barEv)();
extern void ABISELECT(_ZThn32_N7ee527613barEv,_ZThn20_N7ee527613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52761[0]),
  (VTBL_ENTRY)&_ZN7ee527613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee527613barEv,_ZTv0_n20_N7ee527613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee527613barEv,_ZTv0_n16_N7ee527613barEv),
};
extern VTBL_ENTRY _ZTV7ee52761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee52761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee52761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee52761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee52761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee52761[] = {
  {&(_ZTV7ee52761[4]),  4,18},
  {&(_ZTV7ee52761[10]),  10,18},
  {&(_ZTV7ee52761[16]),  16,18},
  {&(_tg__ZTV6dd2761__7ee52761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee52761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee52761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee52761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52761[];
extern  VTBL_ENTRY _ZTV7ee52761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52761[];
static VTBL_ENTRY alt_thunk_names883[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee527613barEv,_ZTv0_n16_N7ee527613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee527613barEv,_ZThn20_N7ee527613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee527613barEv,_ZTv0_n20_N7ee527613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee527613barEv,_ZThn8_N7ee527613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52761 = {  "ee52761", // class name
  bases_ee52761, 4,
  &(vtc_ee52761[0]), // expected_vtbl_contents
  &(vtt_ee52761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names883,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62761  : dd2761 {
  int e;
  virtual void  foo(); // _ZN7ee627613fooEv
  virtual void  bar(); // _ZN7ee627613barEv
  ~ee62761(); // tgen
  ee62761(); // tgen
};
//SIG(1 ee62761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62761 ::foo(){vfunc_called(this, "_ZN7ee627613fooEv");}
void  ee62761 ::bar(){vfunc_called(this, "_ZN7ee627613barEv");}
ee62761 ::~ee62761(){ note_dtor("ee62761", this);} // tgen
ee62761 ::ee62761(){ note_ctor("ee62761", this);} // tgen

static void Test_ee62761()
{
  extern Class_Descriptor cd_ee62761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62761, buf);
    ee62761 *dp, &lv = *(dp=new (buf) ee62761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee62761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(24,16), "ee62761");
    check_base_class_offset(lv, (cc761*)(dd2761*), 0, "ee62761");
    check_base_class_offset(lv, (dd2761*), 0, "ee62761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62761.e");
    test_class_info(&lv, &cd_ee62761);
    dp->~ee62761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62761(Test_ee62761, "ee62761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62761C1Ev();
extern void _ZN7ee62761D1Ev();
Name_Map name_map_ee62761[] = {
  NSPAIR(_ZN7ee62761C1Ev),
  NSPAIR(_ZN7ee62761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee62761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62761[];
extern void _ZN7ee627613fooEv();
extern void _ZN7ee627613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee627613fooEv,_ZTv0_n12_N7ee627613fooEv)();
extern void ABISELECT(_ZThn24_N7ee627613fooEv,_ZThn16_N7ee627613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee627613barEv,_ZTv0_n16_N7ee627613barEv)();
extern void ABISELECT(_ZThn24_N7ee627613barEv,_ZThn16_N7ee627613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62761[0]),
  (VTBL_ENTRY)&_ZN7ee627613fooEv,
  (VTBL_ENTRY)&_ZN7ee627613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee627613fooEv,_ZTv0_n12_N7ee627613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee627613barEv,_ZTv0_n16_N7ee627613barEv),
};
extern VTBL_ENTRY _ZTV7ee62761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee62761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee62761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee62761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee62761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee62761[] = {
  {&(_ZTV7ee62761[3]),  3,11},
  {&(_tg__ZTV6dd2761__7ee62761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee62761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee62761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee62761[4]),  4,6},
  {&(_ZTV7ee62761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62761[];
extern  VTBL_ENTRY _ZTV7ee62761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62761[];
static VTBL_ENTRY alt_thunk_names884[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27613fooEv,_ZThn16_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee627613barEv,_ZTv0_n16_N7ee627613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee627613barEv,_ZThn16_N7ee627613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee627613fooEv,_ZTv0_n12_N7ee627613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee627613fooEv,_ZThn16_N7ee627613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62761 = {  "ee62761", // class name
  bases_ee62761, 4,
  &(vtc_ee62761[0]), // expected_vtbl_contents
  &(vtt_ee62761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names884,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72761  : virtual dd2761 {
  int e;
  virtual void  foo(); // _ZN7ee727613fooEv
  virtual void  bar(); // _ZN7ee727613barEv
  ~ee72761(); // tgen
  ee72761(); // tgen
};
//SIG(1 ee72761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72761 ::foo(){vfunc_called(this, "_ZN7ee727613fooEv");}
void  ee72761 ::bar(){vfunc_called(this, "_ZN7ee727613barEv");}
ee72761 ::~ee72761(){ note_dtor("ee72761", this);} // tgen
ee72761 ::ee72761(){ note_ctor("ee72761", this);} // tgen

static void Test_ee72761()
{
  extern Class_Descriptor cd_ee72761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72761, buf);
    ee72761 *dp, &lv = *(dp=new (buf) ee72761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee72761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd2761*), ABISELECT(32,20), "ee72761");
    check_base_class_offset(lv, (cc761*)(dd2761*), ABISELECT(16,8), "ee72761");
    check_base_class_offset(lv, (dd2761*), ABISELECT(16,8), "ee72761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72761.e");
    test_class_info(&lv, &cd_ee72761);
    dp->~ee72761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72761(Test_ee72761, "ee72761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72761C1Ev();
extern void _ZN7ee72761D1Ev();
Name_Map name_map_ee72761[] = {
  NSPAIR(_ZN7ee72761C1Ev),
  NSPAIR(_ZN7ee72761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd2761;
extern VTBL_ENTRY _ZTI6dd2761[];
extern  VTBL_ENTRY _ZTV6dd2761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2761[];
static Base_Class bases_ee72761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72761[];
extern void _ZN7ee727613fooEv();
extern void _ZN7ee727613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee727613fooEv,_ZTv0_n16_N7ee727613fooEv)();
extern void ABISELECT(_ZThn16_N7ee727613fooEv,_ZThn8_N7ee727613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee727613barEv,_ZTv0_n20_N7ee727613barEv)();
extern void ABISELECT(_ZThn16_N7ee727613barEv,_ZThn8_N7ee727613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee727613fooEv,_ZTv0_n12_N7ee727613fooEv)();
extern void ABISELECT(_ZThn32_N7ee727613fooEv,_ZThn20_N7ee727613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee727613barEv,_ZTv0_n16_N7ee727613barEv)();
extern void ABISELECT(_ZThn32_N7ee727613barEv,_ZThn20_N7ee727613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72761[0]),
  (VTBL_ENTRY)&_ZN7ee727613fooEv,
  (VTBL_ENTRY)&_ZN7ee727613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee727613fooEv,_ZTv0_n16_N7ee727613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee727613barEv,_ZTv0_n20_N7ee727613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee727613fooEv,_ZTv0_n12_N7ee727613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee727613barEv,_ZTv0_n16_N7ee727613barEv),
};
extern VTBL_ENTRY _ZTV7ee72761[];
extern void _ZN6dd27613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV6dd2761__7ee72761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&_ZN6dd27613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd2761__7ee72761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd2761__7ee72761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv)();
extern void ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd2761__7ee72761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee72761[] = {
  {&(_ZTV7ee72761[4]),  4,19},
  {&(_ZTV7ee72761[11]),  11,19},
  {&(_ZTV7ee72761[17]),  17,19},
  {&(_tg__ZTV6dd2761__7ee72761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd2761__7ee72761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd2761__7ee72761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd2761__7ee72761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72761[];
extern  VTBL_ENTRY _ZTV7ee72761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72761[];
static VTBL_ENTRY alt_thunk_names885[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27613fooEv,_ZTv0_n12_N6dd27613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27613fooEv,_ZThn12_N6dd27613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee727613barEv,_ZTv0_n16_N7ee727613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee727613barEv,_ZThn20_N7ee727613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee727613fooEv,_ZTv0_n12_N7ee727613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee727613fooEv,_ZThn20_N7ee727613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee727613barEv,_ZTv0_n20_N7ee727613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee727613barEv,_ZThn8_N7ee727613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee727613fooEv,_ZTv0_n16_N7ee727613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee727613fooEv,_ZThn8_N7ee727613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72761 = {  "ee72761", // class name
  bases_ee72761, 4,
  &(vtc_ee72761[0]), // expected_vtbl_contents
  &(vtt_ee72761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names885,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3761  : virtual cc761 {
  int d;
  virtual void  foo(); // _ZN6dd37613fooEv
  ~dd3761(); // tgen
  dd3761(); // tgen
};
//SIG(-1 dd3761) C1{ VBC2{ VBC3{ BC4{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd3761 ::foo(){vfunc_called(this, "_ZN6dd37613fooEv");}
dd3761 ::~dd3761(){ note_dtor("dd3761", this);} // tgen
dd3761 ::dd3761(){ note_ctor("dd3761", this);} // tgen

static void Test_dd3761()
{
  extern Class_Descriptor cd_dd3761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3761, buf);
    dd3761 *dp, &lv = *(dp=new (buf) dd3761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd3761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,16), "dd3761");
    check_base_class_offset(lv, (cc761*), ABISELECT(16,8), "dd3761");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3761.d");
    test_class_info(&lv, &cd_dd3761);
    dp->~dd3761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3761(Test_dd3761, "dd3761", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3761C1Ev();
extern void _ZN6dd3761D1Ev();
Name_Map name_map_dd3761[] = {
  NSPAIR(_ZN6dd3761C1Ev),
  NSPAIR(_ZN6dd3761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd3761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3761[];
extern void _ZN6dd37613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV6dd3761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd3761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd3761[] = {
  {&(_ZTV6dd3761[4]),  4,18},
  {&(_ZTV6dd3761[10]),  10,18},
  {&(_ZTV6dd3761[16]),  16,18},
  {&(_tg__ZTV5cc761__6dd3761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd3761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static VTBL_ENTRY alt_thunk_names886[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3761 = {  "dd3761", // class name
  bases_dd3761, 3,
  &(vtc_dd3761[0]), // expected_vtbl_contents
  &(vtt_dd3761[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3761),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names886,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03761  : dd3761 {
  int e;
  ~ee03761(); // tgen
  ee03761(); // tgen
};
//SIG(1 ee03761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee03761 ::~ee03761(){ note_dtor("ee03761", this);} // tgen
ee03761 ::ee03761(){ note_ctor("ee03761", this);} // tgen

static void Test_ee03761()
{
  extern Class_Descriptor cd_ee03761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03761, buf);
    ee03761 *dp, &lv = *(dp=new (buf) ee03761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee03761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee03761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(16,12), "ee03761");
    check_base_class_offset(lv, (dd3761*), 0, "ee03761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03761.e");
    test_class_info(&lv, &cd_ee03761);
    dp->~ee03761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03761(Test_ee03761, "ee03761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03761C1Ev();
extern void _ZN7ee03761D1Ev();
Name_Map name_map_ee03761[] = {
  NSPAIR(_ZN7ee03761C1Ev),
  NSPAIR(_ZN7ee03761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee03761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03761[];
extern void _ZN6dd37613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee03761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee03761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee03761[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee03761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee03761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee03761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee03761[] = {
  {&(_ZTV7ee03761[4]),  4,18},
  {&(_tg__ZTV6dd3761__7ee03761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee03761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee03761[4]),  4,6},
  {&(_ZTV7ee03761[10]),  10,18},
  {&(_ZTV7ee03761[16]),  16,18},
  {&(_tg__ZTV5cc761__7ee03761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee03761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03761[];
extern  VTBL_ENTRY _ZTV7ee03761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03761[];
static VTBL_ENTRY alt_thunk_names887[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03761 = {  "ee03761", // class name
  bases_ee03761, 4,
  &(vtc_ee03761[0]), // expected_vtbl_contents
  &(vtt_ee03761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names887,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13761  : virtual dd3761 {
  int e;
  ~ee13761(); // tgen
  ee13761(); // tgen
};
//SIG(1 ee13761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee13761 ::~ee13761(){ note_dtor("ee13761", this);} // tgen
ee13761 ::ee13761(){ note_ctor("ee13761", this);} // tgen

static void Test_ee13761()
{
  extern Class_Descriptor cd_ee13761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13761, buf);
    ee13761 *dp, &lv = *(dp=new (buf) ee13761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee13761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee13761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(32,16), "ee13761");
    check_base_class_offset(lv, (dd3761*), ABISELECT(16,8), "ee13761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13761.e");
    test_class_info(&lv, &cd_ee13761);
    dp->~ee13761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13761(Test_ee13761, "ee13761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13761C1Ev();
extern void _ZN7ee13761D1Ev();
Name_Map name_map_ee13761[] = {
  NSPAIR(_ZN7ee13761C1Ev),
  NSPAIR(_ZN7ee13761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee13761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13761[];
extern void _ZN6dd37613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13761[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee13761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee13761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee13761[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee13761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee13761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee13761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee13761[] = {
  {&(_ZTV7ee13761[5]),  5,24},
  {&(_ZTV7ee13761[10]),  10,24},
  {&(_ZTV7ee13761[16]),  16,24},
  {&(_ZTV7ee13761[22]),  22,24},
  {&(_tg__ZTV6dd3761__7ee13761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee13761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee13761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee13761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee13761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13761[];
extern  VTBL_ENTRY _ZTV7ee13761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13761[];
static VTBL_ENTRY alt_thunk_names888[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13761 = {  "ee13761", // class name
  bases_ee13761, 4,
  &(vtc_ee13761[0]), // expected_vtbl_contents
  &(vtt_ee13761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13761),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names888,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23761  : dd3761 {
  int e;
  virtual void  foo(); // _ZN7ee237613fooEv
  ~ee23761(); // tgen
  ee23761(); // tgen
};
//SIG(1 ee23761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee23761 ::foo(){vfunc_called(this, "_ZN7ee237613fooEv");}
ee23761 ::~ee23761(){ note_dtor("ee23761", this);} // tgen
ee23761 ::ee23761(){ note_ctor("ee23761", this);} // tgen

static void Test_ee23761()
{
  extern Class_Descriptor cd_ee23761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23761, buf);
    ee23761 *dp, &lv = *(dp=new (buf) ee23761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee23761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee23761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(16,12), "ee23761");
    check_base_class_offset(lv, (dd3761*), 0, "ee23761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23761.e");
    test_class_info(&lv, &cd_ee23761);
    dp->~ee23761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23761(Test_ee23761, "ee23761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23761C1Ev();
extern void _ZN7ee23761D1Ev();
Name_Map name_map_ee23761[] = {
  NSPAIR(_ZN7ee23761C1Ev),
  NSPAIR(_ZN7ee23761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee23761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23761[];
extern void _ZN7ee237613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee237613fooEv,_ZTv0_n16_N7ee237613fooEv)();
extern void ABISELECT(_ZThn16_N7ee237613fooEv,_ZThn12_N7ee237613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee237613fooEv,_ZTv0_n12_N7ee237613fooEv)();
extern void ABISELECT(_ZThn32_N7ee237613fooEv,_ZThn20_N7ee237613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23761[0]),
  (VTBL_ENTRY)&_ZN7ee237613fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee237613fooEv,_ZTv0_n16_N7ee237613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee237613fooEv,_ZTv0_n12_N7ee237613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee23761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee23761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee23761[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee23761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee23761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee23761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee23761[] = {
  {&(_ZTV7ee23761[4]),  4,18},
  {&(_tg__ZTV6dd3761__7ee23761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee23761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee23761[4]),  4,6},
  {&(_ZTV7ee23761[10]),  10,18},
  {&(_ZTV7ee23761[16]),  16,18},
  {&(_tg__ZTV5cc761__7ee23761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee23761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23761[];
extern  VTBL_ENTRY _ZTV7ee23761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23761[];
static VTBL_ENTRY alt_thunk_names889[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee237613fooEv,_ZTv0_n12_N7ee237613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee237613fooEv,_ZThn20_N7ee237613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee237613fooEv,_ZTv0_n16_N7ee237613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee237613fooEv,_ZThn12_N7ee237613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23761 = {  "ee23761", // class name
  bases_ee23761, 4,
  &(vtc_ee23761[0]), // expected_vtbl_contents
  &(vtt_ee23761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names889,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33761  : virtual dd3761 {
  int e;
  virtual void  foo(); // _ZN7ee337613fooEv
  ~ee33761(); // tgen
  ee33761(); // tgen
};
//SIG(1 ee33761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee33761 ::foo(){vfunc_called(this, "_ZN7ee337613fooEv");}
ee33761 ::~ee33761(){ note_dtor("ee33761", this);} // tgen
ee33761 ::ee33761(){ note_ctor("ee33761", this);} // tgen

static void Test_ee33761()
{
  extern Class_Descriptor cd_ee33761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33761, buf);
    ee33761 *dp, &lv = *(dp=new (buf) ee33761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee33761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee33761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(32,16), "ee33761");
    check_base_class_offset(lv, (dd3761*), ABISELECT(16,8), "ee33761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33761.e");
    test_class_info(&lv, &cd_ee33761);
    dp->~ee33761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33761(Test_ee33761, "ee33761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33761C1Ev();
extern void _ZN7ee33761D1Ev();
Name_Map name_map_ee33761[] = {
  NSPAIR(_ZN7ee33761C1Ev),
  NSPAIR(_ZN7ee33761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee33761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33761[];
extern void _ZN7ee337613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee337613fooEv,_ZTv0_n20_N7ee337613fooEv)();
extern void ABISELECT(_ZThn16_N7ee337613fooEv,_ZThn8_N7ee337613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee337613fooEv,_ZTv0_n16_N7ee337613fooEv)();
extern void ABISELECT(_ZThn32_N7ee337613fooEv,_ZThn16_N7ee337613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee337613fooEv,_ZTv0_n12_N7ee337613fooEv)();
extern void ABISELECT(_ZThn48_N7ee337613fooEv,_ZThn24_N7ee337613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33761[0]),
  (VTBL_ENTRY)&_ZN7ee337613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee337613fooEv,_ZTv0_n20_N7ee337613fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee337613fooEv,_ZTv0_n16_N7ee337613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee337613fooEv,_ZTv0_n12_N7ee337613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern VTBL_ENTRY _ZTV7ee33761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee33761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee33761[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee33761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee33761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee33761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee33761[] = {
  {&(_ZTV7ee33761[5]),  5,25},
  {&(_ZTV7ee33761[11]),  11,25},
  {&(_ZTV7ee33761[17]),  17,25},
  {&(_ZTV7ee33761[23]),  23,25},
  {&(_tg__ZTV6dd3761__7ee33761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee33761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee33761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee33761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee33761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33761[];
extern  VTBL_ENTRY _ZTV7ee33761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33761[];
static VTBL_ENTRY alt_thunk_names890[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee337613fooEv,_ZTv0_n12_N7ee337613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee337613fooEv,_ZThn24_N7ee337613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee337613fooEv,_ZTv0_n16_N7ee337613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee337613fooEv,_ZThn16_N7ee337613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee337613fooEv,_ZTv0_n20_N7ee337613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee337613fooEv,_ZThn8_N7ee337613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33761 = {  "ee33761", // class name
  bases_ee33761, 4,
  &(vtc_ee33761[0]), // expected_vtbl_contents
  &(vtt_ee33761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33761),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names890,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43761  : dd3761 {
  int e;
  virtual void  bar(); // _ZN7ee437613barEv
  ~ee43761(); // tgen
  ee43761(); // tgen
};
//SIG(1 ee43761) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee43761 ::bar(){vfunc_called(this, "_ZN7ee437613barEv");}
ee43761 ::~ee43761(){ note_dtor("ee43761", this);} // tgen
ee43761 ::ee43761(){ note_ctor("ee43761", this);} // tgen

static void Test_ee43761()
{
  extern Class_Descriptor cd_ee43761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43761, buf);
    ee43761 *dp, &lv = *(dp=new (buf) ee43761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee43761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee43761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(16,12), "ee43761");
    check_base_class_offset(lv, (dd3761*), 0, "ee43761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43761.e");
    test_class_info(&lv, &cd_ee43761);
    dp->~ee43761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43761(Test_ee43761, "ee43761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43761C1Ev();
extern void _ZN7ee43761D1Ev();
Name_Map name_map_ee43761[] = {
  NSPAIR(_ZN7ee43761C1Ev),
  NSPAIR(_ZN7ee43761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee43761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43761[];
extern void _ZN6dd37613fooEv();
extern void _ZN7ee437613barEv();
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee437613barEv,_ZTv0_n20_N7ee437613barEv)();
extern void ABISELECT(_ZThn16_N7ee437613barEv,_ZThn12_N7ee437613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee437613barEv,_ZTv0_n16_N7ee437613barEv)();
extern void ABISELECT(_ZThn32_N7ee437613barEv,_ZThn20_N7ee437613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
  (VTBL_ENTRY)&_ZN7ee437613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee437613barEv,_ZTv0_n20_N7ee437613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee437613barEv,_ZTv0_n16_N7ee437613barEv),
};
extern VTBL_ENTRY _ZTV7ee43761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee43761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee43761[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee43761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee43761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee43761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee43761[] = {
  {&(_ZTV7ee43761[4]),  4,19},
  {&(_tg__ZTV6dd3761__7ee43761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee43761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee43761[4]),  4,6},
  {&(_ZTV7ee43761[11]),  11,19},
  {&(_ZTV7ee43761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee43761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee43761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43761[];
extern  VTBL_ENTRY _ZTV7ee43761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43761[];
static VTBL_ENTRY alt_thunk_names891[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee437613barEv,_ZTv0_n16_N7ee437613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee437613barEv,_ZThn20_N7ee437613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee437613barEv,_ZTv0_n20_N7ee437613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee437613barEv,_ZThn12_N7ee437613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43761 = {  "ee43761", // class name
  bases_ee43761, 4,
  &(vtc_ee43761[0]), // expected_vtbl_contents
  &(vtt_ee43761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names891,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53761  : virtual dd3761 {
  int e;
  virtual void  bar(); // _ZN7ee537613barEv
  ~ee53761(); // tgen
  ee53761(); // tgen
};
//SIG(1 ee53761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee53761 ::bar(){vfunc_called(this, "_ZN7ee537613barEv");}
ee53761 ::~ee53761(){ note_dtor("ee53761", this);} // tgen
ee53761 ::ee53761(){ note_ctor("ee53761", this);} // tgen

static void Test_ee53761()
{
  extern Class_Descriptor cd_ee53761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53761, buf);
    ee53761 *dp, &lv = *(dp=new (buf) ee53761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee53761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee53761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(32,16), "ee53761");
    check_base_class_offset(lv, (dd3761*), ABISELECT(16,8), "ee53761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53761.e");
    test_class_info(&lv, &cd_ee53761);
    dp->~ee53761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53761(Test_ee53761, "ee53761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53761C1Ev();
extern void _ZN7ee53761D1Ev();
Name_Map name_map_ee53761[] = {
  NSPAIR(_ZN7ee53761C1Ev),
  NSPAIR(_ZN7ee53761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee53761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53761[];
extern void _ZN7ee537613barEv();
extern void _ZN6dd37613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee537613barEv,_ZTv0_n20_N7ee537613barEv)();
extern void ABISELECT(_ZThn32_N7ee537613barEv,_ZThn16_N7ee537613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee537613barEv,_ZTv0_n16_N7ee537613barEv)();
extern void ABISELECT(_ZThn48_N7ee537613barEv,_ZThn24_N7ee537613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53761[0]),
  (VTBL_ENTRY)&_ZN7ee537613barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee537613barEv,_ZTv0_n20_N7ee537613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee537613barEv,_ZTv0_n16_N7ee537613barEv),
};
extern VTBL_ENTRY _ZTV7ee53761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee53761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee53761[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee53761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee53761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee53761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee53761[] = {
  {&(_ZTV7ee53761[5]),  5,25},
  {&(_ZTV7ee53761[11]),  11,25},
  {&(_ZTV7ee53761[17]),  17,25},
  {&(_ZTV7ee53761[23]),  23,25},
  {&(_tg__ZTV6dd3761__7ee53761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee53761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee53761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee53761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee53761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53761[];
extern  VTBL_ENTRY _ZTV7ee53761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53761[];
static VTBL_ENTRY alt_thunk_names892[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee537613barEv,_ZTv0_n16_N7ee537613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee537613barEv,_ZThn24_N7ee537613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee537613barEv,_ZTv0_n20_N7ee537613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee537613barEv,_ZThn16_N7ee537613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53761 = {  "ee53761", // class name
  bases_ee53761, 4,
  &(vtc_ee53761[0]), // expected_vtbl_contents
  &(vtt_ee53761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53761),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names892,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63761  : dd3761 {
  int e;
  virtual void  foo(); // _ZN7ee637613fooEv
  virtual void  bar(); // _ZN7ee637613barEv
  ~ee63761(); // tgen
  ee63761(); // tgen
};
//SIG(1 ee63761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63761 ::foo(){vfunc_called(this, "_ZN7ee637613fooEv");}
void  ee63761 ::bar(){vfunc_called(this, "_ZN7ee637613barEv");}
ee63761 ::~ee63761(){ note_dtor("ee63761", this);} // tgen
ee63761 ::ee63761(){ note_ctor("ee63761", this);} // tgen

static void Test_ee63761()
{
  extern Class_Descriptor cd_ee63761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63761, buf);
    ee63761 *dp, &lv = *(dp=new (buf) ee63761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee63761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee63761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(16,12), "ee63761");
    check_base_class_offset(lv, (dd3761*), 0, "ee63761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63761.e");
    test_class_info(&lv, &cd_ee63761);
    dp->~ee63761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63761(Test_ee63761, "ee63761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63761C1Ev();
extern void _ZN7ee63761D1Ev();
Name_Map name_map_ee63761[] = {
  NSPAIR(_ZN7ee63761C1Ev),
  NSPAIR(_ZN7ee63761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee63761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63761[];
extern void _ZN7ee637613fooEv();
extern void _ZN7ee637613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee637613fooEv,_ZTv0_n16_N7ee637613fooEv)();
extern void ABISELECT(_ZThn16_N7ee637613fooEv,_ZThn12_N7ee637613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee637613barEv,_ZTv0_n20_N7ee637613barEv)();
extern void ABISELECT(_ZThn16_N7ee637613barEv,_ZThn12_N7ee637613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee637613fooEv,_ZTv0_n12_N7ee637613fooEv)();
extern void ABISELECT(_ZThn32_N7ee637613fooEv,_ZThn20_N7ee637613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee637613barEv,_ZTv0_n16_N7ee637613barEv)();
extern void ABISELECT(_ZThn32_N7ee637613barEv,_ZThn20_N7ee637613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63761[0]),
  (VTBL_ENTRY)&_ZN7ee637613fooEv,
  (VTBL_ENTRY)&_ZN7ee637613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee637613fooEv,_ZTv0_n16_N7ee637613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee637613barEv,_ZTv0_n20_N7ee637613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee637613fooEv,_ZTv0_n12_N7ee637613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee637613barEv,_ZTv0_n16_N7ee637613barEv),
};
extern VTBL_ENTRY _ZTV7ee63761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee63761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee63761[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee63761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee63761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee63761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee63761[] = {
  {&(_ZTV7ee63761[4]),  4,19},
  {&(_tg__ZTV6dd3761__7ee63761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee63761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee63761[4]),  4,6},
  {&(_ZTV7ee63761[11]),  11,19},
  {&(_ZTV7ee63761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee63761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee63761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63761[];
extern  VTBL_ENTRY _ZTV7ee63761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63761[];
static VTBL_ENTRY alt_thunk_names893[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn20_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn12_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee637613barEv,_ZTv0_n16_N7ee637613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee637613barEv,_ZThn20_N7ee637613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee637613fooEv,_ZTv0_n12_N7ee637613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee637613fooEv,_ZThn20_N7ee637613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee637613barEv,_ZTv0_n20_N7ee637613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee637613barEv,_ZThn12_N7ee637613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee637613fooEv,_ZTv0_n16_N7ee637613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee637613fooEv,_ZThn12_N7ee637613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63761 = {  "ee63761", // class name
  bases_ee63761, 4,
  &(vtc_ee63761[0]), // expected_vtbl_contents
  &(vtt_ee63761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names893,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73761  : virtual dd3761 {
  int e;
  virtual void  foo(); // _ZN7ee737613fooEv
  virtual void  bar(); // _ZN7ee737613barEv
  ~ee73761(); // tgen
  ee73761(); // tgen
};
//SIG(1 ee73761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73761 ::foo(){vfunc_called(this, "_ZN7ee737613fooEv");}
void  ee73761 ::bar(){vfunc_called(this, "_ZN7ee737613barEv");}
ee73761 ::~ee73761(){ note_dtor("ee73761", this);} // tgen
ee73761 ::ee73761(){ note_ctor("ee73761", this);} // tgen

static void Test_ee73761()
{
  extern Class_Descriptor cd_ee73761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73761, buf);
    ee73761 *dp, &lv = *(dp=new (buf) ee73761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee73761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee73761");
    check_base_class_offset(lv, (cc761*)(dd3761*), ABISELECT(32,16), "ee73761");
    check_base_class_offset(lv, (dd3761*), ABISELECT(16,8), "ee73761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73761.e");
    test_class_info(&lv, &cd_ee73761);
    dp->~ee73761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73761(Test_ee73761, "ee73761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73761C1Ev();
extern void _ZN7ee73761D1Ev();
Name_Map name_map_ee73761[] = {
  NSPAIR(_ZN7ee73761C1Ev),
  NSPAIR(_ZN7ee73761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd3761;
extern VTBL_ENTRY _ZTI6dd3761[];
extern  VTBL_ENTRY _ZTV6dd3761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3761[];
static Base_Class bases_ee73761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3761,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73761[];
extern void _ZN7ee737613fooEv();
extern void _ZN7ee737613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee737613fooEv,_ZTv0_n20_N7ee737613fooEv)();
extern void ABISELECT(_ZThn16_N7ee737613fooEv,_ZThn8_N7ee737613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee737613fooEv,_ZTv0_n16_N7ee737613fooEv)();
extern void ABISELECT(_ZThn32_N7ee737613fooEv,_ZThn16_N7ee737613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee737613barEv,_ZTv0_n20_N7ee737613barEv)();
extern void ABISELECT(_ZThn32_N7ee737613barEv,_ZThn16_N7ee737613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee737613fooEv,_ZTv0_n12_N7ee737613fooEv)();
extern void ABISELECT(_ZThn48_N7ee737613fooEv,_ZThn24_N7ee737613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee737613barEv,_ZTv0_n16_N7ee737613barEv)();
extern void ABISELECT(_ZThn48_N7ee737613barEv,_ZThn24_N7ee737613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73761[0]),
  (VTBL_ENTRY)&_ZN7ee737613fooEv,
  (VTBL_ENTRY)&_ZN7ee737613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee737613fooEv,_ZTv0_n20_N7ee737613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee737613fooEv,_ZTv0_n16_N7ee737613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee737613barEv,_ZTv0_n20_N7ee737613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee737613fooEv,_ZTv0_n12_N7ee737613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee737613barEv,_ZTv0_n16_N7ee737613barEv),
};
extern VTBL_ENTRY _ZTV7ee73761[];
extern void _ZN6dd37613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3761__7ee73761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&_ZN6dd37613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv)();
extern void ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv)() __attribute__((weak));
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd3761__7ee73761[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv),
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv)();
extern void ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd3761__7ee73761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee73761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee73761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee73761[] = {
  {&(_ZTV7ee73761[5]),  5,26},
  {&(_ZTV7ee73761[12]),  12,26},
  {&(_ZTV7ee73761[18]),  18,26},
  {&(_ZTV7ee73761[24]),  24,26},
  {&(_tg__ZTV6dd3761__7ee73761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd3761__7ee73761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd3761__7ee73761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee73761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee73761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73761[];
extern  VTBL_ENTRY _ZTV7ee73761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73761[];
static VTBL_ENTRY alt_thunk_names894[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37613fooEv,_ZTv0_n12_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37613fooEv,_ZThn16_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37613fooEv,_ZTv0_n16_N6dd37613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37613fooEv,_ZThn8_N6dd37613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee737613barEv,_ZTv0_n16_N7ee737613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee737613barEv,_ZThn24_N7ee737613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee737613fooEv,_ZTv0_n12_N7ee737613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee737613fooEv,_ZThn24_N7ee737613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee737613barEv,_ZTv0_n20_N7ee737613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee737613barEv,_ZThn16_N7ee737613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee737613fooEv,_ZTv0_n16_N7ee737613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee737613fooEv,_ZThn16_N7ee737613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee737613fooEv,_ZTv0_n20_N7ee737613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee737613fooEv,_ZThn8_N7ee737613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73761 = {  "ee73761", // class name
  bases_ee73761, 4,
  &(vtc_ee73761[0]), // expected_vtbl_contents
  &(vtt_ee73761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73761),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names894,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4761  : cc761 {
  int d;
  virtual void  bar(); // _ZN6dd47613barEv
  ~dd4761(); // tgen
  dd4761(); // tgen
};
//SIG(-1 dd4761) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd4761 ::bar(){vfunc_called(this, "_ZN6dd47613barEv");}
dd4761 ::~dd4761(){ note_dtor("dd4761", this);} // tgen
dd4761 ::dd4761(){ note_ctor("dd4761", this);} // tgen

static void Test_dd4761()
{
  extern Class_Descriptor cd_dd4761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4761, buf);
    dd4761 *dp, &lv = *(dp=new (buf) dd4761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd4761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(16,12), "dd4761");
    check_base_class_offset(lv, (cc761*), 0, "dd4761");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4761.d");
    test_class_info(&lv, &cd_dd4761);
    dp->~dd4761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4761(Test_dd4761, "dd4761", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4761C1Ev();
extern void _ZN6dd4761D1Ev();
Name_Map name_map_dd4761[] = {
  NSPAIR(_ZN6dd4761C1Ev),
  NSPAIR(_ZN6dd4761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd4761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
extern VTBL_ENTRY _ZTV6dd4761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd4761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd4761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd4761[] = {
  {&(_ZTV6dd4761[3]),  3,11},
  {&(_tg__ZTV5cc761__6dd4761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd4761[4]),  4,6},
  {&(_ZTV6dd4761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static VTBL_ENTRY alt_thunk_names895[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4761 = {  "dd4761", // class name
  bases_dd4761, 3,
  &(vtc_dd4761[0]), // expected_vtbl_contents
  &(vtt_dd4761[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4761),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names895,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04761  : dd4761 {
  int e;
  ~ee04761(); // tgen
  ee04761(); // tgen
};
//SIG(1 ee04761) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee04761 ::~ee04761(){ note_dtor("ee04761", this);} // tgen
ee04761 ::ee04761(){ note_ctor("ee04761", this);} // tgen

static void Test_ee04761()
{
  extern Class_Descriptor cd_ee04761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04761, buf);
    ee04761 *dp, &lv = *(dp=new (buf) ee04761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee04761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(24,16), "ee04761");
    check_base_class_offset(lv, (cc761*)(dd4761*), 0, "ee04761");
    check_base_class_offset(lv, (dd4761*), 0, "ee04761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04761.e");
    test_class_info(&lv, &cd_ee04761);
    dp->~ee04761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04761(Test_ee04761, "ee04761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04761C1Ev();
extern void _ZN7ee04761D1Ev();
Name_Map name_map_ee04761[] = {
  NSPAIR(_ZN7ee04761C1Ev),
  NSPAIR(_ZN7ee04761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee04761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
extern VTBL_ENTRY _ZTV7ee04761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee04761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee04761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee04761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee04761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee04761[] = {
  {&(_ZTV7ee04761[3]),  3,11},
  {&(_tg__ZTV6dd4761__7ee04761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee04761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee04761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee04761[4]),  4,6},
  {&(_ZTV7ee04761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee04761[];
extern  VTBL_ENTRY _ZTV7ee04761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04761[];
static VTBL_ENTRY alt_thunk_names896[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04761 = {  "ee04761", // class name
  bases_ee04761, 4,
  &(vtc_ee04761[0]), // expected_vtbl_contents
  &(vtt_ee04761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names896,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14761  : virtual dd4761 {
  int e;
  ~ee14761(); // tgen
  ee14761(); // tgen
};
//SIG(1 ee14761) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee14761 ::~ee14761(){ note_dtor("ee14761", this);} // tgen
ee14761 ::ee14761(){ note_ctor("ee14761", this);} // tgen

static void Test_ee14761()
{
  extern Class_Descriptor cd_ee14761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14761, buf);
    ee14761 *dp, &lv = *(dp=new (buf) ee14761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee14761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(32,20), "ee14761");
    check_base_class_offset(lv, (cc761*)(dd4761*), ABISELECT(16,8), "ee14761");
    check_base_class_offset(lv, (dd4761*), ABISELECT(16,8), "ee14761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14761.e");
    test_class_info(&lv, &cd_ee14761);
    dp->~ee14761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14761(Test_ee14761, "ee14761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14761C1Ev();
extern void _ZN7ee14761D1Ev();
Name_Map name_map_ee14761[] = {
  NSPAIR(_ZN7ee14761C1Ev),
  NSPAIR(_ZN7ee14761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee14761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14761[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
extern VTBL_ENTRY _ZTV7ee14761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee14761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee14761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee14761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee14761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee14761[] = {
  {&(_ZTV7ee14761[4]),  4,17},
  {&(_ZTV7ee14761[9]),  9,17},
  {&(_ZTV7ee14761[15]),  15,17},
  {&(_tg__ZTV6dd4761__7ee14761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee14761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee14761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee14761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14761[];
extern  VTBL_ENTRY _ZTV7ee14761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14761[];
static VTBL_ENTRY alt_thunk_names897[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14761 = {  "ee14761", // class name
  bases_ee14761, 4,
  &(vtc_ee14761[0]), // expected_vtbl_contents
  &(vtt_ee14761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14761),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names897,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24761  : dd4761 {
  int e;
  virtual void  foo(); // _ZN7ee247613fooEv
  ~ee24761(); // tgen
  ee24761(); // tgen
};
//SIG(1 ee24761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee24761 ::foo(){vfunc_called(this, "_ZN7ee247613fooEv");}
ee24761 ::~ee24761(){ note_dtor("ee24761", this);} // tgen
ee24761 ::ee24761(){ note_ctor("ee24761", this);} // tgen

static void Test_ee24761()
{
  extern Class_Descriptor cd_ee24761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24761, buf);
    ee24761 *dp, &lv = *(dp=new (buf) ee24761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee24761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(24,16), "ee24761");
    check_base_class_offset(lv, (cc761*)(dd4761*), 0, "ee24761");
    check_base_class_offset(lv, (dd4761*), 0, "ee24761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24761.e");
    test_class_info(&lv, &cd_ee24761);
    dp->~ee24761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24761(Test_ee24761, "ee24761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24761C1Ev();
extern void _ZN7ee24761D1Ev();
Name_Map name_map_ee24761[] = {
  NSPAIR(_ZN7ee24761C1Ev),
  NSPAIR(_ZN7ee24761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee24761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24761[];
extern void _ZN7ee247613fooEv();
extern void _ZN6dd47613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee247613fooEv,_ZTv0_n12_N7ee247613fooEv)();
extern void ABISELECT(_ZThn24_N7ee247613fooEv,_ZThn16_N7ee247613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24761[0]),
  (VTBL_ENTRY)&_ZN7ee247613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee247613fooEv,_ZTv0_n12_N7ee247613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
extern VTBL_ENTRY _ZTV7ee24761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee24761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee24761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee24761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee24761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee24761[] = {
  {&(_ZTV7ee24761[3]),  3,11},
  {&(_tg__ZTV6dd4761__7ee24761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee24761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee24761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee24761[4]),  4,6},
  {&(_ZTV7ee24761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24761[];
extern  VTBL_ENTRY _ZTV7ee24761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24761[];
static VTBL_ENTRY alt_thunk_names898[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee247613fooEv,_ZTv0_n12_N7ee247613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee247613fooEv,_ZThn16_N7ee247613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24761 = {  "ee24761", // class name
  bases_ee24761, 4,
  &(vtc_ee24761[0]), // expected_vtbl_contents
  &(vtt_ee24761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names898,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34761  : virtual dd4761 {
  int e;
  virtual void  foo(); // _ZN7ee347613fooEv
  ~ee34761(); // tgen
  ee34761(); // tgen
};
//SIG(1 ee34761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee34761 ::foo(){vfunc_called(this, "_ZN7ee347613fooEv");}
ee34761 ::~ee34761(){ note_dtor("ee34761", this);} // tgen
ee34761 ::ee34761(){ note_ctor("ee34761", this);} // tgen

static void Test_ee34761()
{
  extern Class_Descriptor cd_ee34761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34761, buf);
    ee34761 *dp, &lv = *(dp=new (buf) ee34761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee34761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(32,20), "ee34761");
    check_base_class_offset(lv, (cc761*)(dd4761*), ABISELECT(16,8), "ee34761");
    check_base_class_offset(lv, (dd4761*), ABISELECT(16,8), "ee34761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34761.e");
    test_class_info(&lv, &cd_ee34761);
    dp->~ee34761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34761(Test_ee34761, "ee34761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34761C1Ev();
extern void _ZN7ee34761D1Ev();
Name_Map name_map_ee34761[] = {
  NSPAIR(_ZN7ee34761C1Ev),
  NSPAIR(_ZN7ee34761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee34761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34761[];
extern void _ZN7ee347613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee347613fooEv,_ZTv0_n16_N7ee347613fooEv)();
extern void ABISELECT(_ZThn16_N7ee347613fooEv,_ZThn8_N7ee347613fooEv)() __attribute__((weak));
extern void _ZN6dd47613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee347613fooEv,_ZTv0_n12_N7ee347613fooEv)();
extern void ABISELECT(_ZThn32_N7ee347613fooEv,_ZThn20_N7ee347613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34761[0]),
  (VTBL_ENTRY)&_ZN7ee347613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee347613fooEv,_ZTv0_n16_N7ee347613fooEv),
  (VTBL_ENTRY)&_ZN6dd47613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee347613fooEv,_ZTv0_n12_N7ee347613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
extern VTBL_ENTRY _ZTV7ee34761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee34761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee34761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee34761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee34761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee34761[] = {
  {&(_ZTV7ee34761[4]),  4,18},
  {&(_ZTV7ee34761[10]),  10,18},
  {&(_ZTV7ee34761[16]),  16,18},
  {&(_tg__ZTV6dd4761__7ee34761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee34761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee34761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee34761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34761[];
extern  VTBL_ENTRY _ZTV7ee34761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34761[];
static VTBL_ENTRY alt_thunk_names899[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee347613fooEv,_ZTv0_n12_N7ee347613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee347613fooEv,_ZThn20_N7ee347613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee347613fooEv,_ZTv0_n16_N7ee347613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee347613fooEv,_ZThn8_N7ee347613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34761 = {  "ee34761", // class name
  bases_ee34761, 4,
  &(vtc_ee34761[0]), // expected_vtbl_contents
  &(vtt_ee34761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names899,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44761  : dd4761 {
  int e;
  virtual void  bar(); // _ZN7ee447613barEv
  ~ee44761(); // tgen
  ee44761(); // tgen
};
//SIG(1 ee44761) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee44761 ::bar(){vfunc_called(this, "_ZN7ee447613barEv");}
ee44761 ::~ee44761(){ note_dtor("ee44761", this);} // tgen
ee44761 ::ee44761(){ note_ctor("ee44761", this);} // tgen

static void Test_ee44761()
{
  extern Class_Descriptor cd_ee44761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44761, buf);
    ee44761 *dp, &lv = *(dp=new (buf) ee44761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee44761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(24,16), "ee44761");
    check_base_class_offset(lv, (cc761*)(dd4761*), 0, "ee44761");
    check_base_class_offset(lv, (dd4761*), 0, "ee44761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44761.e");
    test_class_info(&lv, &cd_ee44761);
    dp->~ee44761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44761(Test_ee44761, "ee44761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44761C1Ev();
extern void _ZN7ee44761D1Ev();
Name_Map name_map_ee44761[] = {
  NSPAIR(_ZN7ee44761C1Ev),
  NSPAIR(_ZN7ee44761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee44761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44761[];
extern void _ZN5cc7613fooEv();
extern void _ZN7ee447613barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee447613barEv,_ZTv0_n16_N7ee447613barEv)();
extern void ABISELECT(_ZThn24_N7ee447613barEv,_ZThn16_N7ee447613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN7ee447613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee447613barEv,_ZTv0_n16_N7ee447613barEv),
};
extern VTBL_ENTRY _ZTV7ee44761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee44761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee44761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee44761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee44761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee44761[] = {
  {&(_ZTV7ee44761[3]),  3,11},
  {&(_tg__ZTV6dd4761__7ee44761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee44761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee44761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee44761[4]),  4,6},
  {&(_ZTV7ee44761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee44761[];
extern  VTBL_ENTRY _ZTV7ee44761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44761[];
static VTBL_ENTRY alt_thunk_names900[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee447613barEv,_ZTv0_n16_N7ee447613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee447613barEv,_ZThn16_N7ee447613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44761 = {  "ee44761", // class name
  bases_ee44761, 4,
  &(vtc_ee44761[0]), // expected_vtbl_contents
  &(vtt_ee44761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names900,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54761  : virtual dd4761 {
  int e;
  virtual void  bar(); // _ZN7ee547613barEv
  ~ee54761(); // tgen
  ee54761(); // tgen
};
//SIG(1 ee54761) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee54761 ::bar(){vfunc_called(this, "_ZN7ee547613barEv");}
ee54761 ::~ee54761(){ note_dtor("ee54761", this);} // tgen
ee54761 ::ee54761(){ note_ctor("ee54761", this);} // tgen

static void Test_ee54761()
{
  extern Class_Descriptor cd_ee54761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54761, buf);
    ee54761 *dp, &lv = *(dp=new (buf) ee54761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee54761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(32,20), "ee54761");
    check_base_class_offset(lv, (cc761*)(dd4761*), ABISELECT(16,8), "ee54761");
    check_base_class_offset(lv, (dd4761*), ABISELECT(16,8), "ee54761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54761.e");
    test_class_info(&lv, &cd_ee54761);
    dp->~ee54761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54761(Test_ee54761, "ee54761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54761C1Ev();
extern void _ZN7ee54761D1Ev();
Name_Map name_map_ee54761[] = {
  NSPAIR(_ZN7ee54761C1Ev),
  NSPAIR(_ZN7ee54761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee54761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54761[];
extern void _ZN7ee547613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee547613barEv,_ZTv0_n20_N7ee547613barEv)();
extern void ABISELECT(_ZThn16_N7ee547613barEv,_ZThn8_N7ee547613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee547613barEv,_ZTv0_n16_N7ee547613barEv)();
extern void ABISELECT(_ZThn32_N7ee547613barEv,_ZThn20_N7ee547613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54761[0]),
  (VTBL_ENTRY)&_ZN7ee547613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee547613barEv,_ZTv0_n20_N7ee547613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee547613barEv,_ZTv0_n16_N7ee547613barEv),
};
extern VTBL_ENTRY _ZTV7ee54761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee54761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee54761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee54761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee54761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee54761[] = {
  {&(_ZTV7ee54761[4]),  4,18},
  {&(_ZTV7ee54761[10]),  10,18},
  {&(_ZTV7ee54761[16]),  16,18},
  {&(_tg__ZTV6dd4761__7ee54761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee54761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee54761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee54761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54761[];
extern  VTBL_ENTRY _ZTV7ee54761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54761[];
static VTBL_ENTRY alt_thunk_names901[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee547613barEv,_ZTv0_n16_N7ee547613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee547613barEv,_ZThn20_N7ee547613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee547613barEv,_ZTv0_n20_N7ee547613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee547613barEv,_ZThn8_N7ee547613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54761 = {  "ee54761", // class name
  bases_ee54761, 4,
  &(vtc_ee54761[0]), // expected_vtbl_contents
  &(vtt_ee54761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names901,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64761  : dd4761 {
  int e;
  virtual void  foo(); // _ZN7ee647613fooEv
  virtual void  bar(); // _ZN7ee647613barEv
  ~ee64761(); // tgen
  ee64761(); // tgen
};
//SIG(1 ee64761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64761 ::foo(){vfunc_called(this, "_ZN7ee647613fooEv");}
void  ee64761 ::bar(){vfunc_called(this, "_ZN7ee647613barEv");}
ee64761 ::~ee64761(){ note_dtor("ee64761", this);} // tgen
ee64761 ::ee64761(){ note_ctor("ee64761", this);} // tgen

static void Test_ee64761()
{
  extern Class_Descriptor cd_ee64761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64761, buf);
    ee64761 *dp, &lv = *(dp=new (buf) ee64761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee64761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(24,16), "ee64761");
    check_base_class_offset(lv, (cc761*)(dd4761*), 0, "ee64761");
    check_base_class_offset(lv, (dd4761*), 0, "ee64761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64761.e");
    test_class_info(&lv, &cd_ee64761);
    dp->~ee64761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64761(Test_ee64761, "ee64761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64761C1Ev();
extern void _ZN7ee64761D1Ev();
Name_Map name_map_ee64761[] = {
  NSPAIR(_ZN7ee64761C1Ev),
  NSPAIR(_ZN7ee64761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee64761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64761[];
extern void _ZN7ee647613fooEv();
extern void _ZN7ee647613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee647613fooEv,_ZTv0_n12_N7ee647613fooEv)();
extern void ABISELECT(_ZThn24_N7ee647613fooEv,_ZThn16_N7ee647613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee647613barEv,_ZTv0_n16_N7ee647613barEv)();
extern void ABISELECT(_ZThn24_N7ee647613barEv,_ZThn16_N7ee647613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64761[0]),
  (VTBL_ENTRY)&_ZN7ee647613fooEv,
  (VTBL_ENTRY)&_ZN7ee647613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee647613fooEv,_ZTv0_n12_N7ee647613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee647613barEv,_ZTv0_n16_N7ee647613barEv),
};
extern VTBL_ENTRY _ZTV7ee64761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee64761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee64761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee64761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee64761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee64761[] = {
  {&(_ZTV7ee64761[3]),  3,11},
  {&(_tg__ZTV6dd4761__7ee64761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee64761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee64761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee64761[4]),  4,6},
  {&(_ZTV7ee64761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64761[];
extern  VTBL_ENTRY _ZTV7ee64761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64761[];
static VTBL_ENTRY alt_thunk_names902[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47613barEv,_ZThn16_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee647613barEv,_ZTv0_n16_N7ee647613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee647613barEv,_ZThn16_N7ee647613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee647613fooEv,_ZTv0_n12_N7ee647613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee647613fooEv,_ZThn16_N7ee647613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64761 = {  "ee64761", // class name
  bases_ee64761, 4,
  &(vtc_ee64761[0]), // expected_vtbl_contents
  &(vtt_ee64761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names902,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74761  : virtual dd4761 {
  int e;
  virtual void  foo(); // _ZN7ee747613fooEv
  virtual void  bar(); // _ZN7ee747613barEv
  ~ee74761(); // tgen
  ee74761(); // tgen
};
//SIG(1 ee74761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74761 ::foo(){vfunc_called(this, "_ZN7ee747613fooEv");}
void  ee74761 ::bar(){vfunc_called(this, "_ZN7ee747613barEv");}
ee74761 ::~ee74761(){ note_dtor("ee74761", this);} // tgen
ee74761 ::ee74761(){ note_ctor("ee74761", this);} // tgen

static void Test_ee74761()
{
  extern Class_Descriptor cd_ee74761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74761, buf);
    ee74761 *dp, &lv = *(dp=new (buf) ee74761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee74761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd4761*), ABISELECT(32,20), "ee74761");
    check_base_class_offset(lv, (cc761*)(dd4761*), ABISELECT(16,8), "ee74761");
    check_base_class_offset(lv, (dd4761*), ABISELECT(16,8), "ee74761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74761.e");
    test_class_info(&lv, &cd_ee74761);
    dp->~ee74761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74761(Test_ee74761, "ee74761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74761C1Ev();
extern void _ZN7ee74761D1Ev();
Name_Map name_map_ee74761[] = {
  NSPAIR(_ZN7ee74761C1Ev),
  NSPAIR(_ZN7ee74761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd4761;
extern VTBL_ENTRY _ZTI6dd4761[];
extern  VTBL_ENTRY _ZTV6dd4761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4761[];
static Base_Class bases_ee74761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74761[];
extern void _ZN7ee747613fooEv();
extern void _ZN7ee747613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee747613fooEv,_ZTv0_n16_N7ee747613fooEv)();
extern void ABISELECT(_ZThn16_N7ee747613fooEv,_ZThn8_N7ee747613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee747613barEv,_ZTv0_n20_N7ee747613barEv)();
extern void ABISELECT(_ZThn16_N7ee747613barEv,_ZThn8_N7ee747613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee747613fooEv,_ZTv0_n12_N7ee747613fooEv)();
extern void ABISELECT(_ZThn32_N7ee747613fooEv,_ZThn20_N7ee747613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee747613barEv,_ZTv0_n16_N7ee747613barEv)();
extern void ABISELECT(_ZThn32_N7ee747613barEv,_ZThn20_N7ee747613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74761[0]),
  (VTBL_ENTRY)&_ZN7ee747613fooEv,
  (VTBL_ENTRY)&_ZN7ee747613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee747613fooEv,_ZTv0_n16_N7ee747613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee747613barEv,_ZTv0_n20_N7ee747613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee747613fooEv,_ZTv0_n12_N7ee747613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee747613barEv,_ZTv0_n16_N7ee747613barEv),
};
extern VTBL_ENTRY _ZTV7ee74761[];
extern void _ZN5cc7613fooEv();
extern void _ZN6dd47613barEv();
static  VTBL_ENTRY _tg__ZTV6dd4761__7ee74761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN6dd47613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd4761__7ee74761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd4761__7ee74761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv)();
extern void ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd4761__7ee74761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv),
};
static  VTT_ENTRY vtt_ee74761[] = {
  {&(_ZTV7ee74761[4]),  4,19},
  {&(_ZTV7ee74761[11]),  11,19},
  {&(_ZTV7ee74761[17]),  17,19},
  {&(_tg__ZTV6dd4761__7ee74761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd4761__7ee74761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd4761__7ee74761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd4761__7ee74761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74761[];
extern  VTBL_ENTRY _ZTV7ee74761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74761[];
static VTBL_ENTRY alt_thunk_names903[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47613barEv,_ZTv0_n16_N6dd47613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47613barEv,_ZThn12_N6dd47613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee747613barEv,_ZTv0_n16_N7ee747613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee747613barEv,_ZThn20_N7ee747613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee747613fooEv,_ZTv0_n12_N7ee747613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee747613fooEv,_ZThn20_N7ee747613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee747613barEv,_ZTv0_n20_N7ee747613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee747613barEv,_ZThn8_N7ee747613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee747613fooEv,_ZTv0_n16_N7ee747613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee747613fooEv,_ZThn8_N7ee747613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74761 = {  "ee74761", // class name
  bases_ee74761, 4,
  &(vtc_ee74761[0]), // expected_vtbl_contents
  &(vtt_ee74761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names903,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5761  : virtual cc761 {
  int d;
  virtual void  bar(); // _ZN6dd57613barEv
  ~dd5761(); // tgen
  dd5761(); // tgen
};
//SIG(-1 dd5761) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd5761 ::bar(){vfunc_called(this, "_ZN6dd57613barEv");}
dd5761 ::~dd5761(){ note_dtor("dd5761", this);} // tgen
dd5761 ::dd5761(){ note_ctor("dd5761", this);} // tgen

static void Test_dd5761()
{
  extern Class_Descriptor cd_dd5761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5761, buf);
    dd5761 *dp, &lv = *(dp=new (buf) dd5761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd5761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,16), "dd5761");
    check_base_class_offset(lv, (cc761*), ABISELECT(16,8), "dd5761");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5761.d");
    test_class_info(&lv, &cd_dd5761);
    dp->~dd5761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5761(Test_dd5761, "dd5761", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5761C1Ev();
extern void _ZN6dd5761D1Ev();
Name_Map name_map_dd5761[] = {
  NSPAIR(_ZN6dd5761C1Ev),
  NSPAIR(_ZN6dd5761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd5761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5761[];
extern void _ZN6dd57613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern VTBL_ENTRY _ZTV6dd5761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd5761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd5761[] = {
  {&(_ZTV6dd5761[4]),  4,18},
  {&(_ZTV6dd5761[10]),  10,18},
  {&(_ZTV6dd5761[16]),  16,18},
  {&(_tg__ZTV5cc761__6dd5761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd5761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static VTBL_ENTRY alt_thunk_names904[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5761 = {  "dd5761", // class name
  bases_dd5761, 3,
  &(vtc_dd5761[0]), // expected_vtbl_contents
  &(vtt_dd5761[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5761),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names904,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05761  : dd5761 {
  int e;
  ~ee05761(); // tgen
  ee05761(); // tgen
};
//SIG(1 ee05761) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee05761 ::~ee05761(){ note_dtor("ee05761", this);} // tgen
ee05761 ::ee05761(){ note_ctor("ee05761", this);} // tgen

static void Test_ee05761()
{
  extern Class_Descriptor cd_ee05761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05761, buf);
    ee05761 *dp, &lv = *(dp=new (buf) ee05761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee05761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee05761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(16,12), "ee05761");
    check_base_class_offset(lv, (dd5761*), 0, "ee05761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05761.e");
    test_class_info(&lv, &cd_ee05761);
    dp->~ee05761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05761(Test_ee05761, "ee05761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05761C1Ev();
extern void _ZN7ee05761D1Ev();
Name_Map name_map_ee05761[] = {
  NSPAIR(_ZN7ee05761C1Ev),
  NSPAIR(_ZN7ee05761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee05761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05761[];
extern void _ZN6dd57613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern VTBL_ENTRY _ZTV7ee05761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee05761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee05761[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee05761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee05761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee05761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee05761[] = {
  {&(_ZTV7ee05761[4]),  4,18},
  {&(_tg__ZTV6dd5761__7ee05761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee05761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee05761[4]),  4,6},
  {&(_ZTV7ee05761[10]),  10,18},
  {&(_ZTV7ee05761[16]),  16,18},
  {&(_tg__ZTV5cc761__7ee05761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee05761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05761[];
extern  VTBL_ENTRY _ZTV7ee05761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05761[];
static VTBL_ENTRY alt_thunk_names905[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05761 = {  "ee05761", // class name
  bases_ee05761, 4,
  &(vtc_ee05761[0]), // expected_vtbl_contents
  &(vtt_ee05761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names905,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15761  : virtual dd5761 {
  int e;
  ~ee15761(); // tgen
  ee15761(); // tgen
};
//SIG(1 ee15761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee15761 ::~ee15761(){ note_dtor("ee15761", this);} // tgen
ee15761 ::ee15761(){ note_ctor("ee15761", this);} // tgen

static void Test_ee15761()
{
  extern Class_Descriptor cd_ee15761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15761, buf);
    ee15761 *dp, &lv = *(dp=new (buf) ee15761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee15761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee15761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(32,16), "ee15761");
    check_base_class_offset(lv, (dd5761*), ABISELECT(16,8), "ee15761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15761.e");
    test_class_info(&lv, &cd_ee15761);
    dp->~ee15761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15761(Test_ee15761, "ee15761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15761C1Ev();
extern void _ZN7ee15761D1Ev();
Name_Map name_map_ee15761[] = {
  NSPAIR(_ZN7ee15761C1Ev),
  NSPAIR(_ZN7ee15761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee15761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15761[];
extern void _ZN6dd57613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15761[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern VTBL_ENTRY _ZTV7ee15761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee15761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee15761[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee15761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee15761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee15761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee15761[] = {
  {&(_ZTV7ee15761[5]),  5,24},
  {&(_ZTV7ee15761[10]),  10,24},
  {&(_ZTV7ee15761[16]),  16,24},
  {&(_ZTV7ee15761[22]),  22,24},
  {&(_tg__ZTV6dd5761__7ee15761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee15761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee15761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee15761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee15761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15761[];
extern  VTBL_ENTRY _ZTV7ee15761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15761[];
static VTBL_ENTRY alt_thunk_names906[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15761 = {  "ee15761", // class name
  bases_ee15761, 4,
  &(vtc_ee15761[0]), // expected_vtbl_contents
  &(vtt_ee15761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15761),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names906,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25761  : dd5761 {
  int e;
  virtual void  foo(); // _ZN7ee257613fooEv
  ~ee25761(); // tgen
  ee25761(); // tgen
};
//SIG(1 ee25761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee25761 ::foo(){vfunc_called(this, "_ZN7ee257613fooEv");}
ee25761 ::~ee25761(){ note_dtor("ee25761", this);} // tgen
ee25761 ::ee25761(){ note_ctor("ee25761", this);} // tgen

static void Test_ee25761()
{
  extern Class_Descriptor cd_ee25761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25761, buf);
    ee25761 *dp, &lv = *(dp=new (buf) ee25761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee25761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee25761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(16,12), "ee25761");
    check_base_class_offset(lv, (dd5761*), 0, "ee25761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25761.e");
    test_class_info(&lv, &cd_ee25761);
    dp->~ee25761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25761(Test_ee25761, "ee25761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25761C1Ev();
extern void _ZN7ee25761D1Ev();
Name_Map name_map_ee25761[] = {
  NSPAIR(_ZN7ee25761C1Ev),
  NSPAIR(_ZN7ee25761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee25761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25761[];
extern void _ZN6dd57613barEv();
extern void _ZN7ee257613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee257613fooEv,_ZTv0_n16_N7ee257613fooEv)();
extern void ABISELECT(_ZThn16_N7ee257613fooEv,_ZThn12_N7ee257613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee257613fooEv,_ZTv0_n12_N7ee257613fooEv)();
extern void ABISELECT(_ZThn32_N7ee257613fooEv,_ZThn20_N7ee257613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
  (VTBL_ENTRY)&_ZN7ee257613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee257613fooEv,_ZTv0_n16_N7ee257613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee257613fooEv,_ZTv0_n12_N7ee257613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern VTBL_ENTRY _ZTV7ee25761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee25761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee25761[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee25761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee25761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee25761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee25761[] = {
  {&(_ZTV7ee25761[4]),  4,19},
  {&(_tg__ZTV6dd5761__7ee25761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee25761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee25761[4]),  4,6},
  {&(_ZTV7ee25761[11]),  11,19},
  {&(_ZTV7ee25761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee25761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee25761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25761[];
extern  VTBL_ENTRY _ZTV7ee25761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25761[];
static VTBL_ENTRY alt_thunk_names907[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee257613fooEv,_ZTv0_n12_N7ee257613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee257613fooEv,_ZThn20_N7ee257613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee257613fooEv,_ZTv0_n16_N7ee257613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee257613fooEv,_ZThn12_N7ee257613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25761 = {  "ee25761", // class name
  bases_ee25761, 4,
  &(vtc_ee25761[0]), // expected_vtbl_contents
  &(vtt_ee25761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names907,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35761  : virtual dd5761 {
  int e;
  virtual void  foo(); // _ZN7ee357613fooEv
  ~ee35761(); // tgen
  ee35761(); // tgen
};
//SIG(1 ee35761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee35761 ::foo(){vfunc_called(this, "_ZN7ee357613fooEv");}
ee35761 ::~ee35761(){ note_dtor("ee35761", this);} // tgen
ee35761 ::ee35761(){ note_ctor("ee35761", this);} // tgen

static void Test_ee35761()
{
  extern Class_Descriptor cd_ee35761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35761, buf);
    ee35761 *dp, &lv = *(dp=new (buf) ee35761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee35761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee35761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(32,16), "ee35761");
    check_base_class_offset(lv, (dd5761*), ABISELECT(16,8), "ee35761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35761.e");
    test_class_info(&lv, &cd_ee35761);
    dp->~ee35761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35761(Test_ee35761, "ee35761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35761C1Ev();
extern void _ZN7ee35761D1Ev();
Name_Map name_map_ee35761[] = {
  NSPAIR(_ZN7ee35761C1Ev),
  NSPAIR(_ZN7ee35761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee35761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35761[];
extern void _ZN7ee357613fooEv();
extern void _ZN6dd57613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee357613fooEv,_ZTv0_n16_N7ee357613fooEv)();
extern void ABISELECT(_ZThn32_N7ee357613fooEv,_ZThn16_N7ee357613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee357613fooEv,_ZTv0_n12_N7ee357613fooEv)();
extern void ABISELECT(_ZThn48_N7ee357613fooEv,_ZThn24_N7ee357613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35761[0]),
  (VTBL_ENTRY)&_ZN7ee357613fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee357613fooEv,_ZTv0_n16_N7ee357613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee357613fooEv,_ZTv0_n12_N7ee357613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern VTBL_ENTRY _ZTV7ee35761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee35761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee35761[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee35761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee35761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee35761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee35761[] = {
  {&(_ZTV7ee35761[5]),  5,25},
  {&(_ZTV7ee35761[11]),  11,25},
  {&(_ZTV7ee35761[17]),  17,25},
  {&(_ZTV7ee35761[23]),  23,25},
  {&(_tg__ZTV6dd5761__7ee35761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee35761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee35761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee35761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee35761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35761[];
extern  VTBL_ENTRY _ZTV7ee35761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35761[];
static VTBL_ENTRY alt_thunk_names908[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee357613fooEv,_ZTv0_n12_N7ee357613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee357613fooEv,_ZThn24_N7ee357613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee357613fooEv,_ZTv0_n16_N7ee357613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee357613fooEv,_ZThn16_N7ee357613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35761 = {  "ee35761", // class name
  bases_ee35761, 4,
  &(vtc_ee35761[0]), // expected_vtbl_contents
  &(vtt_ee35761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35761),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names908,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45761  : dd5761 {
  int e;
  virtual void  bar(); // _ZN7ee457613barEv
  ~ee45761(); // tgen
  ee45761(); // tgen
};
//SIG(1 ee45761) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee45761 ::bar(){vfunc_called(this, "_ZN7ee457613barEv");}
ee45761 ::~ee45761(){ note_dtor("ee45761", this);} // tgen
ee45761 ::ee45761(){ note_ctor("ee45761", this);} // tgen

static void Test_ee45761()
{
  extern Class_Descriptor cd_ee45761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45761, buf);
    ee45761 *dp, &lv = *(dp=new (buf) ee45761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee45761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee45761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(16,12), "ee45761");
    check_base_class_offset(lv, (dd5761*), 0, "ee45761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45761.e");
    test_class_info(&lv, &cd_ee45761);
    dp->~ee45761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45761(Test_ee45761, "ee45761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45761C1Ev();
extern void _ZN7ee45761D1Ev();
Name_Map name_map_ee45761[] = {
  NSPAIR(_ZN7ee45761C1Ev),
  NSPAIR(_ZN7ee45761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee45761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45761[];
extern void _ZN7ee457613barEv();
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee457613barEv,_ZTv0_n20_N7ee457613barEv)();
extern void ABISELECT(_ZThn16_N7ee457613barEv,_ZThn12_N7ee457613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee457613barEv,_ZTv0_n16_N7ee457613barEv)();
extern void ABISELECT(_ZThn32_N7ee457613barEv,_ZThn20_N7ee457613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45761[0]),
  (VTBL_ENTRY)&_ZN7ee457613barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee457613barEv,_ZTv0_n20_N7ee457613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee457613barEv,_ZTv0_n16_N7ee457613barEv),
};
extern VTBL_ENTRY _ZTV7ee45761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee45761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee45761[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee45761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee45761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee45761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee45761[] = {
  {&(_ZTV7ee45761[4]),  4,18},
  {&(_tg__ZTV6dd5761__7ee45761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee45761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee45761[4]),  4,6},
  {&(_ZTV7ee45761[10]),  10,18},
  {&(_ZTV7ee45761[16]),  16,18},
  {&(_tg__ZTV5cc761__7ee45761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee45761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45761[];
extern  VTBL_ENTRY _ZTV7ee45761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45761[];
static VTBL_ENTRY alt_thunk_names909[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee457613barEv,_ZTv0_n16_N7ee457613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee457613barEv,_ZThn20_N7ee457613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee457613barEv,_ZTv0_n20_N7ee457613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee457613barEv,_ZThn12_N7ee457613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45761 = {  "ee45761", // class name
  bases_ee45761, 4,
  &(vtc_ee45761[0]), // expected_vtbl_contents
  &(vtt_ee45761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names909,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55761  : virtual dd5761 {
  int e;
  virtual void  bar(); // _ZN7ee557613barEv
  ~ee55761(); // tgen
  ee55761(); // tgen
};
//SIG(1 ee55761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee55761 ::bar(){vfunc_called(this, "_ZN7ee557613barEv");}
ee55761 ::~ee55761(){ note_dtor("ee55761", this);} // tgen
ee55761 ::ee55761(){ note_ctor("ee55761", this);} // tgen

static void Test_ee55761()
{
  extern Class_Descriptor cd_ee55761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55761, buf);
    ee55761 *dp, &lv = *(dp=new (buf) ee55761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee55761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee55761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(32,16), "ee55761");
    check_base_class_offset(lv, (dd5761*), ABISELECT(16,8), "ee55761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55761.e");
    test_class_info(&lv, &cd_ee55761);
    dp->~ee55761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55761(Test_ee55761, "ee55761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55761C1Ev();
extern void _ZN7ee55761D1Ev();
Name_Map name_map_ee55761[] = {
  NSPAIR(_ZN7ee55761C1Ev),
  NSPAIR(_ZN7ee55761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee55761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55761[];
extern void _ZN7ee557613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee557613barEv,_ZTv0_n20_N7ee557613barEv)();
extern void ABISELECT(_ZThn16_N7ee557613barEv,_ZThn8_N7ee557613barEv)() __attribute__((weak));
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee557613barEv,_ZTv0_n20_N7ee557613barEv)();
extern void ABISELECT(_ZThn32_N7ee557613barEv,_ZThn16_N7ee557613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee557613barEv,_ZTv0_n16_N7ee557613barEv)();
extern void ABISELECT(_ZThn48_N7ee557613barEv,_ZThn24_N7ee557613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55761[0]),
  (VTBL_ENTRY)&_ZN7ee557613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee557613barEv,_ZTv0_n20_N7ee557613barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee557613barEv,_ZTv0_n20_N7ee557613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee557613barEv,_ZTv0_n16_N7ee557613barEv),
};
extern VTBL_ENTRY _ZTV7ee55761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee55761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee55761[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee55761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee55761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee55761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee55761[] = {
  {&(_ZTV7ee55761[5]),  5,25},
  {&(_ZTV7ee55761[11]),  11,25},
  {&(_ZTV7ee55761[17]),  17,25},
  {&(_ZTV7ee55761[23]),  23,25},
  {&(_tg__ZTV6dd5761__7ee55761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee55761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee55761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee55761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee55761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55761[];
extern  VTBL_ENTRY _ZTV7ee55761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55761[];
static VTBL_ENTRY alt_thunk_names910[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee557613barEv,_ZTv0_n16_N7ee557613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee557613barEv,_ZThn24_N7ee557613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee557613barEv,_ZTv0_n20_N7ee557613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee557613barEv,_ZThn16_N7ee557613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee557613barEv,_ZThn8_N7ee557613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55761 = {  "ee55761", // class name
  bases_ee55761, 4,
  &(vtc_ee55761[0]), // expected_vtbl_contents
  &(vtt_ee55761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55761),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names910,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65761  : dd5761 {
  int e;
  virtual void  foo(); // _ZN7ee657613fooEv
  virtual void  bar(); // _ZN7ee657613barEv
  ~ee65761(); // tgen
  ee65761(); // tgen
};
//SIG(1 ee65761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65761 ::foo(){vfunc_called(this, "_ZN7ee657613fooEv");}
void  ee65761 ::bar(){vfunc_called(this, "_ZN7ee657613barEv");}
ee65761 ::~ee65761(){ note_dtor("ee65761", this);} // tgen
ee65761 ::ee65761(){ note_ctor("ee65761", this);} // tgen

static void Test_ee65761()
{
  extern Class_Descriptor cd_ee65761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65761, buf);
    ee65761 *dp, &lv = *(dp=new (buf) ee65761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee65761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee65761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(16,12), "ee65761");
    check_base_class_offset(lv, (dd5761*), 0, "ee65761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65761.e");
    test_class_info(&lv, &cd_ee65761);
    dp->~ee65761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65761(Test_ee65761, "ee65761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65761C1Ev();
extern void _ZN7ee65761D1Ev();
Name_Map name_map_ee65761[] = {
  NSPAIR(_ZN7ee65761C1Ev),
  NSPAIR(_ZN7ee65761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee65761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65761[];
extern void _ZN7ee657613barEv();
extern void _ZN7ee657613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee657613fooEv,_ZTv0_n16_N7ee657613fooEv)();
extern void ABISELECT(_ZThn16_N7ee657613fooEv,_ZThn12_N7ee657613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee657613barEv,_ZTv0_n20_N7ee657613barEv)();
extern void ABISELECT(_ZThn16_N7ee657613barEv,_ZThn12_N7ee657613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee657613fooEv,_ZTv0_n12_N7ee657613fooEv)();
extern void ABISELECT(_ZThn32_N7ee657613fooEv,_ZThn20_N7ee657613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee657613barEv,_ZTv0_n16_N7ee657613barEv)();
extern void ABISELECT(_ZThn32_N7ee657613barEv,_ZThn20_N7ee657613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65761[0]),
  (VTBL_ENTRY)&_ZN7ee657613barEv,
  (VTBL_ENTRY)&_ZN7ee657613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee657613fooEv,_ZTv0_n16_N7ee657613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee657613barEv,_ZTv0_n20_N7ee657613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee657613fooEv,_ZTv0_n12_N7ee657613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee657613barEv,_ZTv0_n16_N7ee657613barEv),
};
extern VTBL_ENTRY _ZTV7ee65761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee65761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee65761[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee65761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee65761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee65761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee65761[] = {
  {&(_ZTV7ee65761[4]),  4,19},
  {&(_tg__ZTV6dd5761__7ee65761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee65761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee65761[4]),  4,6},
  {&(_ZTV7ee65761[11]),  11,19},
  {&(_ZTV7ee65761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee65761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee65761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65761[];
extern  VTBL_ENTRY _ZTV7ee65761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65761[];
static VTBL_ENTRY alt_thunk_names911[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn20_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn12_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee657613barEv,_ZTv0_n16_N7ee657613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee657613barEv,_ZThn20_N7ee657613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee657613fooEv,_ZTv0_n12_N7ee657613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee657613fooEv,_ZThn20_N7ee657613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee657613barEv,_ZTv0_n20_N7ee657613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee657613barEv,_ZThn12_N7ee657613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee657613fooEv,_ZTv0_n16_N7ee657613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee657613fooEv,_ZThn12_N7ee657613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65761 = {  "ee65761", // class name
  bases_ee65761, 4,
  &(vtc_ee65761[0]), // expected_vtbl_contents
  &(vtt_ee65761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names911,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75761  : virtual dd5761 {
  int e;
  virtual void  foo(); // _ZN7ee757613fooEv
  virtual void  bar(); // _ZN7ee757613barEv
  ~ee75761(); // tgen
  ee75761(); // tgen
};
//SIG(1 ee75761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75761 ::foo(){vfunc_called(this, "_ZN7ee757613fooEv");}
void  ee75761 ::bar(){vfunc_called(this, "_ZN7ee757613barEv");}
ee75761 ::~ee75761(){ note_dtor("ee75761", this);} // tgen
ee75761 ::ee75761(){ note_ctor("ee75761", this);} // tgen

static void Test_ee75761()
{
  extern Class_Descriptor cd_ee75761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75761, buf);
    ee75761 *dp, &lv = *(dp=new (buf) ee75761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee75761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee75761");
    check_base_class_offset(lv, (cc761*)(dd5761*), ABISELECT(32,16), "ee75761");
    check_base_class_offset(lv, (dd5761*), ABISELECT(16,8), "ee75761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75761.e");
    test_class_info(&lv, &cd_ee75761);
    dp->~ee75761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75761(Test_ee75761, "ee75761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75761C1Ev();
extern void _ZN7ee75761D1Ev();
Name_Map name_map_ee75761[] = {
  NSPAIR(_ZN7ee75761C1Ev),
  NSPAIR(_ZN7ee75761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd5761;
extern VTBL_ENTRY _ZTI6dd5761[];
extern  VTBL_ENTRY _ZTV6dd5761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5761[];
static Base_Class bases_ee75761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5761,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75761[];
extern void _ZN7ee757613fooEv();
extern void _ZN7ee757613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee757613barEv,_ZTv0_n20_N7ee757613barEv)();
extern void ABISELECT(_ZThn16_N7ee757613barEv,_ZThn8_N7ee757613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee757613fooEv,_ZTv0_n16_N7ee757613fooEv)();
extern void ABISELECT(_ZThn32_N7ee757613fooEv,_ZThn16_N7ee757613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee757613barEv,_ZTv0_n20_N7ee757613barEv)();
extern void ABISELECT(_ZThn32_N7ee757613barEv,_ZThn16_N7ee757613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee757613fooEv,_ZTv0_n12_N7ee757613fooEv)();
extern void ABISELECT(_ZThn48_N7ee757613fooEv,_ZThn24_N7ee757613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee757613barEv,_ZTv0_n16_N7ee757613barEv)();
extern void ABISELECT(_ZThn48_N7ee757613barEv,_ZThn24_N7ee757613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75761[0]),
  (VTBL_ENTRY)&_ZN7ee757613fooEv,
  (VTBL_ENTRY)&_ZN7ee757613barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee757613barEv,_ZTv0_n20_N7ee757613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee757613fooEv,_ZTv0_n16_N7ee757613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee757613barEv,_ZTv0_n20_N7ee757613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee757613fooEv,_ZTv0_n12_N7ee757613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee757613barEv,_ZTv0_n16_N7ee757613barEv),
};
extern VTBL_ENTRY _ZTV7ee75761[];
extern void _ZN6dd57613barEv();
static  VTBL_ENTRY _tg__ZTV6dd5761__7ee75761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN6dd57613barEv,
};
extern void _ZN5cc7613fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv)();
extern void ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd5761__7ee75761[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv)();
extern void ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd5761__7ee75761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee75761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee75761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee75761[] = {
  {&(_ZTV7ee75761[5]),  5,26},
  {&(_ZTV7ee75761[12]),  12,26},
  {&(_ZTV7ee75761[18]),  18,26},
  {&(_ZTV7ee75761[24]),  24,26},
  {&(_tg__ZTV6dd5761__7ee75761[4]),  4,5},
  {&(_tg__ZTV5cc761__6dd5761__7ee75761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd5761__7ee75761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee75761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee75761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75761[];
extern  VTBL_ENTRY _ZTV7ee75761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75761[];
static VTBL_ENTRY alt_thunk_names912[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57613barEv,_ZTv0_n16_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57613barEv,_ZThn16_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57613barEv,_ZTv0_n20_N6dd57613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57613barEv,_ZThn8_N6dd57613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee757613barEv,_ZTv0_n16_N7ee757613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee757613barEv,_ZThn24_N7ee757613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee757613fooEv,_ZTv0_n12_N7ee757613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee757613fooEv,_ZThn24_N7ee757613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee757613fooEv,_ZTv0_n16_N7ee757613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee757613fooEv,_ZThn16_N7ee757613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee757613barEv,_ZTv0_n20_N7ee757613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee757613barEv,_ZThn16_N7ee757613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee757613barEv,_ZThn8_N7ee757613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75761 = {  "ee75761", // class name
  bases_ee75761, 4,
  &(vtc_ee75761[0]), // expected_vtbl_contents
  &(vtt_ee75761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75761),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names912,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6761  : cc761 {
  int d;
  virtual void  bar(); // _ZN6dd67613barEv
  virtual void  foo(); // _ZN6dd67613fooEv
  ~dd6761(); // tgen
  dd6761(); // tgen
};
//SIG(-1 dd6761) C1{ BC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd6761 ::bar(){vfunc_called(this, "_ZN6dd67613barEv");}
void  dd6761 ::foo(){vfunc_called(this, "_ZN6dd67613fooEv");}
dd6761 ::~dd6761(){ note_dtor("dd6761", this);} // tgen
dd6761 ::dd6761(){ note_ctor("dd6761", this);} // tgen

static void Test_dd6761()
{
  extern Class_Descriptor cd_dd6761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6761, buf);
    dd6761 *dp, &lv = *(dp=new (buf) dd6761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(16,12), "dd6761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(16,12), "dd6761");
    check_base_class_offset(lv, (cc761*), 0, "dd6761");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6761.d");
    test_class_info(&lv, &cd_dd6761);
    dp->~dd6761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6761(Test_dd6761, "dd6761", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6761C1Ev();
extern void _ZN6dd6761D1Ev();
Name_Map name_map_dd6761[] = {
  NSPAIR(_ZN6dd6761C1Ev),
  NSPAIR(_ZN6dd6761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd6761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
extern VTBL_ENTRY _ZTV6dd6761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd6761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd6761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd6761[] = {
  {&(_ZTV6dd6761[3]),  3,11},
  {&(_tg__ZTV5cc761__6dd6761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd6761[4]),  4,6},
  {&(_ZTV6dd6761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static VTBL_ENTRY alt_thunk_names913[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6761 = {  "dd6761", // class name
  bases_dd6761, 3,
  &(vtc_dd6761[0]), // expected_vtbl_contents
  &(vtt_dd6761[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6761),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names913,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06761  : dd6761 {
  int e;
  ~ee06761(); // tgen
  ee06761(); // tgen
};
//SIG(1 ee06761) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee06761 ::~ee06761(){ note_dtor("ee06761", this);} // tgen
ee06761 ::ee06761(){ note_ctor("ee06761", this);} // tgen

static void Test_ee06761()
{
  extern Class_Descriptor cd_ee06761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06761, buf);
    ee06761 *dp, &lv = *(dp=new (buf) ee06761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee06761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(24,16), "ee06761");
    check_base_class_offset(lv, (cc761*)(dd6761*), 0, "ee06761");
    check_base_class_offset(lv, (dd6761*), 0, "ee06761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06761.e");
    test_class_info(&lv, &cd_ee06761);
    dp->~ee06761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06761(Test_ee06761, "ee06761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06761C1Ev();
extern void _ZN7ee06761D1Ev();
Name_Map name_map_ee06761[] = {
  NSPAIR(_ZN7ee06761C1Ev),
  NSPAIR(_ZN7ee06761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee06761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
extern VTBL_ENTRY _ZTV7ee06761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee06761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee06761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee06761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee06761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee06761[] = {
  {&(_ZTV7ee06761[3]),  3,11},
  {&(_tg__ZTV6dd6761__7ee06761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee06761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee06761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee06761[4]),  4,6},
  {&(_ZTV7ee06761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06761[];
extern  VTBL_ENTRY _ZTV7ee06761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06761[];
static VTBL_ENTRY alt_thunk_names914[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06761 = {  "ee06761", // class name
  bases_ee06761, 4,
  &(vtc_ee06761[0]), // expected_vtbl_contents
  &(vtt_ee06761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names914,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16761  : virtual dd6761 {
  int e;
  ~ee16761(); // tgen
  ee16761(); // tgen
};
//SIG(1 ee16761) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee16761 ::~ee16761(){ note_dtor("ee16761", this);} // tgen
ee16761 ::ee16761(){ note_ctor("ee16761", this);} // tgen

static void Test_ee16761()
{
  extern Class_Descriptor cd_ee16761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16761, buf);
    ee16761 *dp, &lv = *(dp=new (buf) ee16761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee16761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(32,20), "ee16761");
    check_base_class_offset(lv, (cc761*)(dd6761*), ABISELECT(16,8), "ee16761");
    check_base_class_offset(lv, (dd6761*), ABISELECT(16,8), "ee16761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16761.e");
    test_class_info(&lv, &cd_ee16761);
    dp->~ee16761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16761(Test_ee16761, "ee16761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16761C1Ev();
extern void _ZN7ee16761D1Ev();
Name_Map name_map_ee16761[] = {
  NSPAIR(_ZN7ee16761C1Ev),
  NSPAIR(_ZN7ee16761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee16761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16761[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
extern VTBL_ENTRY _ZTV7ee16761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee16761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee16761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee16761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee16761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee16761[] = {
  {&(_ZTV7ee16761[4]),  4,17},
  {&(_ZTV7ee16761[9]),  9,17},
  {&(_ZTV7ee16761[15]),  15,17},
  {&(_tg__ZTV6dd6761__7ee16761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee16761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee16761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee16761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16761[];
extern  VTBL_ENTRY _ZTV7ee16761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16761[];
static VTBL_ENTRY alt_thunk_names915[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16761 = {  "ee16761", // class name
  bases_ee16761, 4,
  &(vtc_ee16761[0]), // expected_vtbl_contents
  &(vtt_ee16761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16761),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names915,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26761  : dd6761 {
  int e;
  virtual void  foo(); // _ZN7ee267613fooEv
  ~ee26761(); // tgen
  ee26761(); // tgen
};
//SIG(1 ee26761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26761 ::foo(){vfunc_called(this, "_ZN7ee267613fooEv");}
ee26761 ::~ee26761(){ note_dtor("ee26761", this);} // tgen
ee26761 ::ee26761(){ note_ctor("ee26761", this);} // tgen

static void Test_ee26761()
{
  extern Class_Descriptor cd_ee26761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26761, buf);
    ee26761 *dp, &lv = *(dp=new (buf) ee26761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee26761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(24,16), "ee26761");
    check_base_class_offset(lv, (cc761*)(dd6761*), 0, "ee26761");
    check_base_class_offset(lv, (dd6761*), 0, "ee26761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26761.e");
    test_class_info(&lv, &cd_ee26761);
    dp->~ee26761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26761(Test_ee26761, "ee26761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26761C1Ev();
extern void _ZN7ee26761D1Ev();
Name_Map name_map_ee26761[] = {
  NSPAIR(_ZN7ee26761C1Ev),
  NSPAIR(_ZN7ee26761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee26761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26761[];
extern void _ZN7ee267613fooEv();
extern void _ZN6dd67613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee267613fooEv,_ZTv0_n12_N7ee267613fooEv)();
extern void ABISELECT(_ZThn24_N7ee267613fooEv,_ZThn16_N7ee267613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26761[0]),
  (VTBL_ENTRY)&_ZN7ee267613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee267613fooEv,_ZTv0_n12_N7ee267613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
extern VTBL_ENTRY _ZTV7ee26761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee26761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee26761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee26761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee26761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee26761[] = {
  {&(_ZTV7ee26761[3]),  3,11},
  {&(_tg__ZTV6dd6761__7ee26761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee26761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee26761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee26761[4]),  4,6},
  {&(_ZTV7ee26761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26761[];
extern  VTBL_ENTRY _ZTV7ee26761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26761[];
static VTBL_ENTRY alt_thunk_names916[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee267613fooEv,_ZTv0_n12_N7ee267613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee267613fooEv,_ZThn16_N7ee267613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26761 = {  "ee26761", // class name
  bases_ee26761, 4,
  &(vtc_ee26761[0]), // expected_vtbl_contents
  &(vtt_ee26761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names916,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36761  : virtual dd6761 {
  int e;
  virtual void  foo(); // _ZN7ee367613fooEv
  ~ee36761(); // tgen
  ee36761(); // tgen
};
//SIG(1 ee36761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36761 ::foo(){vfunc_called(this, "_ZN7ee367613fooEv");}
ee36761 ::~ee36761(){ note_dtor("ee36761", this);} // tgen
ee36761 ::ee36761(){ note_ctor("ee36761", this);} // tgen

static void Test_ee36761()
{
  extern Class_Descriptor cd_ee36761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36761, buf);
    ee36761 *dp, &lv = *(dp=new (buf) ee36761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee36761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(32,20), "ee36761");
    check_base_class_offset(lv, (cc761*)(dd6761*), ABISELECT(16,8), "ee36761");
    check_base_class_offset(lv, (dd6761*), ABISELECT(16,8), "ee36761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36761.e");
    test_class_info(&lv, &cd_ee36761);
    dp->~ee36761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36761(Test_ee36761, "ee36761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36761C1Ev();
extern void _ZN7ee36761D1Ev();
Name_Map name_map_ee36761[] = {
  NSPAIR(_ZN7ee36761C1Ev),
  NSPAIR(_ZN7ee36761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee36761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36761[];
extern void _ZN7ee367613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee367613fooEv,_ZTv0_n16_N7ee367613fooEv)();
extern void ABISELECT(_ZThn16_N7ee367613fooEv,_ZThn8_N7ee367613fooEv)() __attribute__((weak));
extern void _ZN6dd67613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee367613fooEv,_ZTv0_n12_N7ee367613fooEv)();
extern void ABISELECT(_ZThn32_N7ee367613fooEv,_ZThn20_N7ee367613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36761[0]),
  (VTBL_ENTRY)&_ZN7ee367613fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee367613fooEv,_ZTv0_n16_N7ee367613fooEv),
  (VTBL_ENTRY)&_ZN6dd67613barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee367613fooEv,_ZTv0_n12_N7ee367613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
extern VTBL_ENTRY _ZTV7ee36761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee36761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee36761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee36761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee36761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee36761[] = {
  {&(_ZTV7ee36761[4]),  4,18},
  {&(_ZTV7ee36761[10]),  10,18},
  {&(_ZTV7ee36761[16]),  16,18},
  {&(_tg__ZTV6dd6761__7ee36761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee36761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee36761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee36761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36761[];
extern  VTBL_ENTRY _ZTV7ee36761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36761[];
static VTBL_ENTRY alt_thunk_names917[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee367613fooEv,_ZTv0_n12_N7ee367613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee367613fooEv,_ZThn20_N7ee367613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee367613fooEv,_ZTv0_n16_N7ee367613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee367613fooEv,_ZThn8_N7ee367613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36761 = {  "ee36761", // class name
  bases_ee36761, 4,
  &(vtc_ee36761[0]), // expected_vtbl_contents
  &(vtt_ee36761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names917,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46761  : dd6761 {
  int e;
  virtual void  bar(); // _ZN7ee467613barEv
  ~ee46761(); // tgen
  ee46761(); // tgen
};
//SIG(1 ee46761) C1{ BC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46761 ::bar(){vfunc_called(this, "_ZN7ee467613barEv");}
ee46761 ::~ee46761(){ note_dtor("ee46761", this);} // tgen
ee46761 ::ee46761(){ note_ctor("ee46761", this);} // tgen

static void Test_ee46761()
{
  extern Class_Descriptor cd_ee46761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46761, buf);
    ee46761 *dp, &lv = *(dp=new (buf) ee46761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee46761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(24,16), "ee46761");
    check_base_class_offset(lv, (cc761*)(dd6761*), 0, "ee46761");
    check_base_class_offset(lv, (dd6761*), 0, "ee46761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46761.e");
    test_class_info(&lv, &cd_ee46761);
    dp->~ee46761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46761(Test_ee46761, "ee46761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46761C1Ev();
extern void _ZN7ee46761D1Ev();
Name_Map name_map_ee46761[] = {
  NSPAIR(_ZN7ee46761C1Ev),
  NSPAIR(_ZN7ee46761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee46761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46761[];
extern void _ZN6dd67613fooEv();
extern void _ZN7ee467613barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee467613barEv,_ZTv0_n16_N7ee467613barEv)();
extern void ABISELECT(_ZThn24_N7ee467613barEv,_ZThn16_N7ee467613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN7ee467613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee467613barEv,_ZTv0_n16_N7ee467613barEv),
};
extern VTBL_ENTRY _ZTV7ee46761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee46761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee46761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee46761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee46761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee46761[] = {
  {&(_ZTV7ee46761[3]),  3,11},
  {&(_tg__ZTV6dd6761__7ee46761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee46761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee46761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee46761[4]),  4,6},
  {&(_ZTV7ee46761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46761[];
extern  VTBL_ENTRY _ZTV7ee46761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46761[];
static VTBL_ENTRY alt_thunk_names918[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee467613barEv,_ZTv0_n16_N7ee467613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee467613barEv,_ZThn16_N7ee467613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46761 = {  "ee46761", // class name
  bases_ee46761, 4,
  &(vtc_ee46761[0]), // expected_vtbl_contents
  &(vtt_ee46761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names918,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56761  : virtual dd6761 {
  int e;
  virtual void  bar(); // _ZN7ee567613barEv
  ~ee56761(); // tgen
  ee56761(); // tgen
};
//SIG(1 ee56761) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56761 ::bar(){vfunc_called(this, "_ZN7ee567613barEv");}
ee56761 ::~ee56761(){ note_dtor("ee56761", this);} // tgen
ee56761 ::ee56761(){ note_ctor("ee56761", this);} // tgen

static void Test_ee56761()
{
  extern Class_Descriptor cd_ee56761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56761, buf);
    ee56761 *dp, &lv = *(dp=new (buf) ee56761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee56761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(32,20), "ee56761");
    check_base_class_offset(lv, (cc761*)(dd6761*), ABISELECT(16,8), "ee56761");
    check_base_class_offset(lv, (dd6761*), ABISELECT(16,8), "ee56761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56761.e");
    test_class_info(&lv, &cd_ee56761);
    dp->~ee56761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56761(Test_ee56761, "ee56761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56761C1Ev();
extern void _ZN7ee56761D1Ev();
Name_Map name_map_ee56761[] = {
  NSPAIR(_ZN7ee56761C1Ev),
  NSPAIR(_ZN7ee56761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee56761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56761[];
extern void _ZN7ee567613barEv();
extern void _ZN6dd67613fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee567613barEv,_ZTv0_n20_N7ee567613barEv)();
extern void ABISELECT(_ZThn16_N7ee567613barEv,_ZThn8_N7ee567613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee567613barEv,_ZTv0_n16_N7ee567613barEv)();
extern void ABISELECT(_ZThn32_N7ee567613barEv,_ZThn20_N7ee567613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56761[0]),
  (VTBL_ENTRY)&_ZN7ee567613barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee567613barEv,_ZTv0_n20_N7ee567613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee567613barEv,_ZTv0_n16_N7ee567613barEv),
};
extern VTBL_ENTRY _ZTV7ee56761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee56761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee56761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee56761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee56761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee56761[] = {
  {&(_ZTV7ee56761[4]),  4,18},
  {&(_ZTV7ee56761[10]),  10,18},
  {&(_ZTV7ee56761[16]),  16,18},
  {&(_tg__ZTV6dd6761__7ee56761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee56761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee56761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee56761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56761[];
extern  VTBL_ENTRY _ZTV7ee56761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56761[];
static VTBL_ENTRY alt_thunk_names919[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee567613barEv,_ZTv0_n16_N7ee567613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee567613barEv,_ZThn20_N7ee567613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee567613barEv,_ZTv0_n20_N7ee567613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee567613barEv,_ZThn8_N7ee567613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56761 = {  "ee56761", // class name
  bases_ee56761, 4,
  &(vtc_ee56761[0]), // expected_vtbl_contents
  &(vtt_ee56761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56761),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names919,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66761  : dd6761 {
  int e;
  virtual void  foo(); // _ZN7ee667613fooEv
  virtual void  bar(); // _ZN7ee667613barEv
  ~ee66761(); // tgen
  ee66761(); // tgen
};
//SIG(1 ee66761) C1{ BC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66761 ::foo(){vfunc_called(this, "_ZN7ee667613fooEv");}
void  ee66761 ::bar(){vfunc_called(this, "_ZN7ee667613barEv");}
ee66761 ::~ee66761(){ note_dtor("ee66761", this);} // tgen
ee66761 ::ee66761(){ note_ctor("ee66761", this);} // tgen

static void Test_ee66761()
{
  extern Class_Descriptor cd_ee66761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66761, buf);
    ee66761 *dp, &lv = *(dp=new (buf) ee66761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(24,16), "ee66761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(24,16), "ee66761");
    check_base_class_offset(lv, (cc761*)(dd6761*), 0, "ee66761");
    check_base_class_offset(lv, (dd6761*), 0, "ee66761");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66761.e");
    test_class_info(&lv, &cd_ee66761);
    dp->~ee66761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66761(Test_ee66761, "ee66761", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66761C1Ev();
extern void _ZN7ee66761D1Ev();
Name_Map name_map_ee66761[] = {
  NSPAIR(_ZN7ee66761C1Ev),
  NSPAIR(_ZN7ee66761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee66761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66761[];
extern void _ZN7ee667613fooEv();
extern void _ZN7ee667613barEv();
extern void ABISELECT(_ZTv0_n24_N7ee667613fooEv,_ZTv0_n12_N7ee667613fooEv)();
extern void ABISELECT(_ZThn24_N7ee667613fooEv,_ZThn16_N7ee667613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee667613barEv,_ZTv0_n16_N7ee667613barEv)();
extern void ABISELECT(_ZThn24_N7ee667613barEv,_ZThn16_N7ee667613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66761[0]),
  (VTBL_ENTRY)&_ZN7ee667613fooEv,
  (VTBL_ENTRY)&_ZN7ee667613barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee667613fooEv,_ZTv0_n12_N7ee667613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee667613barEv,_ZTv0_n16_N7ee667613barEv),
};
extern VTBL_ENTRY _ZTV7ee66761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee66761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee66761[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee66761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee66761[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee66761[] = {
  {&(_ZTV7ee66761[3]),  3,11},
  {&(_tg__ZTV6dd6761__7ee66761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee66761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee66761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee66761[4]),  4,6},
  {&(_ZTV7ee66761[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66761[];
extern  VTBL_ENTRY _ZTV7ee66761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66761[];
static VTBL_ENTRY alt_thunk_names920[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613barEv,_ZThn16_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67613fooEv,_ZThn16_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613barEv,_ZThn16_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7613fooEv,_ZThn16_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee667613barEv,_ZTv0_n16_N7ee667613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee667613barEv,_ZThn16_N7ee667613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee667613fooEv,_ZTv0_n12_N7ee667613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee667613fooEv,_ZThn16_N7ee667613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66761 = {  "ee66761", // class name
  bases_ee66761, 4,
  &(vtc_ee66761[0]), // expected_vtbl_contents
  &(vtt_ee66761[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66761),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66761),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names920,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76761  : virtual dd6761 {
  int e;
  virtual void  foo(); // _ZN7ee767613fooEv
  virtual void  bar(); // _ZN7ee767613barEv
  ~ee76761(); // tgen
  ee76761(); // tgen
};
//SIG(1 ee76761) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76761 ::foo(){vfunc_called(this, "_ZN7ee767613fooEv");}
void  ee76761 ::bar(){vfunc_called(this, "_ZN7ee767613barEv");}
ee76761 ::~ee76761(){ note_dtor("ee76761", this);} // tgen
ee76761 ::ee76761(){ note_ctor("ee76761", this);} // tgen

static void Test_ee76761()
{
  extern Class_Descriptor cd_ee76761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76761, buf);
    ee76761 *dp, &lv = *(dp=new (buf) ee76761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee76761");
    check_base_class_offset(lv, (bb61*)(cc761*)(dd6761*), ABISELECT(32,20), "ee76761");
    check_base_class_offset(lv, (cc761*)(dd6761*), ABISELECT(16,8), "ee76761");
    check_base_class_offset(lv, (dd6761*), ABISELECT(16,8), "ee76761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76761.e");
    test_class_info(&lv, &cd_ee76761);
    dp->~ee76761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76761(Test_ee76761, "ee76761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76761C1Ev();
extern void _ZN7ee76761D1Ev();
Name_Map name_map_ee76761[] = {
  NSPAIR(_ZN7ee76761C1Ev),
  NSPAIR(_ZN7ee76761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd6761;
extern VTBL_ENTRY _ZTI6dd6761[];
extern  VTBL_ENTRY _ZTV6dd6761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6761[];
static Base_Class bases_ee76761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc761,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76761[];
extern void _ZN7ee767613fooEv();
extern void _ZN7ee767613barEv();
extern void ABISELECT(_ZTv0_n32_N7ee767613fooEv,_ZTv0_n16_N7ee767613fooEv)();
extern void ABISELECT(_ZThn16_N7ee767613fooEv,_ZThn8_N7ee767613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee767613barEv,_ZTv0_n20_N7ee767613barEv)();
extern void ABISELECT(_ZThn16_N7ee767613barEv,_ZThn8_N7ee767613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee767613fooEv,_ZTv0_n12_N7ee767613fooEv)();
extern void ABISELECT(_ZThn32_N7ee767613fooEv,_ZThn20_N7ee767613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee767613barEv,_ZTv0_n16_N7ee767613barEv)();
extern void ABISELECT(_ZThn32_N7ee767613barEv,_ZThn20_N7ee767613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76761[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76761[0]),
  (VTBL_ENTRY)&_ZN7ee767613fooEv,
  (VTBL_ENTRY)&_ZN7ee767613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee767613fooEv,_ZTv0_n16_N7ee767613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee767613barEv,_ZTv0_n20_N7ee767613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee767613fooEv,_ZTv0_n12_N7ee767613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee767613barEv,_ZTv0_n16_N7ee767613barEv),
};
extern VTBL_ENTRY _ZTV7ee76761[];
extern void _ZN6dd67613fooEv();
extern void _ZN6dd67613barEv();
static  VTBL_ENTRY _tg__ZTV6dd6761__7ee76761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&_ZN6dd67613fooEv,
  (VTBL_ENTRY)&_ZN6dd67613barEv,
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc7616dd6761__7ee76761[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc7616dd6761__7ee76761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv)();
extern void ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv)();
extern void ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd6761__7ee76761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv),
};
static  VTT_ENTRY vtt_ee76761[] = {
  {&(_ZTV7ee76761[4]),  4,19},
  {&(_ZTV7ee76761[11]),  11,19},
  {&(_ZTV7ee76761[17]),  17,19},
  {&(_tg__ZTV6dd6761__7ee76761[3]),  3,5},
  {&(_tg__ZTV5cc7616dd6761__7ee76761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc7616dd6761__7ee76761[4]),  4,6},
  {&(_tg__ZTV4bb61__6dd6761__7ee76761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76761[];
extern  VTBL_ENTRY _ZTV7ee76761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76761[];
static VTBL_ENTRY alt_thunk_names921[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67613barEv,_ZTv0_n16_N6dd67613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613barEv,_ZThn12_N6dd67613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67613fooEv,_ZTv0_n12_N6dd67613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67613fooEv,_ZThn12_N6dd67613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn12_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn12_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee767613barEv,_ZTv0_n16_N7ee767613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee767613barEv,_ZThn20_N7ee767613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee767613fooEv,_ZTv0_n12_N7ee767613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee767613fooEv,_ZThn20_N7ee767613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee767613barEv,_ZTv0_n20_N7ee767613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee767613barEv,_ZThn8_N7ee767613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee767613fooEv,_ZTv0_n16_N7ee767613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee767613fooEv,_ZThn8_N7ee767613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76761 = {  "ee76761", // class name
  bases_ee76761, 4,
  &(vtc_ee76761[0]), // expected_vtbl_contents
  &(vtt_ee76761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76761),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names921,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7761  : virtual cc761 {
  int d;
  virtual void  bar(); // _ZN6dd77613barEv
  virtual void  foo(); // _ZN6dd77613fooEv
  ~dd7761(); // tgen
  dd7761(); // tgen
};
//SIG(-1 dd7761) C1{ VBC2{ VBC3{ BC4{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd7761 ::bar(){vfunc_called(this, "_ZN6dd77613barEv");}
void  dd7761 ::foo(){vfunc_called(this, "_ZN6dd77613fooEv");}
dd7761 ::~dd7761(){ note_dtor("dd7761", this);} // tgen
dd7761 ::dd7761(){ note_ctor("dd7761", this);} // tgen

static void Test_dd7761()
{
  extern Class_Descriptor cd_dd7761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7761, buf);
    dd7761 *dp, &lv = *(dp=new (buf) dd7761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,16), "dd7761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,16), "dd7761");
    check_base_class_offset(lv, (cc761*), ABISELECT(16,8), "dd7761");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7761.d");
    test_class_info(&lv, &cd_dd7761);
    dp->~dd7761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7761(Test_dd7761, "dd7761", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7761C1Ev();
extern void _ZN6dd7761D1Ev();
Name_Map name_map_dd7761[] = {
  NSPAIR(_ZN6dd7761C1Ev),
  NSPAIR(_ZN6dd7761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
static Base_Class bases_dd7761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc761,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern VTBL_ENTRY _ZTV6dd7761[];
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__6dd7761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_dd7761[] = {
  {&(_ZTV6dd7761[4]),  4,19},
  {&(_ZTV6dd7761[11]),  11,19},
  {&(_ZTV6dd7761[17]),  17,19},
  {&(_tg__ZTV5cc761__6dd7761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__6dd7761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static VTBL_ENTRY alt_thunk_names922[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7761 = {  "dd7761", // class name
  bases_dd7761, 3,
  &(vtc_dd7761[0]), // expected_vtbl_contents
  &(vtt_dd7761[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7761),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names922,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07761  : dd7761 {
  int e;
  ~ee07761(); // tgen
  ee07761(); // tgen
};
//SIG(1 ee07761) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee07761 ::~ee07761(){ note_dtor("ee07761", this);} // tgen
ee07761 ::ee07761(){ note_ctor("ee07761", this);} // tgen

static void Test_ee07761()
{
  extern Class_Descriptor cd_ee07761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07761, buf);
    ee07761 *dp, &lv = *(dp=new (buf) ee07761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee07761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee07761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(16,12), "ee07761");
    check_base_class_offset(lv, (dd7761*), 0, "ee07761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07761.e");
    test_class_info(&lv, &cd_ee07761);
    dp->~ee07761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07761(Test_ee07761, "ee07761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07761C1Ev();
extern void _ZN7ee07761D1Ev();
Name_Map name_map_ee07761[] = {
  NSPAIR(_ZN7ee07761C1Ev),
  NSPAIR(_ZN7ee07761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee07761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern VTBL_ENTRY _ZTV7ee07761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee07761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee07761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee07761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee07761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee07761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee07761[] = {
  {&(_ZTV7ee07761[4]),  4,19},
  {&(_tg__ZTV6dd7761__7ee07761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee07761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee07761[4]),  4,6},
  {&(_ZTV7ee07761[11]),  11,19},
  {&(_ZTV7ee07761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee07761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee07761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07761[];
extern  VTBL_ENTRY _ZTV7ee07761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07761[];
static VTBL_ENTRY alt_thunk_names923[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07761 = {  "ee07761", // class name
  bases_ee07761, 4,
  &(vtc_ee07761[0]), // expected_vtbl_contents
  &(vtt_ee07761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names923,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17761  : virtual dd7761 {
  int e;
  ~ee17761(); // tgen
  ee17761(); // tgen
};
//SIG(1 ee17761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee17761 ::~ee17761(){ note_dtor("ee17761", this);} // tgen
ee17761 ::ee17761(){ note_ctor("ee17761", this);} // tgen

static void Test_ee17761()
{
  extern Class_Descriptor cd_ee17761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17761, buf);
    ee17761 *dp, &lv = *(dp=new (buf) ee17761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee17761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee17761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(32,16), "ee17761");
    check_base_class_offset(lv, (dd7761*), ABISELECT(16,8), "ee17761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17761.e");
    test_class_info(&lv, &cd_ee17761);
    dp->~ee17761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17761(Test_ee17761, "ee17761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17761C1Ev();
extern void _ZN7ee17761D1Ev();
Name_Map name_map_ee17761[] = {
  NSPAIR(_ZN7ee17761C1Ev),
  NSPAIR(_ZN7ee17761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee17761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17761[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern VTBL_ENTRY _ZTV7ee17761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee17761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee17761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee17761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee17761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee17761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee17761[] = {
  {&(_ZTV7ee17761[5]),  5,26},
  {&(_ZTV7ee17761[11]),  11,26},
  {&(_ZTV7ee17761[18]),  18,26},
  {&(_ZTV7ee17761[24]),  24,26},
  {&(_tg__ZTV6dd7761__7ee17761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee17761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee17761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee17761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee17761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17761[];
extern  VTBL_ENTRY _ZTV7ee17761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17761[];
static VTBL_ENTRY alt_thunk_names924[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17761 = {  "ee17761", // class name
  bases_ee17761, 4,
  &(vtc_ee17761[0]), // expected_vtbl_contents
  &(vtt_ee17761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17761),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names924,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27761  : dd7761 {
  int e;
  virtual void  foo(); // _ZN7ee277613fooEv
  ~ee27761(); // tgen
  ee27761(); // tgen
};
//SIG(1 ee27761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27761 ::foo(){vfunc_called(this, "_ZN7ee277613fooEv");}
ee27761 ::~ee27761(){ note_dtor("ee27761", this);} // tgen
ee27761 ::ee27761(){ note_ctor("ee27761", this);} // tgen

static void Test_ee27761()
{
  extern Class_Descriptor cd_ee27761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27761, buf);
    ee27761 *dp, &lv = *(dp=new (buf) ee27761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee27761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee27761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(16,12), "ee27761");
    check_base_class_offset(lv, (dd7761*), 0, "ee27761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27761.e");
    test_class_info(&lv, &cd_ee27761);
    dp->~ee27761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27761(Test_ee27761, "ee27761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27761C1Ev();
extern void _ZN7ee27761D1Ev();
Name_Map name_map_ee27761[] = {
  NSPAIR(_ZN7ee27761C1Ev),
  NSPAIR(_ZN7ee27761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee27761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27761[];
extern void _ZN6dd77613barEv();
extern void _ZN7ee277613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee277613fooEv,_ZTv0_n16_N7ee277613fooEv)();
extern void ABISELECT(_ZThn16_N7ee277613fooEv,_ZThn12_N7ee277613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee277613fooEv,_ZTv0_n12_N7ee277613fooEv)();
extern void ABISELECT(_ZThn32_N7ee277613fooEv,_ZThn20_N7ee277613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN7ee277613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee277613fooEv,_ZTv0_n16_N7ee277613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee277613fooEv,_ZTv0_n12_N7ee277613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern VTBL_ENTRY _ZTV7ee27761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee27761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee27761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee27761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee27761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee27761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee27761[] = {
  {&(_ZTV7ee27761[4]),  4,19},
  {&(_tg__ZTV6dd7761__7ee27761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee27761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee27761[4]),  4,6},
  {&(_ZTV7ee27761[11]),  11,19},
  {&(_ZTV7ee27761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee27761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee27761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27761[];
extern  VTBL_ENTRY _ZTV7ee27761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27761[];
static VTBL_ENTRY alt_thunk_names925[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee277613fooEv,_ZTv0_n12_N7ee277613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee277613fooEv,_ZThn20_N7ee277613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee277613fooEv,_ZTv0_n16_N7ee277613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee277613fooEv,_ZThn12_N7ee277613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27761 = {  "ee27761", // class name
  bases_ee27761, 4,
  &(vtc_ee27761[0]), // expected_vtbl_contents
  &(vtt_ee27761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names925,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37761  : virtual dd7761 {
  int e;
  virtual void  foo(); // _ZN7ee377613fooEv
  ~ee37761(); // tgen
  ee37761(); // tgen
};
//SIG(1 ee37761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37761 ::foo(){vfunc_called(this, "_ZN7ee377613fooEv");}
ee37761 ::~ee37761(){ note_dtor("ee37761", this);} // tgen
ee37761 ::ee37761(){ note_ctor("ee37761", this);} // tgen

static void Test_ee37761()
{
  extern Class_Descriptor cd_ee37761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37761, buf);
    ee37761 *dp, &lv = *(dp=new (buf) ee37761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee37761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee37761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(32,16), "ee37761");
    check_base_class_offset(lv, (dd7761*), ABISELECT(16,8), "ee37761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37761.e");
    test_class_info(&lv, &cd_ee37761);
    dp->~ee37761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37761(Test_ee37761, "ee37761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37761C1Ev();
extern void _ZN7ee37761D1Ev();
Name_Map name_map_ee37761[] = {
  NSPAIR(_ZN7ee37761C1Ev),
  NSPAIR(_ZN7ee37761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee37761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    21, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37761[];
extern void _ZN7ee377613fooEv();
extern void _ZN6dd77613barEv();
extern void ABISELECT(_ZTv0_n48_N7ee377613fooEv,_ZTv0_n24_N7ee377613fooEv)();
extern void ABISELECT(_ZThn16_N7ee377613fooEv,_ZThn8_N7ee377613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee377613fooEv,_ZTv0_n16_N7ee377613fooEv)();
extern void ABISELECT(_ZThn32_N7ee377613fooEv,_ZThn16_N7ee377613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee377613fooEv,_ZTv0_n12_N7ee377613fooEv)();
extern void ABISELECT(_ZThn48_N7ee377613fooEv,_ZThn24_N7ee377613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37761[0]),
  (VTBL_ENTRY)&_ZN7ee377613fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee377613fooEv,_ZTv0_n24_N7ee377613fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee377613fooEv,_ZTv0_n16_N7ee377613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee377613fooEv,_ZTv0_n12_N7ee377613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern VTBL_ENTRY _ZTV7ee37761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee37761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee37761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee37761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee37761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee37761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee37761[] = {
  {&(_ZTV7ee37761[5]),  5,27},
  {&(_ZTV7ee37761[12]),  12,27},
  {&(_ZTV7ee37761[19]),  19,27},
  {&(_ZTV7ee37761[25]),  25,27},
  {&(_tg__ZTV6dd7761__7ee37761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee37761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee37761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee37761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee37761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37761[];
extern  VTBL_ENTRY _ZTV7ee37761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37761[];
static VTBL_ENTRY alt_thunk_names926[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee377613fooEv,_ZTv0_n12_N7ee377613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee377613fooEv,_ZThn24_N7ee377613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee377613fooEv,_ZTv0_n16_N7ee377613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee377613fooEv,_ZThn16_N7ee377613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee377613fooEv,_ZTv0_n24_N7ee377613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee377613fooEv,_ZThn8_N7ee377613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37761 = {  "ee37761", // class name
  bases_ee37761, 4,
  &(vtc_ee37761[0]), // expected_vtbl_contents
  &(vtt_ee37761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37761),27, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names926,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47761  : dd7761 {
  int e;
  virtual void  bar(); // _ZN7ee477613barEv
  ~ee47761(); // tgen
  ee47761(); // tgen
};
//SIG(1 ee47761) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47761 ::bar(){vfunc_called(this, "_ZN7ee477613barEv");}
ee47761 ::~ee47761(){ note_dtor("ee47761", this);} // tgen
ee47761 ::ee47761(){ note_ctor("ee47761", this);} // tgen

static void Test_ee47761()
{
  extern Class_Descriptor cd_ee47761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47761, buf);
    ee47761 *dp, &lv = *(dp=new (buf) ee47761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee47761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee47761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(16,12), "ee47761");
    check_base_class_offset(lv, (dd7761*), 0, "ee47761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47761.e");
    test_class_info(&lv, &cd_ee47761);
    dp->~ee47761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47761(Test_ee47761, "ee47761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47761C1Ev();
extern void _ZN7ee47761D1Ev();
Name_Map name_map_ee47761[] = {
  NSPAIR(_ZN7ee47761C1Ev),
  NSPAIR(_ZN7ee47761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee47761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47761[];
extern void _ZN7ee477613barEv();
extern void _ZN6dd77613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee477613barEv,_ZTv0_n20_N7ee477613barEv)();
extern void ABISELECT(_ZThn16_N7ee477613barEv,_ZThn12_N7ee477613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee477613barEv,_ZTv0_n16_N7ee477613barEv)();
extern void ABISELECT(_ZThn32_N7ee477613barEv,_ZThn20_N7ee477613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47761[0]),
  (VTBL_ENTRY)&_ZN7ee477613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee477613barEv,_ZTv0_n20_N7ee477613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee477613barEv,_ZTv0_n16_N7ee477613barEv),
};
extern VTBL_ENTRY _ZTV7ee47761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee47761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee47761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee47761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee47761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee47761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee47761[] = {
  {&(_ZTV7ee47761[4]),  4,19},
  {&(_tg__ZTV6dd7761__7ee47761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee47761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee47761[4]),  4,6},
  {&(_ZTV7ee47761[11]),  11,19},
  {&(_ZTV7ee47761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee47761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee47761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47761[];
extern  VTBL_ENTRY _ZTV7ee47761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47761[];
static VTBL_ENTRY alt_thunk_names927[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee477613barEv,_ZTv0_n16_N7ee477613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee477613barEv,_ZThn20_N7ee477613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee477613barEv,_ZTv0_n20_N7ee477613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee477613barEv,_ZThn12_N7ee477613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47761 = {  "ee47761", // class name
  bases_ee47761, 4,
  &(vtc_ee47761[0]), // expected_vtbl_contents
  &(vtt_ee47761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names927,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57761  : virtual dd7761 {
  int e;
  virtual void  bar(); // _ZN7ee577613barEv
  ~ee57761(); // tgen
  ee57761(); // tgen
};
//SIG(1 ee57761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57761 ::bar(){vfunc_called(this, "_ZN7ee577613barEv");}
ee57761 ::~ee57761(){ note_dtor("ee57761", this);} // tgen
ee57761 ::ee57761(){ note_ctor("ee57761", this);} // tgen

static void Test_ee57761()
{
  extern Class_Descriptor cd_ee57761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57761, buf);
    ee57761 *dp, &lv = *(dp=new (buf) ee57761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee57761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee57761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(32,16), "ee57761");
    check_base_class_offset(lv, (dd7761*), ABISELECT(16,8), "ee57761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57761.e");
    test_class_info(&lv, &cd_ee57761);
    dp->~ee57761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57761(Test_ee57761, "ee57761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57761C1Ev();
extern void _ZN7ee57761D1Ev();
Name_Map name_map_ee57761[] = {
  NSPAIR(_ZN7ee57761C1Ev),
  NSPAIR(_ZN7ee57761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee57761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    21, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57761[];
extern void _ZN7ee577613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee577613barEv,_ZTv0_n20_N7ee577613barEv)();
extern void ABISELECT(_ZThn16_N7ee577613barEv,_ZThn8_N7ee577613barEv)() __attribute__((weak));
extern void _ZN6dd77613fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee577613barEv,_ZTv0_n20_N7ee577613barEv)();
extern void ABISELECT(_ZThn32_N7ee577613barEv,_ZThn16_N7ee577613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee577613barEv,_ZTv0_n16_N7ee577613barEv)();
extern void ABISELECT(_ZThn48_N7ee577613barEv,_ZThn24_N7ee577613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57761[0]),
  (VTBL_ENTRY)&_ZN7ee577613barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee577613barEv,_ZTv0_n20_N7ee577613barEv),
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee577613barEv,_ZTv0_n20_N7ee577613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee577613barEv,_ZTv0_n16_N7ee577613barEv),
};
extern VTBL_ENTRY _ZTV7ee57761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee57761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee57761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee57761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee57761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee57761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee57761[] = {
  {&(_ZTV7ee57761[5]),  5,27},
  {&(_ZTV7ee57761[12]),  12,27},
  {&(_ZTV7ee57761[19]),  19,27},
  {&(_ZTV7ee57761[25]),  25,27},
  {&(_tg__ZTV6dd7761__7ee57761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee57761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee57761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee57761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee57761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57761[];
extern  VTBL_ENTRY _ZTV7ee57761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57761[];
static VTBL_ENTRY alt_thunk_names928[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee577613barEv,_ZTv0_n16_N7ee577613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee577613barEv,_ZThn24_N7ee577613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee577613barEv,_ZTv0_n20_N7ee577613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee577613barEv,_ZThn16_N7ee577613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee577613barEv,_ZThn8_N7ee577613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57761 = {  "ee57761", // class name
  bases_ee57761, 4,
  &(vtc_ee57761[0]), // expected_vtbl_contents
  &(vtt_ee57761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57761),27, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names928,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67761  : dd7761 {
  int e;
  virtual void  foo(); // _ZN7ee677613fooEv
  virtual void  bar(); // _ZN7ee677613barEv
  ~ee67761(); // tgen
  ee67761(); // tgen
};
//SIG(1 ee67761) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67761 ::foo(){vfunc_called(this, "_ZN7ee677613fooEv");}
void  ee67761 ::bar(){vfunc_called(this, "_ZN7ee677613barEv");}
ee67761 ::~ee67761(){ note_dtor("ee67761", this);} // tgen
ee67761 ::ee67761(){ note_ctor("ee67761", this);} // tgen

static void Test_ee67761()
{
  extern Class_Descriptor cd_ee67761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67761, buf);
    ee67761 *dp, &lv = *(dp=new (buf) ee67761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(32,20), "ee67761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(32,20), "ee67761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(16,12), "ee67761");
    check_base_class_offset(lv, (dd7761*), 0, "ee67761");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67761.e");
    test_class_info(&lv, &cd_ee67761);
    dp->~ee67761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67761(Test_ee67761, "ee67761", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67761C1Ev();
extern void _ZN7ee67761D1Ev();
Name_Map name_map_ee67761[] = {
  NSPAIR(_ZN7ee67761C1Ev),
  NSPAIR(_ZN7ee67761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee67761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67761[];
extern void _ZN7ee677613barEv();
extern void _ZN7ee677613fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee677613fooEv,_ZTv0_n16_N7ee677613fooEv)();
extern void ABISELECT(_ZThn16_N7ee677613fooEv,_ZThn12_N7ee677613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee677613barEv,_ZTv0_n20_N7ee677613barEv)();
extern void ABISELECT(_ZThn16_N7ee677613barEv,_ZThn12_N7ee677613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee677613fooEv,_ZTv0_n12_N7ee677613fooEv)();
extern void ABISELECT(_ZThn32_N7ee677613fooEv,_ZThn20_N7ee677613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee677613barEv,_ZTv0_n16_N7ee677613barEv)();
extern void ABISELECT(_ZThn32_N7ee677613barEv,_ZThn20_N7ee677613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67761[0]),
  (VTBL_ENTRY)&_ZN7ee677613barEv,
  (VTBL_ENTRY)&_ZN7ee677613fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee677613fooEv,_ZTv0_n16_N7ee677613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee677613barEv,_ZTv0_n20_N7ee677613barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee677613fooEv,_ZTv0_n12_N7ee677613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee677613barEv,_ZTv0_n16_N7ee677613barEv),
};
extern VTBL_ENTRY _ZTV7ee67761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee67761[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee67761[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee67761[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee67761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee67761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee67761[] = {
  {&(_ZTV7ee67761[4]),  4,19},
  {&(_tg__ZTV6dd7761__7ee67761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee67761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee67761[4]),  4,6},
  {&(_ZTV7ee67761[11]),  11,19},
  {&(_ZTV7ee67761[17]),  17,19},
  {&(_tg__ZTV5cc761__7ee67761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee67761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67761[];
extern  VTBL_ENTRY _ZTV7ee67761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67761[];
static VTBL_ENTRY alt_thunk_names929[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn20_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn20_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn12_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn12_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee677613barEv,_ZTv0_n16_N7ee677613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee677613barEv,_ZThn20_N7ee677613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee677613fooEv,_ZTv0_n12_N7ee677613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee677613fooEv,_ZThn20_N7ee677613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee677613barEv,_ZTv0_n20_N7ee677613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee677613barEv,_ZThn12_N7ee677613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee677613fooEv,_ZTv0_n16_N7ee677613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee677613fooEv,_ZThn12_N7ee677613fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67761 = {  "ee67761", // class name
  bases_ee67761, 4,
  &(vtc_ee67761[0]), // expected_vtbl_contents
  &(vtt_ee67761[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67761),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67761),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67761),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names929,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77761  : virtual dd7761 {
  int e;
  virtual void  foo(); // _ZN7ee777613fooEv
  virtual void  bar(); // _ZN7ee777613barEv
  ~ee77761(); // tgen
  ee77761(); // tgen
};
//SIG(1 ee77761) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77761 ::foo(){vfunc_called(this, "_ZN7ee777613fooEv");}
void  ee77761 ::bar(){vfunc_called(this, "_ZN7ee777613barEv");}
ee77761 ::~ee77761(){ note_dtor("ee77761", this);} // tgen
ee77761 ::ee77761(){ note_ctor("ee77761", this);} // tgen

static void Test_ee77761()
{
  extern Class_Descriptor cd_ee77761;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77761, buf);
    ee77761 *dp, &lv = *(dp=new (buf) ee77761());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77761)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77761)");
    check_base_class_offset(lv, (aa1*)(bb61*), ABISELECT(48,24), "ee77761");
    check_base_class_offset(lv, (bb61*)(cc761*), ABISELECT(48,24), "ee77761");
    check_base_class_offset(lv, (cc761*)(dd7761*), ABISELECT(32,16), "ee77761");
    check_base_class_offset(lv, (dd7761*), ABISELECT(16,8), "ee77761");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77761.e");
    test_class_info(&lv, &cd_ee77761);
    dp->~ee77761();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77761(Test_ee77761, "ee77761", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77761C1Ev();
extern void _ZN7ee77761D1Ev();
Name_Map name_map_ee77761[] = {
  NSPAIR(_ZN7ee77761C1Ev),
  NSPAIR(_ZN7ee77761D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa1;
extern VTBL_ENTRY _ZTI3aa1[];
extern  VTBL_ENTRY _ZTV3aa1[];
extern Class_Descriptor cd_bb61;
extern VTBL_ENTRY _ZTI4bb61[];
extern  VTBL_ENTRY _ZTV4bb61[];
extern Class_Descriptor cd_cc761;
extern VTBL_ENTRY _ZTI5cc761[];
extern  VTBL_ENTRY _ZTV5cc761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc761[];
extern Class_Descriptor cd_dd7761;
extern VTBL_ENTRY _ZTI6dd7761[];
extern  VTBL_ENTRY _ZTV6dd7761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7761[];
static Base_Class bases_ee77761[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa1,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb61,    ABISELECT(48,24), //bcp->offset
    22, //bcp->virtual_function_table_offset
    4, //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_cc761,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7761,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77761[];
extern void _ZN7ee777613fooEv();
extern void _ZN7ee777613barEv();
extern void ABISELECT(_ZTv0_n40_N7ee777613barEv,_ZTv0_n20_N7ee777613barEv)();
extern void ABISELECT(_ZThn16_N7ee777613barEv,_ZThn8_N7ee777613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee777613fooEv,_ZTv0_n24_N7ee777613fooEv)();
extern void ABISELECT(_ZThn16_N7ee777613fooEv,_ZThn8_N7ee777613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee777613fooEv,_ZTv0_n16_N7ee777613fooEv)();
extern void ABISELECT(_ZThn32_N7ee777613fooEv,_ZThn16_N7ee777613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee777613barEv,_ZTv0_n20_N7ee777613barEv)();
extern void ABISELECT(_ZThn32_N7ee777613barEv,_ZThn16_N7ee777613barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee777613fooEv,_ZTv0_n12_N7ee777613fooEv)();
extern void ABISELECT(_ZThn48_N7ee777613fooEv,_ZThn24_N7ee777613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee777613barEv,_ZTv0_n16_N7ee777613barEv)();
extern void ABISELECT(_ZThn48_N7ee777613barEv,_ZThn24_N7ee777613barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77761[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77761[0]),
  (VTBL_ENTRY)&_ZN7ee777613fooEv,
  (VTBL_ENTRY)&_ZN7ee777613barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee777613barEv,_ZTv0_n20_N7ee777613barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee777613fooEv,_ZTv0_n24_N7ee777613fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee777613fooEv,_ZTv0_n16_N7ee777613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee777613barEv,_ZTv0_n20_N7ee777613barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee777613fooEv,_ZTv0_n12_N7ee777613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee777613barEv,_ZTv0_n16_N7ee777613barEv),
};
extern VTBL_ENTRY _ZTV7ee77761[];
extern void _ZN6dd77613barEv();
extern void _ZN6dd77613fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7761__7ee77761[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&_ZN6dd77613barEv,
  (VTBL_ENTRY)&_ZN6dd77613fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv)();
extern void ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv)();
extern void ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc761__6dd7761__7ee77761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv)();
extern void ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv)();
extern void ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__6dd7761__7ee77761[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv),
};
extern void _ZN5cc7613fooEv();
extern void _ZN5cc7613barEv();
static  VTBL_ENTRY _tg__ZTV5cc761__7ee77761[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&_ZN5cc7613fooEv,
  (VTBL_ENTRY)&_ZN5cc7613barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv)();
extern void ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv)();
extern void ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb61__5cc761__7ee77761[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc761[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv),
};
static  VTT_ENTRY vtt_ee77761[] = {
  {&(_ZTV7ee77761[5]),  5,28},
  {&(_ZTV7ee77761[13]),  13,28},
  {&(_ZTV7ee77761[20]),  20,28},
  {&(_ZTV7ee77761[26]),  26,28},
  {&(_tg__ZTV6dd7761__7ee77761[4]),  4,6},
  {&(_tg__ZTV5cc761__6dd7761__7ee77761[5]),  5,7},
  {&(_tg__ZTV4bb61__6dd7761__7ee77761[4]),  4,6},
  {&(_tg__ZTV5cc761__7ee77761[3]),  3,5},
  {&(_tg__ZTV4bb61__5cc761__7ee77761[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77761[];
extern  VTBL_ENTRY _ZTV7ee77761[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77761[];
static VTBL_ENTRY alt_thunk_names930[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7613barEv,_ZTv0_n16_N5cc7613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613barEv,_ZThn8_N5cc7613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7613fooEv,_ZTv0_n12_N5cc7613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7613fooEv,_ZThn8_N5cc7613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613barEv,_ZTv0_n16_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613barEv,_ZThn16_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77613fooEv,_ZTv0_n12_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77613fooEv,_ZThn16_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77613barEv,_ZTv0_n20_N6dd77613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613barEv,_ZThn8_N6dd77613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77613fooEv,_ZTv0_n16_N6dd77613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77613fooEv,_ZThn8_N6dd77613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee777613barEv,_ZTv0_n16_N7ee777613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee777613barEv,_ZThn24_N7ee777613barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee777613fooEv,_ZTv0_n12_N7ee777613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee777613fooEv,_ZThn24_N7ee777613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee777613fooEv,_ZTv0_n16_N7ee777613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee777613fooEv,_ZThn16_N7ee777613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee777613fooEv,_ZTv0_n24_N7ee777613fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee777613fooEv,_ZThn8_N7ee777613fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee777613barEv,_ZTv0_n20_N7ee777613barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee777613barEv,_ZThn16_N7ee777613barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee777613barEv,_ZThn8_N7ee777613barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77761 = {  "ee77761", // class name
  bases_ee77761, 4,
  &(vtc_ee77761[0]), // expected_vtbl_contents
  &(vtt_ee77761[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77761),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77761),28, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77761),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names930,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  bb62  : aa2 {
  int b;
  virtual void  bar(); // _ZN4bb623barEv
  virtual void  foo(); // _ZN4bb623fooEv
  ~bb62(); // tgen
  bb62(); // tgen
};
//SIG(-1 bb62) C1{ BC2{ v2 v1 Fi} v1 v2 Fi}


void  bb62 ::bar(){vfunc_called(this, "_ZN4bb623barEv");}
void  bb62 ::foo(){vfunc_called(this, "_ZN4bb623fooEv");}
bb62 ::~bb62(){ note_dtor("bb62", this);} // tgen
bb62 ::bb62(){ note_ctor("bb62", this);} // tgen

static void Test_bb62()
{
  extern Class_Descriptor cd_bb62;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(3,4)];
    init_test(&cd_bb62, buf);
    bb62 *dp, &lv = *(dp=new (buf) bb62());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,12), "sizeof(bb62)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(bb62)");
    check_base_class_offset(lv, (aa2*), 0, "bb62");
    check_field_offset(lv, b, ABISELECT(12,8), "bb62.b");
    test_class_info(&lv, &cd_bb62);
    dp->~bb62();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vbb62(Test_bb62, "bb62", ABISELECT(16,12));

#else // __cplusplus

extern void _ZN4bb62C1Ev();
extern void _ZN4bb62D1Ev();
Name_Map name_map_bb62[] = {
  NSPAIR(_ZN4bb62C1Ev),
  NSPAIR(_ZN4bb62D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
static Base_Class bases_bb62[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4bb62[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_bb62[] = {
  0,
  (VTBL_ENTRY)&(_ZTI4bb62[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
Class_Descriptor cd_bb62 = {  "bb62", // class name
  bases_bb62, 1,
  &(vtc_bb62[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,12), // object size
  NSPAIRA(_ZTI4bb62),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV4bb62),4, //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  cc062  : bb62 {
  int c;
  ~cc062(); // tgen
  cc062(); // tgen
};
//SIG(-1 cc062) C1{ BC2{ BC3{ v2 v1 Fi} v1 v2 Fi} Fi}


cc062 ::~cc062(){ note_dtor("cc062", this);} // tgen
cc062 ::cc062(){ note_ctor("cc062", this);} // tgen

static void Test_cc062()
{
  extern Class_Descriptor cd_cc062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc062, buf);
    cc062 *dp, &lv = *(dp=new (buf) cc062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc062)");
    check_base_class_offset(lv, (aa2*)(bb62*), 0, "cc062");
    check_base_class_offset(lv, (bb62*), 0, "cc062");
    check_field_offset(lv, c, ABISELECT(16,12), "cc062.c");
    test_class_info(&lv, &cd_cc062);
    dp->~cc062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc062(Test_cc062, "cc062", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc062C1Ev();
extern void _ZN5cc062D1Ev();
Name_Map name_map_cc062[] = {
  NSPAIR(_ZN5cc062C1Ev),
  NSPAIR(_ZN5cc062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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},
  {0}};
extern VTBL_ENTRY _ZTI5cc062[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_cc062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
Class_Descriptor cd_cc062 = {  "cc062", // class name
  bases_cc062, 2,
  &(vtc_cc062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc062),4, //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  dd0062  : cc062 {
  int d;
  ~dd0062(); // tgen
  dd0062(); // tgen
};
//SIG(-1 dd0062) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} Fi}


dd0062 ::~dd0062(){ note_dtor("dd0062", this);} // tgen
dd0062 ::dd0062(){ note_ctor("dd0062", this);} // tgen

static void Test_dd0062()
{
  extern Class_Descriptor cd_dd0062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0062, buf);
    dd0062 *dp, &lv = *(dp=new (buf) dd0062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), 0, "dd0062");
    check_base_class_offset(lv, (bb62*)(cc062*), 0, "dd0062");
    check_base_class_offset(lv, (cc062*), 0, "dd0062");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0062.d");
    test_class_info(&lv, &cd_dd0062);
    dp->~dd0062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0062(Test_dd0062, "dd0062", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0062C1Ev();
extern void _ZN6dd0062D1Ev();
Name_Map name_map_dd0062[] = {
  NSPAIR(_ZN6dd0062C1Ev),
  NSPAIR(_ZN6dd0062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd0062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd0062[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd0062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
Class_Descriptor cd_dd0062 = {  "dd0062", // class name
  bases_dd0062, 3,
  &(vtc_dd0062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0062),4, //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  ee00062  : dd0062 {
  int e;
  ~ee00062(); // tgen
  ee00062(); // tgen
};
//SIG(1 ee00062) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee00062 ::~ee00062(){ note_dtor("ee00062", this);} // tgen
ee00062 ::ee00062(){ note_ctor("ee00062", this);} // tgen

static void Test_ee00062()
{
  extern Class_Descriptor cd_ee00062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00062, buf);
    ee00062 *dp, &lv = *(dp=new (buf) ee00062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), 0, "ee00062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), 0, "ee00062");
    check_base_class_offset(lv, (cc062*)(dd0062*), 0, "ee00062");
    check_base_class_offset(lv, (dd0062*), 0, "ee00062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00062.e");
    test_class_info(&lv, &cd_ee00062);
    dp->~ee00062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00062(Test_ee00062, "ee00062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00062C1Ev();
extern void _ZN7ee00062D1Ev();
Name_Map name_map_ee00062[] = {
  NSPAIR(_ZN7ee00062C1Ev),
  NSPAIR(_ZN7ee00062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee00062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00062[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee00062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee00062[];
extern  VTBL_ENTRY _ZTV7ee00062[];
Class_Descriptor cd_ee00062 = {  "ee00062", // class name
  bases_ee00062, 4,
  &(vtc_ee00062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00062),4, //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  ee10062  : virtual dd0062 {
  int e;
  ~ee10062(); // tgen
  ee10062(); // tgen
};
//SIG(1 ee10062) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee10062 ::~ee10062(){ note_dtor("ee10062", this);} // tgen
ee10062 ::ee10062(){ note_ctor("ee10062", this);} // tgen

static void Test_ee10062()
{
  extern Class_Descriptor cd_ee10062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10062, buf);
    ee10062 *dp, &lv = *(dp=new (buf) ee10062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee10062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee10062");
    check_base_class_offset(lv, (cc062*)(dd0062*), ABISELECT(16,8), "ee10062");
    check_base_class_offset(lv, (dd0062*), ABISELECT(16,8), "ee10062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10062.e");
    test_class_info(&lv, &cd_ee10062);
    dp->~ee10062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10062(Test_ee10062, "ee10062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10062C1Ev();
extern void _ZN7ee10062D1Ev();
Name_Map name_map_ee10062[] = {
  NSPAIR(_ZN7ee10062C1Ev),
  NSPAIR(_ZN7ee10062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee10062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10062[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee10062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10062[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee10062[];
static  VTT_ENTRY vtt_ee10062[] = {
  {&(_ZTV7ee10062[3]),  3,9},
  {&(_ZTV7ee10062[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10062[];
extern  VTBL_ENTRY _ZTV7ee10062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10062[];
Class_Descriptor cd_ee10062 = {  "ee10062", // class name
  bases_ee10062, 4,
  &(vtc_ee10062[0]), // expected_vtbl_contents
  &(vtt_ee10062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10062),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10062),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  ee20062  : dd0062 {
  int e;
  virtual void  foo(); // _ZN7ee200623fooEv
  ~ee20062(); // tgen
  ee20062(); // tgen
};
//SIG(1 ee20062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee20062 ::foo(){vfunc_called(this, "_ZN7ee200623fooEv");}
ee20062 ::~ee20062(){ note_dtor("ee20062", this);} // tgen
ee20062 ::ee20062(){ note_ctor("ee20062", this);} // tgen

static void Test_ee20062()
{
  extern Class_Descriptor cd_ee20062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20062, buf);
    ee20062 *dp, &lv = *(dp=new (buf) ee20062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), 0, "ee20062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), 0, "ee20062");
    check_base_class_offset(lv, (cc062*)(dd0062*), 0, "ee20062");
    check_base_class_offset(lv, (dd0062*), 0, "ee20062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20062.e");
    test_class_info(&lv, &cd_ee20062);
    dp->~ee20062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20062(Test_ee20062, "ee20062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20062C1Ev();
extern void _ZN7ee20062D1Ev();
Name_Map name_map_ee20062[] = {
  NSPAIR(_ZN7ee20062C1Ev),
  NSPAIR(_ZN7ee20062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee20062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20062[];
extern void _ZN7ee200623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee20062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20062[0]),
  (VTBL_ENTRY)&_ZN7ee200623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee20062[];
extern  VTBL_ENTRY _ZTV7ee20062[];
Class_Descriptor cd_ee20062 = {  "ee20062", // class name
  bases_ee20062, 4,
  &(vtc_ee20062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20062),4, //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  ee30062  : virtual dd0062 {
  int e;
  virtual void  foo(); // _ZN7ee300623fooEv
  ~ee30062(); // tgen
  ee30062(); // tgen
};
//SIG(1 ee30062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee30062 ::foo(){vfunc_called(this, "_ZN7ee300623fooEv");}
ee30062 ::~ee30062(){ note_dtor("ee30062", this);} // tgen
ee30062 ::ee30062(){ note_ctor("ee30062", this);} // tgen

static void Test_ee30062()
{
  extern Class_Descriptor cd_ee30062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30062, buf);
    ee30062 *dp, &lv = *(dp=new (buf) ee30062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee30062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee30062");
    check_base_class_offset(lv, (cc062*)(dd0062*), ABISELECT(16,8), "ee30062");
    check_base_class_offset(lv, (dd0062*), ABISELECT(16,8), "ee30062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30062.e");
    test_class_info(&lv, &cd_ee30062);
    dp->~ee30062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30062(Test_ee30062, "ee30062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30062C1Ev();
extern void _ZN7ee30062D1Ev();
Name_Map name_map_ee30062[] = {
  NSPAIR(_ZN7ee30062C1Ev),
  NSPAIR(_ZN7ee30062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee30062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30062[];
extern void _ZN7ee300623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee300623fooEv,_ZTv0_n12_N7ee300623fooEv)();
extern void ABISELECT(_ZThn16_N7ee300623fooEv,_ZThn8_N7ee300623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee30062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30062[0]),
  (VTBL_ENTRY)&_ZN7ee300623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee300623fooEv,_ZTv0_n12_N7ee300623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee30062[];
static  VTT_ENTRY vtt_ee30062[] = {
  {&(_ZTV7ee30062[3]),  3,10},
  {&(_ZTV7ee30062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30062[];
extern  VTBL_ENTRY _ZTV7ee30062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30062[];
static VTBL_ENTRY alt_thunk_names931[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee300623fooEv,_ZTv0_n12_N7ee300623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee300623fooEv,_ZThn8_N7ee300623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30062 = {  "ee30062", // class name
  bases_ee30062, 4,
  &(vtc_ee30062[0]), // expected_vtbl_contents
  &(vtt_ee30062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names931,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40062  : dd0062 {
  int e;
  virtual void  bar(); // _ZN7ee400623barEv
  ~ee40062(); // tgen
  ee40062(); // tgen
};
//SIG(1 ee40062) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee40062 ::bar(){vfunc_called(this, "_ZN7ee400623barEv");}
ee40062 ::~ee40062(){ note_dtor("ee40062", this);} // tgen
ee40062 ::ee40062(){ note_ctor("ee40062", this);} // tgen

static void Test_ee40062()
{
  extern Class_Descriptor cd_ee40062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40062, buf);
    ee40062 *dp, &lv = *(dp=new (buf) ee40062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), 0, "ee40062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), 0, "ee40062");
    check_base_class_offset(lv, (cc062*)(dd0062*), 0, "ee40062");
    check_base_class_offset(lv, (dd0062*), 0, "ee40062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40062.e");
    test_class_info(&lv, &cd_ee40062);
    dp->~ee40062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40062(Test_ee40062, "ee40062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40062C1Ev();
extern void _ZN7ee40062D1Ev();
Name_Map name_map_ee40062[] = {
  NSPAIR(_ZN7ee40062C1Ev),
  NSPAIR(_ZN7ee40062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee40062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40062[];
extern void _ZN4bb623fooEv();
extern void _ZN7ee400623barEv();
static  VTBL_ENTRY vtc_ee40062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN7ee400623barEv,
};
extern VTBL_ENTRY _ZTI7ee40062[];
extern  VTBL_ENTRY _ZTV7ee40062[];
Class_Descriptor cd_ee40062 = {  "ee40062", // class name
  bases_ee40062, 4,
  &(vtc_ee40062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40062),4, //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  ee50062  : virtual dd0062 {
  int e;
  virtual void  bar(); // _ZN7ee500623barEv
  ~ee50062(); // tgen
  ee50062(); // tgen
};
//SIG(1 ee50062) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee50062 ::bar(){vfunc_called(this, "_ZN7ee500623barEv");}
ee50062 ::~ee50062(){ note_dtor("ee50062", this);} // tgen
ee50062 ::ee50062(){ note_ctor("ee50062", this);} // tgen

static void Test_ee50062()
{
  extern Class_Descriptor cd_ee50062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50062, buf);
    ee50062 *dp, &lv = *(dp=new (buf) ee50062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee50062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee50062");
    check_base_class_offset(lv, (cc062*)(dd0062*), ABISELECT(16,8), "ee50062");
    check_base_class_offset(lv, (dd0062*), ABISELECT(16,8), "ee50062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50062.e");
    test_class_info(&lv, &cd_ee50062);
    dp->~ee50062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50062(Test_ee50062, "ee50062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50062C1Ev();
extern void _ZN7ee50062D1Ev();
Name_Map name_map_ee50062[] = {
  NSPAIR(_ZN7ee50062C1Ev),
  NSPAIR(_ZN7ee50062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee50062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50062[];
extern void _ZN7ee500623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee500623barEv,_ZTv0_n16_N7ee500623barEv)();
extern void ABISELECT(_ZThn16_N7ee500623barEv,_ZThn8_N7ee500623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50062[0]),
  (VTBL_ENTRY)&_ZN7ee500623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee500623barEv,_ZTv0_n16_N7ee500623barEv),
};
extern VTBL_ENTRY _ZTV7ee50062[];
static  VTT_ENTRY vtt_ee50062[] = {
  {&(_ZTV7ee50062[3]),  3,10},
  {&(_ZTV7ee50062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50062[];
extern  VTBL_ENTRY _ZTV7ee50062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50062[];
static VTBL_ENTRY alt_thunk_names932[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee500623barEv,_ZTv0_n16_N7ee500623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee500623barEv,_ZThn8_N7ee500623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50062 = {  "ee50062", // class name
  bases_ee50062, 4,
  &(vtc_ee50062[0]), // expected_vtbl_contents
  &(vtt_ee50062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names932,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60062  : dd0062 {
  int e;
  virtual void  foo(); // _ZN7ee600623fooEv
  virtual void  bar(); // _ZN7ee600623barEv
  ~ee60062(); // tgen
  ee60062(); // tgen
};
//SIG(1 ee60062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee60062 ::foo(){vfunc_called(this, "_ZN7ee600623fooEv");}
void  ee60062 ::bar(){vfunc_called(this, "_ZN7ee600623barEv");}
ee60062 ::~ee60062(){ note_dtor("ee60062", this);} // tgen
ee60062 ::ee60062(){ note_ctor("ee60062", this);} // tgen

static void Test_ee60062()
{
  extern Class_Descriptor cd_ee60062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60062, buf);
    ee60062 *dp, &lv = *(dp=new (buf) ee60062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), 0, "ee60062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), 0, "ee60062");
    check_base_class_offset(lv, (cc062*)(dd0062*), 0, "ee60062");
    check_base_class_offset(lv, (dd0062*), 0, "ee60062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60062.e");
    test_class_info(&lv, &cd_ee60062);
    dp->~ee60062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60062(Test_ee60062, "ee60062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60062C1Ev();
extern void _ZN7ee60062D1Ev();
Name_Map name_map_ee60062[] = {
  NSPAIR(_ZN7ee60062C1Ev),
  NSPAIR(_ZN7ee60062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee60062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60062[];
extern void _ZN7ee600623fooEv();
extern void _ZN7ee600623barEv();
static  VTBL_ENTRY vtc_ee60062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60062[0]),
  (VTBL_ENTRY)&_ZN7ee600623fooEv,
  (VTBL_ENTRY)&_ZN7ee600623barEv,
};
extern VTBL_ENTRY _ZTI7ee60062[];
extern  VTBL_ENTRY _ZTV7ee60062[];
Class_Descriptor cd_ee60062 = {  "ee60062", // class name
  bases_ee60062, 4,
  &(vtc_ee60062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60062),4, //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  ee70062  : virtual dd0062 {
  int e;
  virtual void  foo(); // _ZN7ee700623fooEv
  virtual void  bar(); // _ZN7ee700623barEv
  ~ee70062(); // tgen
  ee70062(); // tgen
};
//SIG(1 ee70062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee70062 ::foo(){vfunc_called(this, "_ZN7ee700623fooEv");}
void  ee70062 ::bar(){vfunc_called(this, "_ZN7ee700623barEv");}
ee70062 ::~ee70062(){ note_dtor("ee70062", this);} // tgen
ee70062 ::ee70062(){ note_ctor("ee70062", this);} // tgen

static void Test_ee70062()
{
  extern Class_Descriptor cd_ee70062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70062, buf);
    ee70062 *dp, &lv = *(dp=new (buf) ee70062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee70062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd0062*), ABISELECT(16,8), "ee70062");
    check_base_class_offset(lv, (cc062*)(dd0062*), ABISELECT(16,8), "ee70062");
    check_base_class_offset(lv, (dd0062*), ABISELECT(16,8), "ee70062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70062.e");
    test_class_info(&lv, &cd_ee70062);
    dp->~ee70062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70062(Test_ee70062, "ee70062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70062C1Ev();
extern void _ZN7ee70062D1Ev();
Name_Map name_map_ee70062[] = {
  NSPAIR(_ZN7ee70062C1Ev),
  NSPAIR(_ZN7ee70062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd0062;
extern VTBL_ENTRY _ZTI6dd0062[];
extern  VTBL_ENTRY _ZTV6dd0062[];
static Base_Class bases_ee70062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70062[];
extern void _ZN7ee700623fooEv();
extern void _ZN7ee700623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee700623fooEv,_ZTv0_n12_N7ee700623fooEv)();
extern void ABISELECT(_ZThn16_N7ee700623fooEv,_ZThn8_N7ee700623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee700623barEv,_ZTv0_n16_N7ee700623barEv)();
extern void ABISELECT(_ZThn16_N7ee700623barEv,_ZThn8_N7ee700623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70062[0]),
  (VTBL_ENTRY)&_ZN7ee700623fooEv,
  (VTBL_ENTRY)&_ZN7ee700623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee700623fooEv,_ZTv0_n12_N7ee700623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee700623barEv,_ZTv0_n16_N7ee700623barEv),
};
extern VTBL_ENTRY _ZTV7ee70062[];
static  VTT_ENTRY vtt_ee70062[] = {
  {&(_ZTV7ee70062[3]),  3,11},
  {&(_ZTV7ee70062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70062[];
extern  VTBL_ENTRY _ZTV7ee70062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70062[];
static VTBL_ENTRY alt_thunk_names933[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee700623barEv,_ZTv0_n16_N7ee700623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee700623barEv,_ZThn8_N7ee700623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee700623fooEv,_ZTv0_n12_N7ee700623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee700623fooEv,_ZThn8_N7ee700623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70062 = {  "ee70062", // class name
  bases_ee70062, 4,
  &(vtc_ee70062[0]), // expected_vtbl_contents
  &(vtt_ee70062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names933,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1062  : virtual cc062 {
  int d;
  ~dd1062(); // tgen
  dd1062(); // tgen
};
//SIG(-1 dd1062) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} Fi}


dd1062 ::~dd1062(){ note_dtor("dd1062", this);} // tgen
dd1062 ::dd1062(){ note_ctor("dd1062", this);} // tgen

static void Test_dd1062()
{
  extern Class_Descriptor cd_dd1062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1062, buf);
    dd1062 *dp, &lv = *(dp=new (buf) dd1062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,8), "dd1062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,8), "dd1062");
    check_base_class_offset(lv, (cc062*), ABISELECT(16,8), "dd1062");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1062.d");
    test_class_info(&lv, &cd_dd1062);
    dp->~dd1062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1062(Test_dd1062, "dd1062", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1062C1Ev();
extern void _ZN6dd1062D1Ev();
Name_Map name_map_dd1062[] = {
  NSPAIR(_ZN6dd1062C1Ev),
  NSPAIR(_ZN6dd1062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd1062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1062[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd1062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd1062[];
static  VTT_ENTRY vtt_dd1062[] = {
  {&(_ZTV6dd1062[3]),  3,9},
  {&(_ZTV6dd1062[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
Class_Descriptor cd_dd1062 = {  "dd1062", // class name
  bases_dd1062, 3,
  &(vtc_dd1062[0]), // expected_vtbl_contents
  &(vtt_dd1062[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1062),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1062),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  ee01062  : dd1062 {
  int e;
  ~ee01062(); // tgen
  ee01062(); // tgen
};
//SIG(1 ee01062) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee01062 ::~ee01062(){ note_dtor("ee01062", this);} // tgen
ee01062 ::ee01062(){ note_ctor("ee01062", this);} // tgen

static void Test_ee01062()
{
  extern Class_Descriptor cd_ee01062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01062, buf);
    ee01062 *dp, &lv = *(dp=new (buf) ee01062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee01062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee01062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(16,12), "ee01062");
    check_base_class_offset(lv, (dd1062*), 0, "ee01062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01062.e");
    test_class_info(&lv, &cd_ee01062);
    dp->~ee01062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01062(Test_ee01062, "ee01062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01062C1Ev();
extern void _ZN7ee01062D1Ev();
Name_Map name_map_ee01062[] = {
  NSPAIR(_ZN7ee01062C1Ev),
  NSPAIR(_ZN7ee01062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee01062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01062[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee01062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01062[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee01062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee01062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee01062[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee01062[] = {
  {&(_ZTV7ee01062[3]),  3,9},
  {&(_tg__ZTV6dd1062__7ee01062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee01062[4]),  4,6},
  {&(_ZTV7ee01062[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01062[];
extern  VTBL_ENTRY _ZTV7ee01062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01062[];
Class_Descriptor cd_ee01062 = {  "ee01062", // class name
  bases_ee01062, 4,
  &(vtc_ee01062[0]), // expected_vtbl_contents
  &(vtt_ee01062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01062),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01062),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  ee11062  : virtual dd1062 {
  int e;
  ~ee11062(); // tgen
  ee11062(); // tgen
};
//SIG(1 ee11062) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee11062 ::~ee11062(){ note_dtor("ee11062", this);} // tgen
ee11062 ::ee11062(){ note_ctor("ee11062", this);} // tgen

static void Test_ee11062()
{
  extern Class_Descriptor cd_ee11062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11062, buf);
    ee11062 *dp, &lv = *(dp=new (buf) ee11062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee11062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee11062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(32,16), "ee11062");
    check_base_class_offset(lv, (dd1062*), ABISELECT(16,8), "ee11062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11062.e");
    test_class_info(&lv, &cd_ee11062);
    dp->~ee11062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11062(Test_ee11062, "ee11062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11062C1Ev();
extern void _ZN7ee11062D1Ev();
Name_Map name_map_ee11062[] = {
  NSPAIR(_ZN7ee11062C1Ev),
  NSPAIR(_ZN7ee11062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee11062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11062[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee11062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11062[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11062[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee11062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee11062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee11062[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee11062[] = {
  {&(_ZTV7ee11062[4]),  4,13},
  {&(_ZTV7ee11062[7]),  7,13},
  {&(_ZTV7ee11062[11]),  11,13},
  {&(_tg__ZTV6dd1062__7ee11062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee11062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11062[];
extern  VTBL_ENTRY _ZTV7ee11062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11062[];
Class_Descriptor cd_ee11062 = {  "ee11062", // class name
  bases_ee11062, 4,
  &(vtc_ee11062[0]), // expected_vtbl_contents
  &(vtt_ee11062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11062),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11062),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  ee21062  : dd1062 {
  int e;
  virtual void  foo(); // _ZN7ee210623fooEv
  ~ee21062(); // tgen
  ee21062(); // tgen
};
//SIG(1 ee21062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee21062 ::foo(){vfunc_called(this, "_ZN7ee210623fooEv");}
ee21062 ::~ee21062(){ note_dtor("ee21062", this);} // tgen
ee21062 ::ee21062(){ note_ctor("ee21062", this);} // tgen

static void Test_ee21062()
{
  extern Class_Descriptor cd_ee21062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21062, buf);
    ee21062 *dp, &lv = *(dp=new (buf) ee21062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee21062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee21062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(16,12), "ee21062");
    check_base_class_offset(lv, (dd1062*), 0, "ee21062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21062.e");
    test_class_info(&lv, &cd_ee21062);
    dp->~ee21062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21062(Test_ee21062, "ee21062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21062C1Ev();
extern void _ZN7ee21062D1Ev();
Name_Map name_map_ee21062[] = {
  NSPAIR(_ZN7ee21062C1Ev),
  NSPAIR(_ZN7ee21062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee21062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21062[];
extern void _ZN7ee210623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee210623fooEv,_ZTv0_n12_N7ee210623fooEv)();
extern void ABISELECT(_ZThn16_N7ee210623fooEv,_ZThn12_N7ee210623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee21062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21062[0]),
  (VTBL_ENTRY)&_ZN7ee210623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee210623fooEv,_ZTv0_n12_N7ee210623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee21062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee21062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee21062[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee21062[] = {
  {&(_ZTV7ee21062[3]),  3,10},
  {&(_tg__ZTV6dd1062__7ee21062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee21062[4]),  4,6},
  {&(_ZTV7ee21062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21062[];
extern  VTBL_ENTRY _ZTV7ee21062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21062[];
static VTBL_ENTRY alt_thunk_names934[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee210623fooEv,_ZTv0_n12_N7ee210623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee210623fooEv,_ZThn12_N7ee210623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21062 = {  "ee21062", // class name
  bases_ee21062, 4,
  &(vtc_ee21062[0]), // expected_vtbl_contents
  &(vtt_ee21062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names934,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31062  : virtual dd1062 {
  int e;
  virtual void  foo(); // _ZN7ee310623fooEv
  ~ee31062(); // tgen
  ee31062(); // tgen
};
//SIG(1 ee31062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee31062 ::foo(){vfunc_called(this, "_ZN7ee310623fooEv");}
ee31062 ::~ee31062(){ note_dtor("ee31062", this);} // tgen
ee31062 ::ee31062(){ note_ctor("ee31062", this);} // tgen

static void Test_ee31062()
{
  extern Class_Descriptor cd_ee31062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31062, buf);
    ee31062 *dp, &lv = *(dp=new (buf) ee31062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee31062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee31062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(32,16), "ee31062");
    check_base_class_offset(lv, (dd1062*), ABISELECT(16,8), "ee31062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31062.e");
    test_class_info(&lv, &cd_ee31062);
    dp->~ee31062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31062(Test_ee31062, "ee31062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31062C1Ev();
extern void _ZN7ee31062D1Ev();
Name_Map name_map_ee31062[] = {
  NSPAIR(_ZN7ee31062C1Ev),
  NSPAIR(_ZN7ee31062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee31062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31062[];
extern void _ZN7ee310623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee310623fooEv,_ZTv0_n12_N7ee310623fooEv)();
extern void ABISELECT(_ZThn32_N7ee310623fooEv,_ZThn16_N7ee310623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee31062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31062[0]),
  (VTBL_ENTRY)&_ZN7ee310623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31062[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee310623fooEv,_ZTv0_n12_N7ee310623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee31062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee31062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee31062[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee31062[] = {
  {&(_ZTV7ee31062[4]),  4,14},
  {&(_ZTV7ee31062[8]),  8,14},
  {&(_ZTV7ee31062[12]),  12,14},
  {&(_tg__ZTV6dd1062__7ee31062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee31062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31062[];
extern  VTBL_ENTRY _ZTV7ee31062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31062[];
static VTBL_ENTRY alt_thunk_names935[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee310623fooEv,_ZTv0_n12_N7ee310623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee310623fooEv,_ZThn16_N7ee310623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31062 = {  "ee31062", // class name
  bases_ee31062, 4,
  &(vtc_ee31062[0]), // expected_vtbl_contents
  &(vtt_ee31062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31062),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names935,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41062  : dd1062 {
  int e;
  virtual void  bar(); // _ZN7ee410623barEv
  ~ee41062(); // tgen
  ee41062(); // tgen
};
//SIG(1 ee41062) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee41062 ::bar(){vfunc_called(this, "_ZN7ee410623barEv");}
ee41062 ::~ee41062(){ note_dtor("ee41062", this);} // tgen
ee41062 ::ee41062(){ note_ctor("ee41062", this);} // tgen

static void Test_ee41062()
{
  extern Class_Descriptor cd_ee41062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41062, buf);
    ee41062 *dp, &lv = *(dp=new (buf) ee41062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee41062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee41062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(16,12), "ee41062");
    check_base_class_offset(lv, (dd1062*), 0, "ee41062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41062.e");
    test_class_info(&lv, &cd_ee41062);
    dp->~ee41062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41062(Test_ee41062, "ee41062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41062C1Ev();
extern void _ZN7ee41062D1Ev();
Name_Map name_map_ee41062[] = {
  NSPAIR(_ZN7ee41062C1Ev),
  NSPAIR(_ZN7ee41062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee41062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41062[];
extern void _ZN7ee410623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee410623barEv,_ZTv0_n16_N7ee410623barEv)();
extern void ABISELECT(_ZThn16_N7ee410623barEv,_ZThn12_N7ee410623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41062[0]),
  (VTBL_ENTRY)&_ZN7ee410623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee410623barEv,_ZTv0_n16_N7ee410623barEv),
};
extern VTBL_ENTRY _ZTV7ee41062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee41062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee41062[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee41062[] = {
  {&(_ZTV7ee41062[3]),  3,10},
  {&(_tg__ZTV6dd1062__7ee41062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee41062[4]),  4,6},
  {&(_ZTV7ee41062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41062[];
extern  VTBL_ENTRY _ZTV7ee41062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41062[];
static VTBL_ENTRY alt_thunk_names936[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee410623barEv,_ZTv0_n16_N7ee410623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee410623barEv,_ZThn12_N7ee410623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41062 = {  "ee41062", // class name
  bases_ee41062, 4,
  &(vtc_ee41062[0]), // expected_vtbl_contents
  &(vtt_ee41062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names936,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51062  : virtual dd1062 {
  int e;
  virtual void  bar(); // _ZN7ee510623barEv
  ~ee51062(); // tgen
  ee51062(); // tgen
};
//SIG(1 ee51062) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee51062 ::bar(){vfunc_called(this, "_ZN7ee510623barEv");}
ee51062 ::~ee51062(){ note_dtor("ee51062", this);} // tgen
ee51062 ::ee51062(){ note_ctor("ee51062", this);} // tgen

static void Test_ee51062()
{
  extern Class_Descriptor cd_ee51062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51062, buf);
    ee51062 *dp, &lv = *(dp=new (buf) ee51062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee51062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee51062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(32,16), "ee51062");
    check_base_class_offset(lv, (dd1062*), ABISELECT(16,8), "ee51062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51062.e");
    test_class_info(&lv, &cd_ee51062);
    dp->~ee51062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51062(Test_ee51062, "ee51062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51062C1Ev();
extern void _ZN7ee51062D1Ev();
Name_Map name_map_ee51062[] = {
  NSPAIR(_ZN7ee51062C1Ev),
  NSPAIR(_ZN7ee51062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee51062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51062[];
extern void _ZN7ee510623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee510623barEv,_ZTv0_n16_N7ee510623barEv)();
extern void ABISELECT(_ZThn32_N7ee510623barEv,_ZThn16_N7ee510623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51062[0]),
  (VTBL_ENTRY)&_ZN7ee510623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51062[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee510623barEv,_ZTv0_n16_N7ee510623barEv),
};
extern VTBL_ENTRY _ZTV7ee51062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee51062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee51062[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee51062[] = {
  {&(_ZTV7ee51062[4]),  4,14},
  {&(_ZTV7ee51062[8]),  8,14},
  {&(_ZTV7ee51062[12]),  12,14},
  {&(_tg__ZTV6dd1062__7ee51062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee51062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51062[];
extern  VTBL_ENTRY _ZTV7ee51062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51062[];
static VTBL_ENTRY alt_thunk_names937[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee510623barEv,_ZTv0_n16_N7ee510623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee510623barEv,_ZThn16_N7ee510623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51062 = {  "ee51062", // class name
  bases_ee51062, 4,
  &(vtc_ee51062[0]), // expected_vtbl_contents
  &(vtt_ee51062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51062),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names937,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61062  : dd1062 {
  int e;
  virtual void  foo(); // _ZN7ee610623fooEv
  virtual void  bar(); // _ZN7ee610623barEv
  ~ee61062(); // tgen
  ee61062(); // tgen
};
//SIG(1 ee61062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee61062 ::foo(){vfunc_called(this, "_ZN7ee610623fooEv");}
void  ee61062 ::bar(){vfunc_called(this, "_ZN7ee610623barEv");}
ee61062 ::~ee61062(){ note_dtor("ee61062", this);} // tgen
ee61062 ::ee61062(){ note_ctor("ee61062", this);} // tgen

static void Test_ee61062()
{
  extern Class_Descriptor cd_ee61062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61062, buf);
    ee61062 *dp, &lv = *(dp=new (buf) ee61062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee61062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee61062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(16,12), "ee61062");
    check_base_class_offset(lv, (dd1062*), 0, "ee61062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61062.e");
    test_class_info(&lv, &cd_ee61062);
    dp->~ee61062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61062(Test_ee61062, "ee61062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61062C1Ev();
extern void _ZN7ee61062D1Ev();
Name_Map name_map_ee61062[] = {
  NSPAIR(_ZN7ee61062C1Ev),
  NSPAIR(_ZN7ee61062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee61062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61062[];
extern void _ZN7ee610623fooEv();
extern void _ZN7ee610623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee610623fooEv,_ZTv0_n12_N7ee610623fooEv)();
extern void ABISELECT(_ZThn16_N7ee610623fooEv,_ZThn12_N7ee610623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee610623barEv,_ZTv0_n16_N7ee610623barEv)();
extern void ABISELECT(_ZThn16_N7ee610623barEv,_ZThn12_N7ee610623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61062[0]),
  (VTBL_ENTRY)&_ZN7ee610623fooEv,
  (VTBL_ENTRY)&_ZN7ee610623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee610623fooEv,_ZTv0_n12_N7ee610623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee610623barEv,_ZTv0_n16_N7ee610623barEv),
};
extern VTBL_ENTRY _ZTV7ee61062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee61062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee61062[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee61062[] = {
  {&(_ZTV7ee61062[3]),  3,11},
  {&(_tg__ZTV6dd1062__7ee61062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee61062[4]),  4,6},
  {&(_ZTV7ee61062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61062[];
extern  VTBL_ENTRY _ZTV7ee61062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61062[];
static VTBL_ENTRY alt_thunk_names938[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee610623barEv,_ZTv0_n16_N7ee610623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee610623barEv,_ZThn12_N7ee610623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee610623fooEv,_ZTv0_n12_N7ee610623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee610623fooEv,_ZThn12_N7ee610623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61062 = {  "ee61062", // class name
  bases_ee61062, 4,
  &(vtc_ee61062[0]), // expected_vtbl_contents
  &(vtt_ee61062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names938,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71062  : virtual dd1062 {
  int e;
  virtual void  foo(); // _ZN7ee710623fooEv
  virtual void  bar(); // _ZN7ee710623barEv
  ~ee71062(); // tgen
  ee71062(); // tgen
};
//SIG(1 ee71062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee71062 ::foo(){vfunc_called(this, "_ZN7ee710623fooEv");}
void  ee71062 ::bar(){vfunc_called(this, "_ZN7ee710623barEv");}
ee71062 ::~ee71062(){ note_dtor("ee71062", this);} // tgen
ee71062 ::ee71062(){ note_ctor("ee71062", this);} // tgen

static void Test_ee71062()
{
  extern Class_Descriptor cd_ee71062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71062, buf);
    ee71062 *dp, &lv = *(dp=new (buf) ee71062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee71062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee71062");
    check_base_class_offset(lv, (cc062*)(dd1062*), ABISELECT(32,16), "ee71062");
    check_base_class_offset(lv, (dd1062*), ABISELECT(16,8), "ee71062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71062.e");
    test_class_info(&lv, &cd_ee71062);
    dp->~ee71062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71062(Test_ee71062, "ee71062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71062C1Ev();
extern void _ZN7ee71062D1Ev();
Name_Map name_map_ee71062[] = {
  NSPAIR(_ZN7ee71062C1Ev),
  NSPAIR(_ZN7ee71062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd1062;
extern VTBL_ENTRY _ZTI6dd1062[];
extern  VTBL_ENTRY _ZTV6dd1062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1062[];
static Base_Class bases_ee71062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1062,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71062[];
extern void _ZN7ee710623fooEv();
extern void _ZN7ee710623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee710623fooEv,_ZTv0_n12_N7ee710623fooEv)();
extern void ABISELECT(_ZThn32_N7ee710623fooEv,_ZThn16_N7ee710623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee710623barEv,_ZTv0_n16_N7ee710623barEv)();
extern void ABISELECT(_ZThn32_N7ee710623barEv,_ZThn16_N7ee710623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71062[0]),
  (VTBL_ENTRY)&_ZN7ee710623fooEv,
  (VTBL_ENTRY)&_ZN7ee710623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71062[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee710623fooEv,_ZTv0_n12_N7ee710623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee710623barEv,_ZTv0_n16_N7ee710623barEv),
};
extern VTBL_ENTRY _ZTV7ee71062[];
static  VTBL_ENTRY _tg__ZTV6dd1062__7ee71062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd1062__7ee71062[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee71062[] = {
  {&(_ZTV7ee71062[4]),  4,15},
  {&(_ZTV7ee71062[9]),  9,15},
  {&(_ZTV7ee71062[13]),  13,15},
  {&(_tg__ZTV6dd1062__7ee71062[3]),  3,3},
  {&(_tg__ZTV4bb625cc062__6dd1062__7ee71062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71062[];
extern  VTBL_ENTRY _ZTV7ee71062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71062[];
static VTBL_ENTRY alt_thunk_names939[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee710623barEv,_ZTv0_n16_N7ee710623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee710623barEv,_ZThn16_N7ee710623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee710623fooEv,_ZTv0_n12_N7ee710623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee710623fooEv,_ZThn16_N7ee710623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71062 = {  "ee71062", // class name
  bases_ee71062, 4,
  &(vtc_ee71062[0]), // expected_vtbl_contents
  &(vtt_ee71062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71062),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names939,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2062  : cc062 {
  int d;
  virtual void  foo(); // _ZN6dd20623fooEv
  ~dd2062(); // tgen
  dd2062(); // tgen
};
//SIG(-1 dd2062) C1{ BC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd2062 ::foo(){vfunc_called(this, "_ZN6dd20623fooEv");}
dd2062 ::~dd2062(){ note_dtor("dd2062", this);} // tgen
dd2062 ::dd2062(){ note_ctor("dd2062", this);} // tgen

static void Test_dd2062()
{
  extern Class_Descriptor cd_dd2062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2062, buf);
    dd2062 *dp, &lv = *(dp=new (buf) dd2062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), 0, "dd2062");
    check_base_class_offset(lv, (bb62*)(cc062*), 0, "dd2062");
    check_base_class_offset(lv, (cc062*), 0, "dd2062");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2062.d");
    test_class_info(&lv, &cd_dd2062);
    dp->~dd2062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2062(Test_dd2062, "dd2062", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2062C1Ev();
extern void _ZN6dd2062D1Ev();
Name_Map name_map_dd2062[] = {
  NSPAIR(_ZN6dd2062C1Ev),
  NSPAIR(_ZN6dd2062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd2062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2062[];
extern void _ZN6dd20623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd2062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2062[0]),
  (VTBL_ENTRY)&_ZN6dd20623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
Class_Descriptor cd_dd2062 = {  "dd2062", // class name
  bases_dd2062, 3,
  &(vtc_dd2062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2062),4, //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  ee02062  : dd2062 {
  int e;
  ~ee02062(); // tgen
  ee02062(); // tgen
};
//SIG(1 ee02062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee02062 ::~ee02062(){ note_dtor("ee02062", this);} // tgen
ee02062 ::ee02062(){ note_ctor("ee02062", this);} // tgen

static void Test_ee02062()
{
  extern Class_Descriptor cd_ee02062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02062, buf);
    ee02062 *dp, &lv = *(dp=new (buf) ee02062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), 0, "ee02062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), 0, "ee02062");
    check_base_class_offset(lv, (cc062*)(dd2062*), 0, "ee02062");
    check_base_class_offset(lv, (dd2062*), 0, "ee02062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02062.e");
    test_class_info(&lv, &cd_ee02062);
    dp->~ee02062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02062(Test_ee02062, "ee02062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02062C1Ev();
extern void _ZN7ee02062D1Ev();
Name_Map name_map_ee02062[] = {
  NSPAIR(_ZN7ee02062C1Ev),
  NSPAIR(_ZN7ee02062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee02062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02062[];
extern void _ZN6dd20623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee02062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02062[0]),
  (VTBL_ENTRY)&_ZN6dd20623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee02062[];
extern  VTBL_ENTRY _ZTV7ee02062[];
Class_Descriptor cd_ee02062 = {  "ee02062", // class name
  bases_ee02062, 4,
  &(vtc_ee02062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02062),4, //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  ee12062  : virtual dd2062 {
  int e;
  ~ee12062(); // tgen
  ee12062(); // tgen
};
//SIG(1 ee12062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee12062 ::~ee12062(){ note_dtor("ee12062", this);} // tgen
ee12062 ::ee12062(){ note_ctor("ee12062", this);} // tgen

static void Test_ee12062()
{
  extern Class_Descriptor cd_ee12062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12062, buf);
    ee12062 *dp, &lv = *(dp=new (buf) ee12062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee12062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee12062");
    check_base_class_offset(lv, (cc062*)(dd2062*), ABISELECT(16,8), "ee12062");
    check_base_class_offset(lv, (dd2062*), ABISELECT(16,8), "ee12062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12062.e");
    test_class_info(&lv, &cd_ee12062);
    dp->~ee12062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12062(Test_ee12062, "ee12062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12062C1Ev();
extern void _ZN7ee12062D1Ev();
Name_Map name_map_ee12062[] = {
  NSPAIR(_ZN7ee12062C1Ev),
  NSPAIR(_ZN7ee12062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee12062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12062[];
extern void _ZN6dd20623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee12062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12062[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12062[0]),
  (VTBL_ENTRY)&_ZN6dd20623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee12062[];
static  VTT_ENTRY vtt_ee12062[] = {
  {&(_ZTV7ee12062[3]),  3,9},
  {&(_ZTV7ee12062[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12062[];
extern  VTBL_ENTRY _ZTV7ee12062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12062[];
Class_Descriptor cd_ee12062 = {  "ee12062", // class name
  bases_ee12062, 4,
  &(vtc_ee12062[0]), // expected_vtbl_contents
  &(vtt_ee12062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12062),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12062),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  ee22062  : dd2062 {
  int e;
  virtual void  foo(); // _ZN7ee220623fooEv
  ~ee22062(); // tgen
  ee22062(); // tgen
};
//SIG(1 ee22062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee22062 ::foo(){vfunc_called(this, "_ZN7ee220623fooEv");}
ee22062 ::~ee22062(){ note_dtor("ee22062", this);} // tgen
ee22062 ::ee22062(){ note_ctor("ee22062", this);} // tgen

static void Test_ee22062()
{
  extern Class_Descriptor cd_ee22062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22062, buf);
    ee22062 *dp, &lv = *(dp=new (buf) ee22062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), 0, "ee22062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), 0, "ee22062");
    check_base_class_offset(lv, (cc062*)(dd2062*), 0, "ee22062");
    check_base_class_offset(lv, (dd2062*), 0, "ee22062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22062.e");
    test_class_info(&lv, &cd_ee22062);
    dp->~ee22062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22062(Test_ee22062, "ee22062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22062C1Ev();
extern void _ZN7ee22062D1Ev();
Name_Map name_map_ee22062[] = {
  NSPAIR(_ZN7ee22062C1Ev),
  NSPAIR(_ZN7ee22062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee22062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22062[];
extern void _ZN7ee220623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee22062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22062[0]),
  (VTBL_ENTRY)&_ZN7ee220623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee22062[];
extern  VTBL_ENTRY _ZTV7ee22062[];
Class_Descriptor cd_ee22062 = {  "ee22062", // class name
  bases_ee22062, 4,
  &(vtc_ee22062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22062),4, //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  ee32062  : virtual dd2062 {
  int e;
  virtual void  foo(); // _ZN7ee320623fooEv
  ~ee32062(); // tgen
  ee32062(); // tgen
};
//SIG(1 ee32062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee32062 ::foo(){vfunc_called(this, "_ZN7ee320623fooEv");}
ee32062 ::~ee32062(){ note_dtor("ee32062", this);} // tgen
ee32062 ::ee32062(){ note_ctor("ee32062", this);} // tgen

static void Test_ee32062()
{
  extern Class_Descriptor cd_ee32062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32062, buf);
    ee32062 *dp, &lv = *(dp=new (buf) ee32062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee32062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee32062");
    check_base_class_offset(lv, (cc062*)(dd2062*), ABISELECT(16,8), "ee32062");
    check_base_class_offset(lv, (dd2062*), ABISELECT(16,8), "ee32062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32062.e");
    test_class_info(&lv, &cd_ee32062);
    dp->~ee32062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32062(Test_ee32062, "ee32062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32062C1Ev();
extern void _ZN7ee32062D1Ev();
Name_Map name_map_ee32062[] = {
  NSPAIR(_ZN7ee32062C1Ev),
  NSPAIR(_ZN7ee32062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee32062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32062[];
extern void _ZN7ee320623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee320623fooEv,_ZTv0_n12_N7ee320623fooEv)();
extern void ABISELECT(_ZThn16_N7ee320623fooEv,_ZThn8_N7ee320623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee32062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32062[0]),
  (VTBL_ENTRY)&_ZN7ee320623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee320623fooEv,_ZTv0_n12_N7ee320623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee32062[];
static  VTT_ENTRY vtt_ee32062[] = {
  {&(_ZTV7ee32062[3]),  3,10},
  {&(_ZTV7ee32062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32062[];
extern  VTBL_ENTRY _ZTV7ee32062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32062[];
static VTBL_ENTRY alt_thunk_names940[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee320623fooEv,_ZTv0_n12_N7ee320623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee320623fooEv,_ZThn8_N7ee320623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32062 = {  "ee32062", // class name
  bases_ee32062, 4,
  &(vtc_ee32062[0]), // expected_vtbl_contents
  &(vtt_ee32062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names940,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42062  : dd2062 {
  int e;
  virtual void  bar(); // _ZN7ee420623barEv
  ~ee42062(); // tgen
  ee42062(); // tgen
};
//SIG(1 ee42062) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee42062 ::bar(){vfunc_called(this, "_ZN7ee420623barEv");}
ee42062 ::~ee42062(){ note_dtor("ee42062", this);} // tgen
ee42062 ::ee42062(){ note_ctor("ee42062", this);} // tgen

static void Test_ee42062()
{
  extern Class_Descriptor cd_ee42062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42062, buf);
    ee42062 *dp, &lv = *(dp=new (buf) ee42062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), 0, "ee42062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), 0, "ee42062");
    check_base_class_offset(lv, (cc062*)(dd2062*), 0, "ee42062");
    check_base_class_offset(lv, (dd2062*), 0, "ee42062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42062.e");
    test_class_info(&lv, &cd_ee42062);
    dp->~ee42062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42062(Test_ee42062, "ee42062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42062C1Ev();
extern void _ZN7ee42062D1Ev();
Name_Map name_map_ee42062[] = {
  NSPAIR(_ZN7ee42062C1Ev),
  NSPAIR(_ZN7ee42062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee42062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42062[];
extern void _ZN6dd20623fooEv();
extern void _ZN7ee420623barEv();
static  VTBL_ENTRY vtc_ee42062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42062[0]),
  (VTBL_ENTRY)&_ZN6dd20623fooEv,
  (VTBL_ENTRY)&_ZN7ee420623barEv,
};
extern VTBL_ENTRY _ZTI7ee42062[];
extern  VTBL_ENTRY _ZTV7ee42062[];
Class_Descriptor cd_ee42062 = {  "ee42062", // class name
  bases_ee42062, 4,
  &(vtc_ee42062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42062),4, //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  ee52062  : virtual dd2062 {
  int e;
  virtual void  bar(); // _ZN7ee520623barEv
  ~ee52062(); // tgen
  ee52062(); // tgen
};
//SIG(1 ee52062) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee52062 ::bar(){vfunc_called(this, "_ZN7ee520623barEv");}
ee52062 ::~ee52062(){ note_dtor("ee52062", this);} // tgen
ee52062 ::ee52062(){ note_ctor("ee52062", this);} // tgen

static void Test_ee52062()
{
  extern Class_Descriptor cd_ee52062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52062, buf);
    ee52062 *dp, &lv = *(dp=new (buf) ee52062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee52062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee52062");
    check_base_class_offset(lv, (cc062*)(dd2062*), ABISELECT(16,8), "ee52062");
    check_base_class_offset(lv, (dd2062*), ABISELECT(16,8), "ee52062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52062.e");
    test_class_info(&lv, &cd_ee52062);
    dp->~ee52062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52062(Test_ee52062, "ee52062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52062C1Ev();
extern void _ZN7ee52062D1Ev();
Name_Map name_map_ee52062[] = {
  NSPAIR(_ZN7ee52062C1Ev),
  NSPAIR(_ZN7ee52062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee52062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52062[];
extern void _ZN7ee520623barEv();
extern void _ZN6dd20623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee520623barEv,_ZTv0_n16_N7ee520623barEv)();
extern void ABISELECT(_ZThn16_N7ee520623barEv,_ZThn8_N7ee520623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52062[0]),
  (VTBL_ENTRY)&_ZN7ee520623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52062[0]),
  (VTBL_ENTRY)&_ZN6dd20623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee520623barEv,_ZTv0_n16_N7ee520623barEv),
};
extern VTBL_ENTRY _ZTV7ee52062[];
static  VTT_ENTRY vtt_ee52062[] = {
  {&(_ZTV7ee52062[3]),  3,10},
  {&(_ZTV7ee52062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52062[];
extern  VTBL_ENTRY _ZTV7ee52062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52062[];
static VTBL_ENTRY alt_thunk_names941[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee520623barEv,_ZTv0_n16_N7ee520623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee520623barEv,_ZThn8_N7ee520623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52062 = {  "ee52062", // class name
  bases_ee52062, 4,
  &(vtc_ee52062[0]), // expected_vtbl_contents
  &(vtt_ee52062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names941,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62062  : dd2062 {
  int e;
  virtual void  foo(); // _ZN7ee620623fooEv
  virtual void  bar(); // _ZN7ee620623barEv
  ~ee62062(); // tgen
  ee62062(); // tgen
};
//SIG(1 ee62062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee62062 ::foo(){vfunc_called(this, "_ZN7ee620623fooEv");}
void  ee62062 ::bar(){vfunc_called(this, "_ZN7ee620623barEv");}
ee62062 ::~ee62062(){ note_dtor("ee62062", this);} // tgen
ee62062 ::ee62062(){ note_ctor("ee62062", this);} // tgen

static void Test_ee62062()
{
  extern Class_Descriptor cd_ee62062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62062, buf);
    ee62062 *dp, &lv = *(dp=new (buf) ee62062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), 0, "ee62062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), 0, "ee62062");
    check_base_class_offset(lv, (cc062*)(dd2062*), 0, "ee62062");
    check_base_class_offset(lv, (dd2062*), 0, "ee62062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62062.e");
    test_class_info(&lv, &cd_ee62062);
    dp->~ee62062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62062(Test_ee62062, "ee62062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62062C1Ev();
extern void _ZN7ee62062D1Ev();
Name_Map name_map_ee62062[] = {
  NSPAIR(_ZN7ee62062C1Ev),
  NSPAIR(_ZN7ee62062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee62062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62062[];
extern void _ZN7ee620623fooEv();
extern void _ZN7ee620623barEv();
static  VTBL_ENTRY vtc_ee62062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62062[0]),
  (VTBL_ENTRY)&_ZN7ee620623fooEv,
  (VTBL_ENTRY)&_ZN7ee620623barEv,
};
extern VTBL_ENTRY _ZTI7ee62062[];
extern  VTBL_ENTRY _ZTV7ee62062[];
Class_Descriptor cd_ee62062 = {  "ee62062", // class name
  bases_ee62062, 4,
  &(vtc_ee62062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62062),4, //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  ee72062  : virtual dd2062 {
  int e;
  virtual void  foo(); // _ZN7ee720623fooEv
  virtual void  bar(); // _ZN7ee720623barEv
  ~ee72062(); // tgen
  ee72062(); // tgen
};
//SIG(1 ee72062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee72062 ::foo(){vfunc_called(this, "_ZN7ee720623fooEv");}
void  ee72062 ::bar(){vfunc_called(this, "_ZN7ee720623barEv");}
ee72062 ::~ee72062(){ note_dtor("ee72062", this);} // tgen
ee72062 ::ee72062(){ note_ctor("ee72062", this);} // tgen

static void Test_ee72062()
{
  extern Class_Descriptor cd_ee72062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72062, buf);
    ee72062 *dp, &lv = *(dp=new (buf) ee72062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee72062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd2062*), ABISELECT(16,8), "ee72062");
    check_base_class_offset(lv, (cc062*)(dd2062*), ABISELECT(16,8), "ee72062");
    check_base_class_offset(lv, (dd2062*), ABISELECT(16,8), "ee72062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72062.e");
    test_class_info(&lv, &cd_ee72062);
    dp->~ee72062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72062(Test_ee72062, "ee72062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72062C1Ev();
extern void _ZN7ee72062D1Ev();
Name_Map name_map_ee72062[] = {
  NSPAIR(_ZN7ee72062C1Ev),
  NSPAIR(_ZN7ee72062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd2062;
extern VTBL_ENTRY _ZTI6dd2062[];
extern  VTBL_ENTRY _ZTV6dd2062[];
static Base_Class bases_ee72062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2062,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72062[];
extern void _ZN7ee720623fooEv();
extern void _ZN7ee720623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee720623fooEv,_ZTv0_n12_N7ee720623fooEv)();
extern void ABISELECT(_ZThn16_N7ee720623fooEv,_ZThn8_N7ee720623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee720623barEv,_ZTv0_n16_N7ee720623barEv)();
extern void ABISELECT(_ZThn16_N7ee720623barEv,_ZThn8_N7ee720623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72062[0]),
  (VTBL_ENTRY)&_ZN7ee720623fooEv,
  (VTBL_ENTRY)&_ZN7ee720623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee720623fooEv,_ZTv0_n12_N7ee720623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee720623barEv,_ZTv0_n16_N7ee720623barEv),
};
extern VTBL_ENTRY _ZTV7ee72062[];
static  VTT_ENTRY vtt_ee72062[] = {
  {&(_ZTV7ee72062[3]),  3,11},
  {&(_ZTV7ee72062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72062[];
extern  VTBL_ENTRY _ZTV7ee72062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72062[];
static VTBL_ENTRY alt_thunk_names942[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee720623barEv,_ZTv0_n16_N7ee720623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee720623barEv,_ZThn8_N7ee720623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee720623fooEv,_ZTv0_n12_N7ee720623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee720623fooEv,_ZThn8_N7ee720623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72062 = {  "ee72062", // class name
  bases_ee72062, 4,
  &(vtc_ee72062[0]), // expected_vtbl_contents
  &(vtt_ee72062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names942,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3062  : virtual cc062 {
  int d;
  virtual void  foo(); // _ZN6dd30623fooEv
  ~dd3062(); // tgen
  dd3062(); // tgen
};
//SIG(-1 dd3062) C1{ VBC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd3062 ::foo(){vfunc_called(this, "_ZN6dd30623fooEv");}
dd3062 ::~dd3062(){ note_dtor("dd3062", this);} // tgen
dd3062 ::dd3062(){ note_ctor("dd3062", this);} // tgen

static void Test_dd3062()
{
  extern Class_Descriptor cd_dd3062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3062, buf);
    dd3062 *dp, &lv = *(dp=new (buf) dd3062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,8), "dd3062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,8), "dd3062");
    check_base_class_offset(lv, (cc062*), ABISELECT(16,8), "dd3062");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3062.d");
    test_class_info(&lv, &cd_dd3062);
    dp->~dd3062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3062(Test_dd3062, "dd3062", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3062C1Ev();
extern void _ZN6dd3062D1Ev();
Name_Map name_map_dd3062[] = {
  NSPAIR(_ZN6dd3062C1Ev),
  NSPAIR(_ZN6dd3062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd3062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3062[];
extern void _ZN6dd30623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd3062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd3062[];
static  VTT_ENTRY vtt_dd3062[] = {
  {&(_ZTV6dd3062[3]),  3,10},
  {&(_ZTV6dd3062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static VTBL_ENTRY alt_thunk_names943[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3062 = {  "dd3062", // class name
  bases_dd3062, 3,
  &(vtc_dd3062[0]), // expected_vtbl_contents
  &(vtt_dd3062[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3062),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names943,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03062  : dd3062 {
  int e;
  ~ee03062(); // tgen
  ee03062(); // tgen
};
//SIG(1 ee03062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee03062 ::~ee03062(){ note_dtor("ee03062", this);} // tgen
ee03062 ::ee03062(){ note_ctor("ee03062", this);} // tgen

static void Test_ee03062()
{
  extern Class_Descriptor cd_ee03062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03062, buf);
    ee03062 *dp, &lv = *(dp=new (buf) ee03062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee03062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee03062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(16,12), "ee03062");
    check_base_class_offset(lv, (dd3062*), 0, "ee03062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03062.e");
    test_class_info(&lv, &cd_ee03062);
    dp->~ee03062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03062(Test_ee03062, "ee03062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03062C1Ev();
extern void _ZN7ee03062D1Ev();
Name_Map name_map_ee03062[] = {
  NSPAIR(_ZN7ee03062C1Ev),
  NSPAIR(_ZN7ee03062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee03062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03062[];
extern void _ZN6dd30623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee03062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee03062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee03062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee03062[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee03062[] = {
  {&(_ZTV7ee03062[3]),  3,10},
  {&(_tg__ZTV6dd3062__7ee03062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee03062[4]),  4,6},
  {&(_ZTV7ee03062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03062[];
extern  VTBL_ENTRY _ZTV7ee03062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03062[];
static VTBL_ENTRY alt_thunk_names944[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03062 = {  "ee03062", // class name
  bases_ee03062, 4,
  &(vtc_ee03062[0]), // expected_vtbl_contents
  &(vtt_ee03062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names944,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13062  : virtual dd3062 {
  int e;
  ~ee13062(); // tgen
  ee13062(); // tgen
};
//SIG(1 ee13062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee13062 ::~ee13062(){ note_dtor("ee13062", this);} // tgen
ee13062 ::ee13062(){ note_ctor("ee13062", this);} // tgen

static void Test_ee13062()
{
  extern Class_Descriptor cd_ee13062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13062, buf);
    ee13062 *dp, &lv = *(dp=new (buf) ee13062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee13062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee13062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(32,16), "ee13062");
    check_base_class_offset(lv, (dd3062*), ABISELECT(16,8), "ee13062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13062.e");
    test_class_info(&lv, &cd_ee13062);
    dp->~ee13062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13062(Test_ee13062, "ee13062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13062C1Ev();
extern void _ZN7ee13062D1Ev();
Name_Map name_map_ee13062[] = {
  NSPAIR(_ZN7ee13062C1Ev),
  NSPAIR(_ZN7ee13062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee13062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13062[];
extern void _ZN6dd30623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee13062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13062[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee13062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee13062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee13062[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee13062[] = {
  {&(_ZTV7ee13062[4]),  4,15},
  {&(_ZTV7ee13062[8]),  8,15},
  {&(_ZTV7ee13062[13]),  13,15},
  {&(_tg__ZTV6dd3062__7ee13062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee13062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13062[];
extern  VTBL_ENTRY _ZTV7ee13062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13062[];
static VTBL_ENTRY alt_thunk_names945[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13062 = {  "ee13062", // class name
  bases_ee13062, 4,
  &(vtc_ee13062[0]), // expected_vtbl_contents
  &(vtt_ee13062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13062),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names945,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23062  : dd3062 {
  int e;
  virtual void  foo(); // _ZN7ee230623fooEv
  ~ee23062(); // tgen
  ee23062(); // tgen
};
//SIG(1 ee23062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee23062 ::foo(){vfunc_called(this, "_ZN7ee230623fooEv");}
ee23062 ::~ee23062(){ note_dtor("ee23062", this);} // tgen
ee23062 ::ee23062(){ note_ctor("ee23062", this);} // tgen

static void Test_ee23062()
{
  extern Class_Descriptor cd_ee23062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23062, buf);
    ee23062 *dp, &lv = *(dp=new (buf) ee23062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee23062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee23062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(16,12), "ee23062");
    check_base_class_offset(lv, (dd3062*), 0, "ee23062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23062.e");
    test_class_info(&lv, &cd_ee23062);
    dp->~ee23062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23062(Test_ee23062, "ee23062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23062C1Ev();
extern void _ZN7ee23062D1Ev();
Name_Map name_map_ee23062[] = {
  NSPAIR(_ZN7ee23062C1Ev),
  NSPAIR(_ZN7ee23062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee23062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23062[];
extern void _ZN7ee230623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee230623fooEv,_ZTv0_n12_N7ee230623fooEv)();
extern void ABISELECT(_ZThn16_N7ee230623fooEv,_ZThn12_N7ee230623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee23062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23062[0]),
  (VTBL_ENTRY)&_ZN7ee230623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee230623fooEv,_ZTv0_n12_N7ee230623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee23062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee23062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee23062[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee23062[] = {
  {&(_ZTV7ee23062[3]),  3,10},
  {&(_tg__ZTV6dd3062__7ee23062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee23062[4]),  4,6},
  {&(_ZTV7ee23062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23062[];
extern  VTBL_ENTRY _ZTV7ee23062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23062[];
static VTBL_ENTRY alt_thunk_names946[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee230623fooEv,_ZTv0_n12_N7ee230623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee230623fooEv,_ZThn12_N7ee230623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23062 = {  "ee23062", // class name
  bases_ee23062, 4,
  &(vtc_ee23062[0]), // expected_vtbl_contents
  &(vtt_ee23062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names946,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33062  : virtual dd3062 {
  int e;
  virtual void  foo(); // _ZN7ee330623fooEv
  ~ee33062(); // tgen
  ee33062(); // tgen
};
//SIG(1 ee33062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee33062 ::foo(){vfunc_called(this, "_ZN7ee330623fooEv");}
ee33062 ::~ee33062(){ note_dtor("ee33062", this);} // tgen
ee33062 ::ee33062(){ note_ctor("ee33062", this);} // tgen

static void Test_ee33062()
{
  extern Class_Descriptor cd_ee33062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33062, buf);
    ee33062 *dp, &lv = *(dp=new (buf) ee33062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee33062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee33062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(32,16), "ee33062");
    check_base_class_offset(lv, (dd3062*), ABISELECT(16,8), "ee33062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33062.e");
    test_class_info(&lv, &cd_ee33062);
    dp->~ee33062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33062(Test_ee33062, "ee33062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33062C1Ev();
extern void _ZN7ee33062D1Ev();
Name_Map name_map_ee33062[] = {
  NSPAIR(_ZN7ee33062C1Ev),
  NSPAIR(_ZN7ee33062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee33062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33062[];
extern void _ZN7ee330623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee330623fooEv,_ZTv0_n16_N7ee330623fooEv)();
extern void ABISELECT(_ZThn16_N7ee330623fooEv,_ZThn8_N7ee330623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee330623fooEv,_ZTv0_n12_N7ee330623fooEv)();
extern void ABISELECT(_ZThn32_N7ee330623fooEv,_ZThn16_N7ee330623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee33062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33062[0]),
  (VTBL_ENTRY)&_ZN7ee330623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee330623fooEv,_ZTv0_n16_N7ee330623fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee330623fooEv,_ZTv0_n12_N7ee330623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee33062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee33062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee33062[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee33062[] = {
  {&(_ZTV7ee33062[4]),  4,16},
  {&(_ZTV7ee33062[9]),  9,16},
  {&(_ZTV7ee33062[14]),  14,16},
  {&(_tg__ZTV6dd3062__7ee33062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee33062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33062[];
extern  VTBL_ENTRY _ZTV7ee33062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33062[];
static VTBL_ENTRY alt_thunk_names947[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee330623fooEv,_ZTv0_n12_N7ee330623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee330623fooEv,_ZThn16_N7ee330623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee330623fooEv,_ZTv0_n16_N7ee330623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee330623fooEv,_ZThn8_N7ee330623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33062 = {  "ee33062", // class name
  bases_ee33062, 4,
  &(vtc_ee33062[0]), // expected_vtbl_contents
  &(vtt_ee33062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33062),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names947,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43062  : dd3062 {
  int e;
  virtual void  bar(); // _ZN7ee430623barEv
  ~ee43062(); // tgen
  ee43062(); // tgen
};
//SIG(1 ee43062) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee43062 ::bar(){vfunc_called(this, "_ZN7ee430623barEv");}
ee43062 ::~ee43062(){ note_dtor("ee43062", this);} // tgen
ee43062 ::ee43062(){ note_ctor("ee43062", this);} // tgen

static void Test_ee43062()
{
  extern Class_Descriptor cd_ee43062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43062, buf);
    ee43062 *dp, &lv = *(dp=new (buf) ee43062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee43062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee43062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(16,12), "ee43062");
    check_base_class_offset(lv, (dd3062*), 0, "ee43062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43062.e");
    test_class_info(&lv, &cd_ee43062);
    dp->~ee43062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43062(Test_ee43062, "ee43062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43062C1Ev();
extern void _ZN7ee43062D1Ev();
Name_Map name_map_ee43062[] = {
  NSPAIR(_ZN7ee43062C1Ev),
  NSPAIR(_ZN7ee43062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee43062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43062[];
extern void _ZN6dd30623fooEv();
extern void _ZN7ee430623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee430623barEv,_ZTv0_n16_N7ee430623barEv)();
extern void ABISELECT(_ZThn16_N7ee430623barEv,_ZThn12_N7ee430623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
  (VTBL_ENTRY)&_ZN7ee430623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee430623barEv,_ZTv0_n16_N7ee430623barEv),
};
extern VTBL_ENTRY _ZTV7ee43062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee43062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee43062[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee43062[] = {
  {&(_ZTV7ee43062[3]),  3,11},
  {&(_tg__ZTV6dd3062__7ee43062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee43062[4]),  4,6},
  {&(_ZTV7ee43062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43062[];
extern  VTBL_ENTRY _ZTV7ee43062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43062[];
static VTBL_ENTRY alt_thunk_names948[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee430623barEv,_ZTv0_n16_N7ee430623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee430623barEv,_ZThn12_N7ee430623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43062 = {  "ee43062", // class name
  bases_ee43062, 4,
  &(vtc_ee43062[0]), // expected_vtbl_contents
  &(vtt_ee43062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names948,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53062  : virtual dd3062 {
  int e;
  virtual void  bar(); // _ZN7ee530623barEv
  ~ee53062(); // tgen
  ee53062(); // tgen
};
//SIG(1 ee53062) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee53062 ::bar(){vfunc_called(this, "_ZN7ee530623barEv");}
ee53062 ::~ee53062(){ note_dtor("ee53062", this);} // tgen
ee53062 ::ee53062(){ note_ctor("ee53062", this);} // tgen

static void Test_ee53062()
{
  extern Class_Descriptor cd_ee53062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53062, buf);
    ee53062 *dp, &lv = *(dp=new (buf) ee53062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee53062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee53062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(32,16), "ee53062");
    check_base_class_offset(lv, (dd3062*), ABISELECT(16,8), "ee53062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53062.e");
    test_class_info(&lv, &cd_ee53062);
    dp->~ee53062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53062(Test_ee53062, "ee53062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53062C1Ev();
extern void _ZN7ee53062D1Ev();
Name_Map name_map_ee53062[] = {
  NSPAIR(_ZN7ee53062C1Ev),
  NSPAIR(_ZN7ee53062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee53062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53062[];
extern void _ZN7ee530623barEv();
extern void _ZN6dd30623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee530623barEv,_ZTv0_n16_N7ee530623barEv)();
extern void ABISELECT(_ZThn32_N7ee530623barEv,_ZThn16_N7ee530623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53062[0]),
  (VTBL_ENTRY)&_ZN7ee530623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee530623barEv,_ZTv0_n16_N7ee530623barEv),
};
extern VTBL_ENTRY _ZTV7ee53062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee53062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee53062[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee53062[] = {
  {&(_ZTV7ee53062[4]),  4,16},
  {&(_ZTV7ee53062[9]),  9,16},
  {&(_ZTV7ee53062[14]),  14,16},
  {&(_tg__ZTV6dd3062__7ee53062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee53062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53062[];
extern  VTBL_ENTRY _ZTV7ee53062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53062[];
static VTBL_ENTRY alt_thunk_names949[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee530623barEv,_ZTv0_n16_N7ee530623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee530623barEv,_ZThn16_N7ee530623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53062 = {  "ee53062", // class name
  bases_ee53062, 4,
  &(vtc_ee53062[0]), // expected_vtbl_contents
  &(vtt_ee53062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53062),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names949,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63062  : dd3062 {
  int e;
  virtual void  foo(); // _ZN7ee630623fooEv
  virtual void  bar(); // _ZN7ee630623barEv
  ~ee63062(); // tgen
  ee63062(); // tgen
};
//SIG(1 ee63062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee63062 ::foo(){vfunc_called(this, "_ZN7ee630623fooEv");}
void  ee63062 ::bar(){vfunc_called(this, "_ZN7ee630623barEv");}
ee63062 ::~ee63062(){ note_dtor("ee63062", this);} // tgen
ee63062 ::ee63062(){ note_ctor("ee63062", this);} // tgen

static void Test_ee63062()
{
  extern Class_Descriptor cd_ee63062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63062, buf);
    ee63062 *dp, &lv = *(dp=new (buf) ee63062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee63062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee63062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(16,12), "ee63062");
    check_base_class_offset(lv, (dd3062*), 0, "ee63062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63062.e");
    test_class_info(&lv, &cd_ee63062);
    dp->~ee63062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63062(Test_ee63062, "ee63062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63062C1Ev();
extern void _ZN7ee63062D1Ev();
Name_Map name_map_ee63062[] = {
  NSPAIR(_ZN7ee63062C1Ev),
  NSPAIR(_ZN7ee63062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee63062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63062[];
extern void _ZN7ee630623fooEv();
extern void _ZN7ee630623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee630623fooEv,_ZTv0_n12_N7ee630623fooEv)();
extern void ABISELECT(_ZThn16_N7ee630623fooEv,_ZThn12_N7ee630623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee630623barEv,_ZTv0_n16_N7ee630623barEv)();
extern void ABISELECT(_ZThn16_N7ee630623barEv,_ZThn12_N7ee630623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63062[0]),
  (VTBL_ENTRY)&_ZN7ee630623fooEv,
  (VTBL_ENTRY)&_ZN7ee630623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee630623fooEv,_ZTv0_n12_N7ee630623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee630623barEv,_ZTv0_n16_N7ee630623barEv),
};
extern VTBL_ENTRY _ZTV7ee63062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee63062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee63062[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee63062[] = {
  {&(_ZTV7ee63062[3]),  3,11},
  {&(_tg__ZTV6dd3062__7ee63062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee63062[4]),  4,6},
  {&(_ZTV7ee63062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63062[];
extern  VTBL_ENTRY _ZTV7ee63062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63062[];
static VTBL_ENTRY alt_thunk_names950[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn12_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee630623barEv,_ZTv0_n16_N7ee630623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee630623barEv,_ZThn12_N7ee630623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee630623fooEv,_ZTv0_n12_N7ee630623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee630623fooEv,_ZThn12_N7ee630623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63062 = {  "ee63062", // class name
  bases_ee63062, 4,
  &(vtc_ee63062[0]), // expected_vtbl_contents
  &(vtt_ee63062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names950,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73062  : virtual dd3062 {
  int e;
  virtual void  foo(); // _ZN7ee730623fooEv
  virtual void  bar(); // _ZN7ee730623barEv
  ~ee73062(); // tgen
  ee73062(); // tgen
};
//SIG(1 ee73062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee73062 ::foo(){vfunc_called(this, "_ZN7ee730623fooEv");}
void  ee73062 ::bar(){vfunc_called(this, "_ZN7ee730623barEv");}
ee73062 ::~ee73062(){ note_dtor("ee73062", this);} // tgen
ee73062 ::ee73062(){ note_ctor("ee73062", this);} // tgen

static void Test_ee73062()
{
  extern Class_Descriptor cd_ee73062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73062, buf);
    ee73062 *dp, &lv = *(dp=new (buf) ee73062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee73062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee73062");
    check_base_class_offset(lv, (cc062*)(dd3062*), ABISELECT(32,16), "ee73062");
    check_base_class_offset(lv, (dd3062*), ABISELECT(16,8), "ee73062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73062.e");
    test_class_info(&lv, &cd_ee73062);
    dp->~ee73062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73062(Test_ee73062, "ee73062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73062C1Ev();
extern void _ZN7ee73062D1Ev();
Name_Map name_map_ee73062[] = {
  NSPAIR(_ZN7ee73062C1Ev),
  NSPAIR(_ZN7ee73062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd3062;
extern VTBL_ENTRY _ZTI6dd3062[];
extern  VTBL_ENTRY _ZTV6dd3062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3062[];
static Base_Class bases_ee73062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3062,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73062[];
extern void _ZN7ee730623fooEv();
extern void _ZN7ee730623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee730623fooEv,_ZTv0_n16_N7ee730623fooEv)();
extern void ABISELECT(_ZThn16_N7ee730623fooEv,_ZThn8_N7ee730623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee730623fooEv,_ZTv0_n12_N7ee730623fooEv)();
extern void ABISELECT(_ZThn32_N7ee730623fooEv,_ZThn16_N7ee730623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee730623barEv,_ZTv0_n16_N7ee730623barEv)();
extern void ABISELECT(_ZThn32_N7ee730623barEv,_ZThn16_N7ee730623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73062[0]),
  (VTBL_ENTRY)&_ZN7ee730623fooEv,
  (VTBL_ENTRY)&_ZN7ee730623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee730623fooEv,_ZTv0_n16_N7ee730623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee730623fooEv,_ZTv0_n12_N7ee730623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee730623barEv,_ZTv0_n16_N7ee730623barEv),
};
extern VTBL_ENTRY _ZTV7ee73062[];
extern void _ZN6dd30623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3062__7ee73062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&_ZN6dd30623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv)();
extern void ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd3062__7ee73062[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee73062[] = {
  {&(_ZTV7ee73062[4]),  4,17},
  {&(_ZTV7ee73062[10]),  10,17},
  {&(_ZTV7ee73062[15]),  15,17},
  {&(_tg__ZTV6dd3062__7ee73062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd3062__7ee73062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73062[];
extern  VTBL_ENTRY _ZTV7ee73062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73062[];
static VTBL_ENTRY alt_thunk_names951[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd30623fooEv,_ZTv0_n12_N6dd30623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd30623fooEv,_ZThn8_N6dd30623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee730623barEv,_ZTv0_n16_N7ee730623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee730623barEv,_ZThn16_N7ee730623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee730623fooEv,_ZTv0_n12_N7ee730623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee730623fooEv,_ZThn16_N7ee730623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee730623fooEv,_ZTv0_n16_N7ee730623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee730623fooEv,_ZThn8_N7ee730623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73062 = {  "ee73062", // class name
  bases_ee73062, 4,
  &(vtc_ee73062[0]), // expected_vtbl_contents
  &(vtt_ee73062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73062),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names951,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4062  : cc062 {
  int d;
  virtual void  bar(); // _ZN6dd40623barEv
  ~dd4062(); // tgen
  dd4062(); // tgen
};
//SIG(-1 dd4062) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd4062 ::bar(){vfunc_called(this, "_ZN6dd40623barEv");}
dd4062 ::~dd4062(){ note_dtor("dd4062", this);} // tgen
dd4062 ::dd4062(){ note_ctor("dd4062", this);} // tgen

static void Test_dd4062()
{
  extern Class_Descriptor cd_dd4062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4062, buf);
    dd4062 *dp, &lv = *(dp=new (buf) dd4062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), 0, "dd4062");
    check_base_class_offset(lv, (bb62*)(cc062*), 0, "dd4062");
    check_base_class_offset(lv, (cc062*), 0, "dd4062");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4062.d");
    test_class_info(&lv, &cd_dd4062);
    dp->~dd4062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4062(Test_dd4062, "dd4062", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4062C1Ev();
extern void _ZN6dd4062D1Ev();
Name_Map name_map_dd4062[] = {
  NSPAIR(_ZN6dd4062C1Ev),
  NSPAIR(_ZN6dd4062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd4062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4062[];
extern void _ZN4bb623fooEv();
extern void _ZN6dd40623barEv();
static  VTBL_ENTRY vtc_dd4062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN6dd40623barEv,
};
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
Class_Descriptor cd_dd4062 = {  "dd4062", // class name
  bases_dd4062, 3,
  &(vtc_dd4062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4062),4, //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  ee04062  : dd4062 {
  int e;
  ~ee04062(); // tgen
  ee04062(); // tgen
};
//SIG(1 ee04062) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee04062 ::~ee04062(){ note_dtor("ee04062", this);} // tgen
ee04062 ::ee04062(){ note_ctor("ee04062", this);} // tgen

static void Test_ee04062()
{
  extern Class_Descriptor cd_ee04062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04062, buf);
    ee04062 *dp, &lv = *(dp=new (buf) ee04062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), 0, "ee04062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), 0, "ee04062");
    check_base_class_offset(lv, (cc062*)(dd4062*), 0, "ee04062");
    check_base_class_offset(lv, (dd4062*), 0, "ee04062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04062.e");
    test_class_info(&lv, &cd_ee04062);
    dp->~ee04062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04062(Test_ee04062, "ee04062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04062C1Ev();
extern void _ZN7ee04062D1Ev();
Name_Map name_map_ee04062[] = {
  NSPAIR(_ZN7ee04062C1Ev),
  NSPAIR(_ZN7ee04062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee04062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04062[];
extern void _ZN4bb623fooEv();
extern void _ZN6dd40623barEv();
static  VTBL_ENTRY vtc_ee04062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN6dd40623barEv,
};
extern VTBL_ENTRY _ZTI7ee04062[];
extern  VTBL_ENTRY _ZTV7ee04062[];
Class_Descriptor cd_ee04062 = {  "ee04062", // class name
  bases_ee04062, 4,
  &(vtc_ee04062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04062),4, //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  ee14062  : virtual dd4062 {
  int e;
  ~ee14062(); // tgen
  ee14062(); // tgen
};
//SIG(1 ee14062) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee14062 ::~ee14062(){ note_dtor("ee14062", this);} // tgen
ee14062 ::ee14062(){ note_ctor("ee14062", this);} // tgen

static void Test_ee14062()
{
  extern Class_Descriptor cd_ee14062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14062, buf);
    ee14062 *dp, &lv = *(dp=new (buf) ee14062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee14062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee14062");
    check_base_class_offset(lv, (cc062*)(dd4062*), ABISELECT(16,8), "ee14062");
    check_base_class_offset(lv, (dd4062*), ABISELECT(16,8), "ee14062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14062.e");
    test_class_info(&lv, &cd_ee14062);
    dp->~ee14062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14062(Test_ee14062, "ee14062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14062C1Ev();
extern void _ZN7ee14062D1Ev();
Name_Map name_map_ee14062[] = {
  NSPAIR(_ZN7ee14062C1Ev),
  NSPAIR(_ZN7ee14062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee14062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14062[];
extern void _ZN4bb623fooEv();
extern void _ZN6dd40623barEv();
static  VTBL_ENTRY vtc_ee14062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14062[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN6dd40623barEv,
};
extern VTBL_ENTRY _ZTV7ee14062[];
static  VTT_ENTRY vtt_ee14062[] = {
  {&(_ZTV7ee14062[3]),  3,9},
  {&(_ZTV7ee14062[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14062[];
extern  VTBL_ENTRY _ZTV7ee14062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14062[];
Class_Descriptor cd_ee14062 = {  "ee14062", // class name
  bases_ee14062, 4,
  &(vtc_ee14062[0]), // expected_vtbl_contents
  &(vtt_ee14062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14062),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14062),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  ee24062  : dd4062 {
  int e;
  virtual void  foo(); // _ZN7ee240623fooEv
  ~ee24062(); // tgen
  ee24062(); // tgen
};
//SIG(1 ee24062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee24062 ::foo(){vfunc_called(this, "_ZN7ee240623fooEv");}
ee24062 ::~ee24062(){ note_dtor("ee24062", this);} // tgen
ee24062 ::ee24062(){ note_ctor("ee24062", this);} // tgen

static void Test_ee24062()
{
  extern Class_Descriptor cd_ee24062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24062, buf);
    ee24062 *dp, &lv = *(dp=new (buf) ee24062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), 0, "ee24062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), 0, "ee24062");
    check_base_class_offset(lv, (cc062*)(dd4062*), 0, "ee24062");
    check_base_class_offset(lv, (dd4062*), 0, "ee24062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24062.e");
    test_class_info(&lv, &cd_ee24062);
    dp->~ee24062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24062(Test_ee24062, "ee24062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24062C1Ev();
extern void _ZN7ee24062D1Ev();
Name_Map name_map_ee24062[] = {
  NSPAIR(_ZN7ee24062C1Ev),
  NSPAIR(_ZN7ee24062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee24062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24062[];
extern void _ZN7ee240623fooEv();
extern void _ZN6dd40623barEv();
static  VTBL_ENTRY vtc_ee24062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24062[0]),
  (VTBL_ENTRY)&_ZN7ee240623fooEv,
  (VTBL_ENTRY)&_ZN6dd40623barEv,
};
extern VTBL_ENTRY _ZTI7ee24062[];
extern  VTBL_ENTRY _ZTV7ee24062[];
Class_Descriptor cd_ee24062 = {  "ee24062", // class name
  bases_ee24062, 4,
  &(vtc_ee24062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24062),4, //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  ee34062  : virtual dd4062 {
  int e;
  virtual void  foo(); // _ZN7ee340623fooEv
  ~ee34062(); // tgen
  ee34062(); // tgen
};
//SIG(1 ee34062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee34062 ::foo(){vfunc_called(this, "_ZN7ee340623fooEv");}
ee34062 ::~ee34062(){ note_dtor("ee34062", this);} // tgen
ee34062 ::ee34062(){ note_ctor("ee34062", this);} // tgen

static void Test_ee34062()
{
  extern Class_Descriptor cd_ee34062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34062, buf);
    ee34062 *dp, &lv = *(dp=new (buf) ee34062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee34062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee34062");
    check_base_class_offset(lv, (cc062*)(dd4062*), ABISELECT(16,8), "ee34062");
    check_base_class_offset(lv, (dd4062*), ABISELECT(16,8), "ee34062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34062.e");
    test_class_info(&lv, &cd_ee34062);
    dp->~ee34062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34062(Test_ee34062, "ee34062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34062C1Ev();
extern void _ZN7ee34062D1Ev();
Name_Map name_map_ee34062[] = {
  NSPAIR(_ZN7ee34062C1Ev),
  NSPAIR(_ZN7ee34062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee34062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34062[];
extern void _ZN7ee340623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee340623fooEv,_ZTv0_n12_N7ee340623fooEv)();
extern void ABISELECT(_ZThn16_N7ee340623fooEv,_ZThn8_N7ee340623fooEv)() __attribute__((weak));
extern void _ZN6dd40623barEv();
static  VTBL_ENTRY vtc_ee34062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34062[0]),
  (VTBL_ENTRY)&_ZN7ee340623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee340623fooEv,_ZTv0_n12_N7ee340623fooEv),
  (VTBL_ENTRY)&_ZN6dd40623barEv,
};
extern VTBL_ENTRY _ZTV7ee34062[];
static  VTT_ENTRY vtt_ee34062[] = {
  {&(_ZTV7ee34062[3]),  3,10},
  {&(_ZTV7ee34062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34062[];
extern  VTBL_ENTRY _ZTV7ee34062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34062[];
static VTBL_ENTRY alt_thunk_names952[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee340623fooEv,_ZTv0_n12_N7ee340623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee340623fooEv,_ZThn8_N7ee340623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34062 = {  "ee34062", // class name
  bases_ee34062, 4,
  &(vtc_ee34062[0]), // expected_vtbl_contents
  &(vtt_ee34062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names952,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44062  : dd4062 {
  int e;
  virtual void  bar(); // _ZN7ee440623barEv
  ~ee44062(); // tgen
  ee44062(); // tgen
};
//SIG(1 ee44062) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee44062 ::bar(){vfunc_called(this, "_ZN7ee440623barEv");}
ee44062 ::~ee44062(){ note_dtor("ee44062", this);} // tgen
ee44062 ::ee44062(){ note_ctor("ee44062", this);} // tgen

static void Test_ee44062()
{
  extern Class_Descriptor cd_ee44062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44062, buf);
    ee44062 *dp, &lv = *(dp=new (buf) ee44062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), 0, "ee44062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), 0, "ee44062");
    check_base_class_offset(lv, (cc062*)(dd4062*), 0, "ee44062");
    check_base_class_offset(lv, (dd4062*), 0, "ee44062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44062.e");
    test_class_info(&lv, &cd_ee44062);
    dp->~ee44062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44062(Test_ee44062, "ee44062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44062C1Ev();
extern void _ZN7ee44062D1Ev();
Name_Map name_map_ee44062[] = {
  NSPAIR(_ZN7ee44062C1Ev),
  NSPAIR(_ZN7ee44062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee44062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44062[];
extern void _ZN4bb623fooEv();
extern void _ZN7ee440623barEv();
static  VTBL_ENTRY vtc_ee44062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN7ee440623barEv,
};
extern VTBL_ENTRY _ZTI7ee44062[];
extern  VTBL_ENTRY _ZTV7ee44062[];
Class_Descriptor cd_ee44062 = {  "ee44062", // class name
  bases_ee44062, 4,
  &(vtc_ee44062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44062),4, //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  ee54062  : virtual dd4062 {
  int e;
  virtual void  bar(); // _ZN7ee540623barEv
  ~ee54062(); // tgen
  ee54062(); // tgen
};
//SIG(1 ee54062) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee54062 ::bar(){vfunc_called(this, "_ZN7ee540623barEv");}
ee54062 ::~ee54062(){ note_dtor("ee54062", this);} // tgen
ee54062 ::ee54062(){ note_ctor("ee54062", this);} // tgen

static void Test_ee54062()
{
  extern Class_Descriptor cd_ee54062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54062, buf);
    ee54062 *dp, &lv = *(dp=new (buf) ee54062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee54062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee54062");
    check_base_class_offset(lv, (cc062*)(dd4062*), ABISELECT(16,8), "ee54062");
    check_base_class_offset(lv, (dd4062*), ABISELECT(16,8), "ee54062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54062.e");
    test_class_info(&lv, &cd_ee54062);
    dp->~ee54062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54062(Test_ee54062, "ee54062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54062C1Ev();
extern void _ZN7ee54062D1Ev();
Name_Map name_map_ee54062[] = {
  NSPAIR(_ZN7ee54062C1Ev),
  NSPAIR(_ZN7ee54062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee54062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54062[];
extern void _ZN7ee540623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee540623barEv,_ZTv0_n16_N7ee540623barEv)();
extern void ABISELECT(_ZThn16_N7ee540623barEv,_ZThn8_N7ee540623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54062[0]),
  (VTBL_ENTRY)&_ZN7ee540623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee540623barEv,_ZTv0_n16_N7ee540623barEv),
};
extern VTBL_ENTRY _ZTV7ee54062[];
static  VTT_ENTRY vtt_ee54062[] = {
  {&(_ZTV7ee54062[3]),  3,10},
  {&(_ZTV7ee54062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54062[];
extern  VTBL_ENTRY _ZTV7ee54062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54062[];
static VTBL_ENTRY alt_thunk_names953[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee540623barEv,_ZTv0_n16_N7ee540623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee540623barEv,_ZThn8_N7ee540623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54062 = {  "ee54062", // class name
  bases_ee54062, 4,
  &(vtc_ee54062[0]), // expected_vtbl_contents
  &(vtt_ee54062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names953,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64062  : dd4062 {
  int e;
  virtual void  foo(); // _ZN7ee640623fooEv
  virtual void  bar(); // _ZN7ee640623barEv
  ~ee64062(); // tgen
  ee64062(); // tgen
};
//SIG(1 ee64062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee64062 ::foo(){vfunc_called(this, "_ZN7ee640623fooEv");}
void  ee64062 ::bar(){vfunc_called(this, "_ZN7ee640623barEv");}
ee64062 ::~ee64062(){ note_dtor("ee64062", this);} // tgen
ee64062 ::ee64062(){ note_ctor("ee64062", this);} // tgen

static void Test_ee64062()
{
  extern Class_Descriptor cd_ee64062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64062, buf);
    ee64062 *dp, &lv = *(dp=new (buf) ee64062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), 0, "ee64062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), 0, "ee64062");
    check_base_class_offset(lv, (cc062*)(dd4062*), 0, "ee64062");
    check_base_class_offset(lv, (dd4062*), 0, "ee64062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64062.e");
    test_class_info(&lv, &cd_ee64062);
    dp->~ee64062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64062(Test_ee64062, "ee64062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64062C1Ev();
extern void _ZN7ee64062D1Ev();
Name_Map name_map_ee64062[] = {
  NSPAIR(_ZN7ee64062C1Ev),
  NSPAIR(_ZN7ee64062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee64062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64062[];
extern void _ZN7ee640623fooEv();
extern void _ZN7ee640623barEv();
static  VTBL_ENTRY vtc_ee64062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64062[0]),
  (VTBL_ENTRY)&_ZN7ee640623fooEv,
  (VTBL_ENTRY)&_ZN7ee640623barEv,
};
extern VTBL_ENTRY _ZTI7ee64062[];
extern  VTBL_ENTRY _ZTV7ee64062[];
Class_Descriptor cd_ee64062 = {  "ee64062", // class name
  bases_ee64062, 4,
  &(vtc_ee64062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64062),4, //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  ee74062  : virtual dd4062 {
  int e;
  virtual void  foo(); // _ZN7ee740623fooEv
  virtual void  bar(); // _ZN7ee740623barEv
  ~ee74062(); // tgen
  ee74062(); // tgen
};
//SIG(1 ee74062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee74062 ::foo(){vfunc_called(this, "_ZN7ee740623fooEv");}
void  ee74062 ::bar(){vfunc_called(this, "_ZN7ee740623barEv");}
ee74062 ::~ee74062(){ note_dtor("ee74062", this);} // tgen
ee74062 ::ee74062(){ note_ctor("ee74062", this);} // tgen

static void Test_ee74062()
{
  extern Class_Descriptor cd_ee74062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74062, buf);
    ee74062 *dp, &lv = *(dp=new (buf) ee74062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee74062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd4062*), ABISELECT(16,8), "ee74062");
    check_base_class_offset(lv, (cc062*)(dd4062*), ABISELECT(16,8), "ee74062");
    check_base_class_offset(lv, (dd4062*), ABISELECT(16,8), "ee74062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74062.e");
    test_class_info(&lv, &cd_ee74062);
    dp->~ee74062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74062(Test_ee74062, "ee74062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74062C1Ev();
extern void _ZN7ee74062D1Ev();
Name_Map name_map_ee74062[] = {
  NSPAIR(_ZN7ee74062C1Ev),
  NSPAIR(_ZN7ee74062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd4062;
extern VTBL_ENTRY _ZTI6dd4062[];
extern  VTBL_ENTRY _ZTV6dd4062[];
static Base_Class bases_ee74062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4062,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74062[];
extern void _ZN7ee740623fooEv();
extern void _ZN7ee740623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee740623fooEv,_ZTv0_n12_N7ee740623fooEv)();
extern void ABISELECT(_ZThn16_N7ee740623fooEv,_ZThn8_N7ee740623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee740623barEv,_ZTv0_n16_N7ee740623barEv)();
extern void ABISELECT(_ZThn16_N7ee740623barEv,_ZThn8_N7ee740623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74062[0]),
  (VTBL_ENTRY)&_ZN7ee740623fooEv,
  (VTBL_ENTRY)&_ZN7ee740623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee740623fooEv,_ZTv0_n12_N7ee740623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee740623barEv,_ZTv0_n16_N7ee740623barEv),
};
extern VTBL_ENTRY _ZTV7ee74062[];
static  VTT_ENTRY vtt_ee74062[] = {
  {&(_ZTV7ee74062[3]),  3,11},
  {&(_ZTV7ee74062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74062[];
extern  VTBL_ENTRY _ZTV7ee74062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74062[];
static VTBL_ENTRY alt_thunk_names954[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee740623barEv,_ZTv0_n16_N7ee740623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee740623barEv,_ZThn8_N7ee740623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee740623fooEv,_ZTv0_n12_N7ee740623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee740623fooEv,_ZThn8_N7ee740623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74062 = {  "ee74062", // class name
  bases_ee74062, 4,
  &(vtc_ee74062[0]), // expected_vtbl_contents
  &(vtt_ee74062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names954,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5062  : virtual cc062 {
  int d;
  virtual void  bar(); // _ZN6dd50623barEv
  ~dd5062(); // tgen
  dd5062(); // tgen
};
//SIG(-1 dd5062) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd5062 ::bar(){vfunc_called(this, "_ZN6dd50623barEv");}
dd5062 ::~dd5062(){ note_dtor("dd5062", this);} // tgen
dd5062 ::dd5062(){ note_ctor("dd5062", this);} // tgen

static void Test_dd5062()
{
  extern Class_Descriptor cd_dd5062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5062, buf);
    dd5062 *dp, &lv = *(dp=new (buf) dd5062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,8), "dd5062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,8), "dd5062");
    check_base_class_offset(lv, (cc062*), ABISELECT(16,8), "dd5062");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5062.d");
    test_class_info(&lv, &cd_dd5062);
    dp->~dd5062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5062(Test_dd5062, "dd5062", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5062C1Ev();
extern void _ZN6dd5062D1Ev();
Name_Map name_map_dd5062[] = {
  NSPAIR(_ZN6dd5062C1Ev),
  NSPAIR(_ZN6dd5062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd5062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5062[];
extern void _ZN6dd50623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
extern VTBL_ENTRY _ZTV6dd5062[];
static  VTT_ENTRY vtt_dd5062[] = {
  {&(_ZTV6dd5062[3]),  3,10},
  {&(_ZTV6dd5062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static VTBL_ENTRY alt_thunk_names955[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5062 = {  "dd5062", // class name
  bases_dd5062, 3,
  &(vtc_dd5062[0]), // expected_vtbl_contents
  &(vtt_dd5062[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5062),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names955,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05062  : dd5062 {
  int e;
  ~ee05062(); // tgen
  ee05062(); // tgen
};
//SIG(1 ee05062) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee05062 ::~ee05062(){ note_dtor("ee05062", this);} // tgen
ee05062 ::ee05062(){ note_ctor("ee05062", this);} // tgen

static void Test_ee05062()
{
  extern Class_Descriptor cd_ee05062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05062, buf);
    ee05062 *dp, &lv = *(dp=new (buf) ee05062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee05062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee05062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(16,12), "ee05062");
    check_base_class_offset(lv, (dd5062*), 0, "ee05062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05062.e");
    test_class_info(&lv, &cd_ee05062);
    dp->~ee05062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05062(Test_ee05062, "ee05062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05062C1Ev();
extern void _ZN7ee05062D1Ev();
Name_Map name_map_ee05062[] = {
  NSPAIR(_ZN7ee05062C1Ev),
  NSPAIR(_ZN7ee05062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee05062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05062[];
extern void _ZN6dd50623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
extern VTBL_ENTRY _ZTV7ee05062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee05062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee05062[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee05062[] = {
  {&(_ZTV7ee05062[3]),  3,10},
  {&(_tg__ZTV6dd5062__7ee05062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee05062[4]),  4,6},
  {&(_ZTV7ee05062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05062[];
extern  VTBL_ENTRY _ZTV7ee05062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05062[];
static VTBL_ENTRY alt_thunk_names956[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05062 = {  "ee05062", // class name
  bases_ee05062, 4,
  &(vtc_ee05062[0]), // expected_vtbl_contents
  &(vtt_ee05062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names956,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15062  : virtual dd5062 {
  int e;
  ~ee15062(); // tgen
  ee15062(); // tgen
};
//SIG(1 ee15062) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee15062 ::~ee15062(){ note_dtor("ee15062", this);} // tgen
ee15062 ::ee15062(){ note_ctor("ee15062", this);} // tgen

static void Test_ee15062()
{
  extern Class_Descriptor cd_ee15062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15062, buf);
    ee15062 *dp, &lv = *(dp=new (buf) ee15062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee15062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee15062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(32,16), "ee15062");
    check_base_class_offset(lv, (dd5062*), ABISELECT(16,8), "ee15062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15062.e");
    test_class_info(&lv, &cd_ee15062);
    dp->~ee15062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15062(Test_ee15062, "ee15062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15062C1Ev();
extern void _ZN7ee15062D1Ev();
Name_Map name_map_ee15062[] = {
  NSPAIR(_ZN7ee15062C1Ev),
  NSPAIR(_ZN7ee15062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee15062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15062[];
extern void _ZN6dd50623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15062[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
extern VTBL_ENTRY _ZTV7ee15062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee15062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee15062[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee15062[] = {
  {&(_ZTV7ee15062[4]),  4,15},
  {&(_ZTV7ee15062[8]),  8,15},
  {&(_ZTV7ee15062[13]),  13,15},
  {&(_tg__ZTV6dd5062__7ee15062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee15062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15062[];
extern  VTBL_ENTRY _ZTV7ee15062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15062[];
static VTBL_ENTRY alt_thunk_names957[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15062 = {  "ee15062", // class name
  bases_ee15062, 4,
  &(vtc_ee15062[0]), // expected_vtbl_contents
  &(vtt_ee15062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15062),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names957,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25062  : dd5062 {
  int e;
  virtual void  foo(); // _ZN7ee250623fooEv
  ~ee25062(); // tgen
  ee25062(); // tgen
};
//SIG(1 ee25062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee25062 ::foo(){vfunc_called(this, "_ZN7ee250623fooEv");}
ee25062 ::~ee25062(){ note_dtor("ee25062", this);} // tgen
ee25062 ::ee25062(){ note_ctor("ee25062", this);} // tgen

static void Test_ee25062()
{
  extern Class_Descriptor cd_ee25062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25062, buf);
    ee25062 *dp, &lv = *(dp=new (buf) ee25062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee25062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee25062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(16,12), "ee25062");
    check_base_class_offset(lv, (dd5062*), 0, "ee25062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25062.e");
    test_class_info(&lv, &cd_ee25062);
    dp->~ee25062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25062(Test_ee25062, "ee25062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25062C1Ev();
extern void _ZN7ee25062D1Ev();
Name_Map name_map_ee25062[] = {
  NSPAIR(_ZN7ee25062C1Ev),
  NSPAIR(_ZN7ee25062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee25062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25062[];
extern void _ZN6dd50623barEv();
extern void _ZN7ee250623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee250623fooEv,_ZTv0_n12_N7ee250623fooEv)();
extern void ABISELECT(_ZThn16_N7ee250623fooEv,_ZThn12_N7ee250623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
  (VTBL_ENTRY)&_ZN7ee250623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee250623fooEv,_ZTv0_n12_N7ee250623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
extern VTBL_ENTRY _ZTV7ee25062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee25062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee25062[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee25062[] = {
  {&(_ZTV7ee25062[3]),  3,11},
  {&(_tg__ZTV6dd5062__7ee25062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee25062[4]),  4,6},
  {&(_ZTV7ee25062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25062[];
extern  VTBL_ENTRY _ZTV7ee25062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25062[];
static VTBL_ENTRY alt_thunk_names958[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee250623fooEv,_ZTv0_n12_N7ee250623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee250623fooEv,_ZThn12_N7ee250623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25062 = {  "ee25062", // class name
  bases_ee25062, 4,
  &(vtc_ee25062[0]), // expected_vtbl_contents
  &(vtt_ee25062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names958,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35062  : virtual dd5062 {
  int e;
  virtual void  foo(); // _ZN7ee350623fooEv
  ~ee35062(); // tgen
  ee35062(); // tgen
};
//SIG(1 ee35062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee35062 ::foo(){vfunc_called(this, "_ZN7ee350623fooEv");}
ee35062 ::~ee35062(){ note_dtor("ee35062", this);} // tgen
ee35062 ::ee35062(){ note_ctor("ee35062", this);} // tgen

static void Test_ee35062()
{
  extern Class_Descriptor cd_ee35062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35062, buf);
    ee35062 *dp, &lv = *(dp=new (buf) ee35062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee35062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee35062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(32,16), "ee35062");
    check_base_class_offset(lv, (dd5062*), ABISELECT(16,8), "ee35062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35062.e");
    test_class_info(&lv, &cd_ee35062);
    dp->~ee35062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35062(Test_ee35062, "ee35062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35062C1Ev();
extern void _ZN7ee35062D1Ev();
Name_Map name_map_ee35062[] = {
  NSPAIR(_ZN7ee35062C1Ev),
  NSPAIR(_ZN7ee35062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee35062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35062[];
extern void _ZN7ee350623fooEv();
extern void _ZN6dd50623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee350623fooEv,_ZTv0_n12_N7ee350623fooEv)();
extern void ABISELECT(_ZThn32_N7ee350623fooEv,_ZThn16_N7ee350623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35062[0]),
  (VTBL_ENTRY)&_ZN7ee350623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee350623fooEv,_ZTv0_n12_N7ee350623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
extern VTBL_ENTRY _ZTV7ee35062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee35062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee35062[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee35062[] = {
  {&(_ZTV7ee35062[4]),  4,16},
  {&(_ZTV7ee35062[9]),  9,16},
  {&(_ZTV7ee35062[14]),  14,16},
  {&(_tg__ZTV6dd5062__7ee35062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee35062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35062[];
extern  VTBL_ENTRY _ZTV7ee35062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35062[];
static VTBL_ENTRY alt_thunk_names959[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee350623fooEv,_ZTv0_n12_N7ee350623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee350623fooEv,_ZThn16_N7ee350623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35062 = {  "ee35062", // class name
  bases_ee35062, 4,
  &(vtc_ee35062[0]), // expected_vtbl_contents
  &(vtt_ee35062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35062),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names959,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45062  : dd5062 {
  int e;
  virtual void  bar(); // _ZN7ee450623barEv
  ~ee45062(); // tgen
  ee45062(); // tgen
};
//SIG(1 ee45062) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee45062 ::bar(){vfunc_called(this, "_ZN7ee450623barEv");}
ee45062 ::~ee45062(){ note_dtor("ee45062", this);} // tgen
ee45062 ::ee45062(){ note_ctor("ee45062", this);} // tgen

static void Test_ee45062()
{
  extern Class_Descriptor cd_ee45062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45062, buf);
    ee45062 *dp, &lv = *(dp=new (buf) ee45062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee45062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee45062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(16,12), "ee45062");
    check_base_class_offset(lv, (dd5062*), 0, "ee45062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45062.e");
    test_class_info(&lv, &cd_ee45062);
    dp->~ee45062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45062(Test_ee45062, "ee45062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45062C1Ev();
extern void _ZN7ee45062D1Ev();
Name_Map name_map_ee45062[] = {
  NSPAIR(_ZN7ee45062C1Ev),
  NSPAIR(_ZN7ee45062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee45062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45062[];
extern void _ZN7ee450623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee450623barEv,_ZTv0_n16_N7ee450623barEv)();
extern void ABISELECT(_ZThn16_N7ee450623barEv,_ZThn12_N7ee450623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45062[0]),
  (VTBL_ENTRY)&_ZN7ee450623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee450623barEv,_ZTv0_n16_N7ee450623barEv),
};
extern VTBL_ENTRY _ZTV7ee45062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee45062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee45062[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee45062[] = {
  {&(_ZTV7ee45062[3]),  3,10},
  {&(_tg__ZTV6dd5062__7ee45062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee45062[4]),  4,6},
  {&(_ZTV7ee45062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45062[];
extern  VTBL_ENTRY _ZTV7ee45062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45062[];
static VTBL_ENTRY alt_thunk_names960[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee450623barEv,_ZTv0_n16_N7ee450623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee450623barEv,_ZThn12_N7ee450623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45062 = {  "ee45062", // class name
  bases_ee45062, 4,
  &(vtc_ee45062[0]), // expected_vtbl_contents
  &(vtt_ee45062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names960,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55062  : virtual dd5062 {
  int e;
  virtual void  bar(); // _ZN7ee550623barEv
  ~ee55062(); // tgen
  ee55062(); // tgen
};
//SIG(1 ee55062) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee55062 ::bar(){vfunc_called(this, "_ZN7ee550623barEv");}
ee55062 ::~ee55062(){ note_dtor("ee55062", this);} // tgen
ee55062 ::ee55062(){ note_ctor("ee55062", this);} // tgen

static void Test_ee55062()
{
  extern Class_Descriptor cd_ee55062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55062, buf);
    ee55062 *dp, &lv = *(dp=new (buf) ee55062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee55062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee55062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(32,16), "ee55062");
    check_base_class_offset(lv, (dd5062*), ABISELECT(16,8), "ee55062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55062.e");
    test_class_info(&lv, &cd_ee55062);
    dp->~ee55062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55062(Test_ee55062, "ee55062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55062C1Ev();
extern void _ZN7ee55062D1Ev();
Name_Map name_map_ee55062[] = {
  NSPAIR(_ZN7ee55062C1Ev),
  NSPAIR(_ZN7ee55062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee55062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55062[];
extern void _ZN7ee550623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee550623barEv,_ZTv0_n16_N7ee550623barEv)();
extern void ABISELECT(_ZThn16_N7ee550623barEv,_ZThn8_N7ee550623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee550623barEv,_ZTv0_n16_N7ee550623barEv)();
extern void ABISELECT(_ZThn32_N7ee550623barEv,_ZThn16_N7ee550623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55062[0]),
  (VTBL_ENTRY)&_ZN7ee550623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee550623barEv,_ZTv0_n16_N7ee550623barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee550623barEv,_ZTv0_n16_N7ee550623barEv),
};
extern VTBL_ENTRY _ZTV7ee55062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee55062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee55062[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee55062[] = {
  {&(_ZTV7ee55062[4]),  4,16},
  {&(_ZTV7ee55062[9]),  9,16},
  {&(_ZTV7ee55062[14]),  14,16},
  {&(_tg__ZTV6dd5062__7ee55062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee55062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55062[];
extern  VTBL_ENTRY _ZTV7ee55062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55062[];
static VTBL_ENTRY alt_thunk_names961[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee550623barEv,_ZTv0_n16_N7ee550623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee550623barEv,_ZThn16_N7ee550623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee550623barEv,_ZThn8_N7ee550623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55062 = {  "ee55062", // class name
  bases_ee55062, 4,
  &(vtc_ee55062[0]), // expected_vtbl_contents
  &(vtt_ee55062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55062),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names961,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65062  : dd5062 {
  int e;
  virtual void  foo(); // _ZN7ee650623fooEv
  virtual void  bar(); // _ZN7ee650623barEv
  ~ee65062(); // tgen
  ee65062(); // tgen
};
//SIG(1 ee65062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee65062 ::foo(){vfunc_called(this, "_ZN7ee650623fooEv");}
void  ee65062 ::bar(){vfunc_called(this, "_ZN7ee650623barEv");}
ee65062 ::~ee65062(){ note_dtor("ee65062", this);} // tgen
ee65062 ::ee65062(){ note_ctor("ee65062", this);} // tgen

static void Test_ee65062()
{
  extern Class_Descriptor cd_ee65062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65062, buf);
    ee65062 *dp, &lv = *(dp=new (buf) ee65062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee65062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee65062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(16,12), "ee65062");
    check_base_class_offset(lv, (dd5062*), 0, "ee65062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65062.e");
    test_class_info(&lv, &cd_ee65062);
    dp->~ee65062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65062(Test_ee65062, "ee65062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65062C1Ev();
extern void _ZN7ee65062D1Ev();
Name_Map name_map_ee65062[] = {
  NSPAIR(_ZN7ee65062C1Ev),
  NSPAIR(_ZN7ee65062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee65062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65062[];
extern void _ZN7ee650623barEv();
extern void _ZN7ee650623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee650623fooEv,_ZTv0_n12_N7ee650623fooEv)();
extern void ABISELECT(_ZThn16_N7ee650623fooEv,_ZThn12_N7ee650623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee650623barEv,_ZTv0_n16_N7ee650623barEv)();
extern void ABISELECT(_ZThn16_N7ee650623barEv,_ZThn12_N7ee650623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65062[0]),
  (VTBL_ENTRY)&_ZN7ee650623barEv,
  (VTBL_ENTRY)&_ZN7ee650623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee650623fooEv,_ZTv0_n12_N7ee650623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee650623barEv,_ZTv0_n16_N7ee650623barEv),
};
extern VTBL_ENTRY _ZTV7ee65062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee65062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee65062[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee65062[] = {
  {&(_ZTV7ee65062[3]),  3,11},
  {&(_tg__ZTV6dd5062__7ee65062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee65062[4]),  4,6},
  {&(_ZTV7ee65062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65062[];
extern  VTBL_ENTRY _ZTV7ee65062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65062[];
static VTBL_ENTRY alt_thunk_names962[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn12_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee650623barEv,_ZTv0_n16_N7ee650623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee650623barEv,_ZThn12_N7ee650623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee650623fooEv,_ZTv0_n12_N7ee650623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee650623fooEv,_ZThn12_N7ee650623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65062 = {  "ee65062", // class name
  bases_ee65062, 4,
  &(vtc_ee65062[0]), // expected_vtbl_contents
  &(vtt_ee65062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names962,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75062  : virtual dd5062 {
  int e;
  virtual void  foo(); // _ZN7ee750623fooEv
  virtual void  bar(); // _ZN7ee750623barEv
  ~ee75062(); // tgen
  ee75062(); // tgen
};
//SIG(1 ee75062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee75062 ::foo(){vfunc_called(this, "_ZN7ee750623fooEv");}
void  ee75062 ::bar(){vfunc_called(this, "_ZN7ee750623barEv");}
ee75062 ::~ee75062(){ note_dtor("ee75062", this);} // tgen
ee75062 ::ee75062(){ note_ctor("ee75062", this);} // tgen

static void Test_ee75062()
{
  extern Class_Descriptor cd_ee75062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75062, buf);
    ee75062 *dp, &lv = *(dp=new (buf) ee75062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee75062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee75062");
    check_base_class_offset(lv, (cc062*)(dd5062*), ABISELECT(32,16), "ee75062");
    check_base_class_offset(lv, (dd5062*), ABISELECT(16,8), "ee75062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75062.e");
    test_class_info(&lv, &cd_ee75062);
    dp->~ee75062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75062(Test_ee75062, "ee75062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75062C1Ev();
extern void _ZN7ee75062D1Ev();
Name_Map name_map_ee75062[] = {
  NSPAIR(_ZN7ee75062C1Ev),
  NSPAIR(_ZN7ee75062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd5062;
extern VTBL_ENTRY _ZTI6dd5062[];
extern  VTBL_ENTRY _ZTV6dd5062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5062[];
static Base_Class bases_ee75062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5062,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75062[];
extern void _ZN7ee750623fooEv();
extern void _ZN7ee750623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee750623barEv,_ZTv0_n16_N7ee750623barEv)();
extern void ABISELECT(_ZThn16_N7ee750623barEv,_ZThn8_N7ee750623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee750623fooEv,_ZTv0_n12_N7ee750623fooEv)();
extern void ABISELECT(_ZThn32_N7ee750623fooEv,_ZThn16_N7ee750623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee750623barEv,_ZTv0_n16_N7ee750623barEv)();
extern void ABISELECT(_ZThn32_N7ee750623barEv,_ZThn16_N7ee750623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75062[0]),
  (VTBL_ENTRY)&_ZN7ee750623fooEv,
  (VTBL_ENTRY)&_ZN7ee750623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee750623barEv,_ZTv0_n16_N7ee750623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee750623fooEv,_ZTv0_n12_N7ee750623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee750623barEv,_ZTv0_n16_N7ee750623barEv),
};
extern VTBL_ENTRY _ZTV7ee75062[];
extern void _ZN6dd50623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5062__7ee75062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN6dd50623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv)();
extern void ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd5062__7ee75062[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5062[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv),
};
static  VTT_ENTRY vtt_ee75062[] = {
  {&(_ZTV7ee75062[4]),  4,17},
  {&(_ZTV7ee75062[10]),  10,17},
  {&(_ZTV7ee75062[15]),  15,17},
  {&(_tg__ZTV6dd5062__7ee75062[3]),  3,4},
  {&(_tg__ZTV4bb625cc062__6dd5062__7ee75062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75062[];
extern  VTBL_ENTRY _ZTV7ee75062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75062[];
static VTBL_ENTRY alt_thunk_names963[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd50623barEv,_ZTv0_n16_N6dd50623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd50623barEv,_ZThn8_N6dd50623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee750623fooEv,_ZTv0_n12_N7ee750623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee750623fooEv,_ZThn16_N7ee750623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee750623barEv,_ZTv0_n16_N7ee750623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee750623barEv,_ZThn16_N7ee750623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee750623barEv,_ZThn8_N7ee750623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75062 = {  "ee75062", // class name
  bases_ee75062, 4,
  &(vtc_ee75062[0]), // expected_vtbl_contents
  &(vtt_ee75062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75062),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names963,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6062  : cc062 {
  int d;
  virtual void  bar(); // _ZN6dd60623barEv
  virtual void  foo(); // _ZN6dd60623fooEv
  ~dd6062(); // tgen
  dd6062(); // tgen
};
//SIG(-1 dd6062) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd6062 ::bar(){vfunc_called(this, "_ZN6dd60623barEv");}
void  dd6062 ::foo(){vfunc_called(this, "_ZN6dd60623fooEv");}
dd6062 ::~dd6062(){ note_dtor("dd6062", this);} // tgen
dd6062 ::dd6062(){ note_ctor("dd6062", this);} // tgen

static void Test_dd6062()
{
  extern Class_Descriptor cd_dd6062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6062, buf);
    dd6062 *dp, &lv = *(dp=new (buf) dd6062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), 0, "dd6062");
    check_base_class_offset(lv, (bb62*)(cc062*), 0, "dd6062");
    check_base_class_offset(lv, (cc062*), 0, "dd6062");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6062.d");
    test_class_info(&lv, &cd_dd6062);
    dp->~dd6062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6062(Test_dd6062, "dd6062", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6062C1Ev();
extern void _ZN6dd6062D1Ev();
Name_Map name_map_dd6062[] = {
  NSPAIR(_ZN6dd6062C1Ev),
  NSPAIR(_ZN6dd6062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd6062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6062[];
extern void _ZN6dd60623fooEv();
extern void _ZN6dd60623barEv();
static  VTBL_ENTRY vtc_dd6062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6062[0]),
  (VTBL_ENTRY)&_ZN6dd60623fooEv,
  (VTBL_ENTRY)&_ZN6dd60623barEv,
};
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
Class_Descriptor cd_dd6062 = {  "dd6062", // class name
  bases_dd6062, 3,
  &(vtc_dd6062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6062),4, //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  ee06062  : dd6062 {
  int e;
  ~ee06062(); // tgen
  ee06062(); // tgen
};
//SIG(1 ee06062) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee06062 ::~ee06062(){ note_dtor("ee06062", this);} // tgen
ee06062 ::ee06062(){ note_ctor("ee06062", this);} // tgen

static void Test_ee06062()
{
  extern Class_Descriptor cd_ee06062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06062, buf);
    ee06062 *dp, &lv = *(dp=new (buf) ee06062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), 0, "ee06062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), 0, "ee06062");
    check_base_class_offset(lv, (cc062*)(dd6062*), 0, "ee06062");
    check_base_class_offset(lv, (dd6062*), 0, "ee06062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06062.e");
    test_class_info(&lv, &cd_ee06062);
    dp->~ee06062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06062(Test_ee06062, "ee06062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06062C1Ev();
extern void _ZN7ee06062D1Ev();
Name_Map name_map_ee06062[] = {
  NSPAIR(_ZN7ee06062C1Ev),
  NSPAIR(_ZN7ee06062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee06062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06062[];
extern void _ZN6dd60623fooEv();
extern void _ZN6dd60623barEv();
static  VTBL_ENTRY vtc_ee06062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06062[0]),
  (VTBL_ENTRY)&_ZN6dd60623fooEv,
  (VTBL_ENTRY)&_ZN6dd60623barEv,
};
extern VTBL_ENTRY _ZTI7ee06062[];
extern  VTBL_ENTRY _ZTV7ee06062[];
Class_Descriptor cd_ee06062 = {  "ee06062", // class name
  bases_ee06062, 4,
  &(vtc_ee06062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06062),4, //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  ee16062  : virtual dd6062 {
  int e;
  ~ee16062(); // tgen
  ee16062(); // tgen
};
//SIG(1 ee16062) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee16062 ::~ee16062(){ note_dtor("ee16062", this);} // tgen
ee16062 ::ee16062(){ note_ctor("ee16062", this);} // tgen

static void Test_ee16062()
{
  extern Class_Descriptor cd_ee16062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16062, buf);
    ee16062 *dp, &lv = *(dp=new (buf) ee16062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee16062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee16062");
    check_base_class_offset(lv, (cc062*)(dd6062*), ABISELECT(16,8), "ee16062");
    check_base_class_offset(lv, (dd6062*), ABISELECT(16,8), "ee16062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16062.e");
    test_class_info(&lv, &cd_ee16062);
    dp->~ee16062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16062(Test_ee16062, "ee16062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16062C1Ev();
extern void _ZN7ee16062D1Ev();
Name_Map name_map_ee16062[] = {
  NSPAIR(_ZN7ee16062C1Ev),
  NSPAIR(_ZN7ee16062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee16062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16062[];
extern void _ZN6dd60623fooEv();
extern void _ZN6dd60623barEv();
static  VTBL_ENTRY vtc_ee16062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16062[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16062[0]),
  (VTBL_ENTRY)&_ZN6dd60623fooEv,
  (VTBL_ENTRY)&_ZN6dd60623barEv,
};
extern VTBL_ENTRY _ZTV7ee16062[];
static  VTT_ENTRY vtt_ee16062[] = {
  {&(_ZTV7ee16062[3]),  3,9},
  {&(_ZTV7ee16062[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16062[];
extern  VTBL_ENTRY _ZTV7ee16062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16062[];
Class_Descriptor cd_ee16062 = {  "ee16062", // class name
  bases_ee16062, 4,
  &(vtc_ee16062[0]), // expected_vtbl_contents
  &(vtt_ee16062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16062),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16062),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  ee26062  : dd6062 {
  int e;
  virtual void  foo(); // _ZN7ee260623fooEv
  ~ee26062(); // tgen
  ee26062(); // tgen
};
//SIG(1 ee26062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee26062 ::foo(){vfunc_called(this, "_ZN7ee260623fooEv");}
ee26062 ::~ee26062(){ note_dtor("ee26062", this);} // tgen
ee26062 ::ee26062(){ note_ctor("ee26062", this);} // tgen

static void Test_ee26062()
{
  extern Class_Descriptor cd_ee26062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26062, buf);
    ee26062 *dp, &lv = *(dp=new (buf) ee26062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), 0, "ee26062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), 0, "ee26062");
    check_base_class_offset(lv, (cc062*)(dd6062*), 0, "ee26062");
    check_base_class_offset(lv, (dd6062*), 0, "ee26062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26062.e");
    test_class_info(&lv, &cd_ee26062);
    dp->~ee26062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26062(Test_ee26062, "ee26062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26062C1Ev();
extern void _ZN7ee26062D1Ev();
Name_Map name_map_ee26062[] = {
  NSPAIR(_ZN7ee26062C1Ev),
  NSPAIR(_ZN7ee26062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee26062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26062[];
extern void _ZN7ee260623fooEv();
extern void _ZN6dd60623barEv();
static  VTBL_ENTRY vtc_ee26062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26062[0]),
  (VTBL_ENTRY)&_ZN7ee260623fooEv,
  (VTBL_ENTRY)&_ZN6dd60623barEv,
};
extern VTBL_ENTRY _ZTI7ee26062[];
extern  VTBL_ENTRY _ZTV7ee26062[];
Class_Descriptor cd_ee26062 = {  "ee26062", // class name
  bases_ee26062, 4,
  &(vtc_ee26062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26062),4, //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  ee36062  : virtual dd6062 {
  int e;
  virtual void  foo(); // _ZN7ee360623fooEv
  ~ee36062(); // tgen
  ee36062(); // tgen
};
//SIG(1 ee36062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee36062 ::foo(){vfunc_called(this, "_ZN7ee360623fooEv");}
ee36062 ::~ee36062(){ note_dtor("ee36062", this);} // tgen
ee36062 ::ee36062(){ note_ctor("ee36062", this);} // tgen

static void Test_ee36062()
{
  extern Class_Descriptor cd_ee36062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36062, buf);
    ee36062 *dp, &lv = *(dp=new (buf) ee36062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee36062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee36062");
    check_base_class_offset(lv, (cc062*)(dd6062*), ABISELECT(16,8), "ee36062");
    check_base_class_offset(lv, (dd6062*), ABISELECT(16,8), "ee36062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36062.e");
    test_class_info(&lv, &cd_ee36062);
    dp->~ee36062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36062(Test_ee36062, "ee36062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36062C1Ev();
extern void _ZN7ee36062D1Ev();
Name_Map name_map_ee36062[] = {
  NSPAIR(_ZN7ee36062C1Ev),
  NSPAIR(_ZN7ee36062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee36062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36062[];
extern void _ZN7ee360623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee360623fooEv,_ZTv0_n12_N7ee360623fooEv)();
extern void ABISELECT(_ZThn16_N7ee360623fooEv,_ZThn8_N7ee360623fooEv)() __attribute__((weak));
extern void _ZN6dd60623barEv();
static  VTBL_ENTRY vtc_ee36062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36062[0]),
  (VTBL_ENTRY)&_ZN7ee360623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee360623fooEv,_ZTv0_n12_N7ee360623fooEv),
  (VTBL_ENTRY)&_ZN6dd60623barEv,
};
extern VTBL_ENTRY _ZTV7ee36062[];
static  VTT_ENTRY vtt_ee36062[] = {
  {&(_ZTV7ee36062[3]),  3,10},
  {&(_ZTV7ee36062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36062[];
extern  VTBL_ENTRY _ZTV7ee36062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36062[];
static VTBL_ENTRY alt_thunk_names964[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee360623fooEv,_ZTv0_n12_N7ee360623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee360623fooEv,_ZThn8_N7ee360623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36062 = {  "ee36062", // class name
  bases_ee36062, 4,
  &(vtc_ee36062[0]), // expected_vtbl_contents
  &(vtt_ee36062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names964,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46062  : dd6062 {
  int e;
  virtual void  bar(); // _ZN7ee460623barEv
  ~ee46062(); // tgen
  ee46062(); // tgen
};
//SIG(1 ee46062) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee46062 ::bar(){vfunc_called(this, "_ZN7ee460623barEv");}
ee46062 ::~ee46062(){ note_dtor("ee46062", this);} // tgen
ee46062 ::ee46062(){ note_ctor("ee46062", this);} // tgen

static void Test_ee46062()
{
  extern Class_Descriptor cd_ee46062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46062, buf);
    ee46062 *dp, &lv = *(dp=new (buf) ee46062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), 0, "ee46062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), 0, "ee46062");
    check_base_class_offset(lv, (cc062*)(dd6062*), 0, "ee46062");
    check_base_class_offset(lv, (dd6062*), 0, "ee46062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46062.e");
    test_class_info(&lv, &cd_ee46062);
    dp->~ee46062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46062(Test_ee46062, "ee46062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46062C1Ev();
extern void _ZN7ee46062D1Ev();
Name_Map name_map_ee46062[] = {
  NSPAIR(_ZN7ee46062C1Ev),
  NSPAIR(_ZN7ee46062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee46062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46062[];
extern void _ZN6dd60623fooEv();
extern void _ZN7ee460623barEv();
static  VTBL_ENTRY vtc_ee46062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46062[0]),
  (VTBL_ENTRY)&_ZN6dd60623fooEv,
  (VTBL_ENTRY)&_ZN7ee460623barEv,
};
extern VTBL_ENTRY _ZTI7ee46062[];
extern  VTBL_ENTRY _ZTV7ee46062[];
Class_Descriptor cd_ee46062 = {  "ee46062", // class name
  bases_ee46062, 4,
  &(vtc_ee46062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46062),4, //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  ee56062  : virtual dd6062 {
  int e;
  virtual void  bar(); // _ZN7ee560623barEv
  ~ee56062(); // tgen
  ee56062(); // tgen
};
//SIG(1 ee56062) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee56062 ::bar(){vfunc_called(this, "_ZN7ee560623barEv");}
ee56062 ::~ee56062(){ note_dtor("ee56062", this);} // tgen
ee56062 ::ee56062(){ note_ctor("ee56062", this);} // tgen

static void Test_ee56062()
{
  extern Class_Descriptor cd_ee56062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56062, buf);
    ee56062 *dp, &lv = *(dp=new (buf) ee56062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee56062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee56062");
    check_base_class_offset(lv, (cc062*)(dd6062*), ABISELECT(16,8), "ee56062");
    check_base_class_offset(lv, (dd6062*), ABISELECT(16,8), "ee56062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56062.e");
    test_class_info(&lv, &cd_ee56062);
    dp->~ee56062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56062(Test_ee56062, "ee56062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56062C1Ev();
extern void _ZN7ee56062D1Ev();
Name_Map name_map_ee56062[] = {
  NSPAIR(_ZN7ee56062C1Ev),
  NSPAIR(_ZN7ee56062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee56062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56062[];
extern void _ZN7ee560623barEv();
extern void _ZN6dd60623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee560623barEv,_ZTv0_n16_N7ee560623barEv)();
extern void ABISELECT(_ZThn16_N7ee560623barEv,_ZThn8_N7ee560623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56062[0]),
  (VTBL_ENTRY)&_ZN7ee560623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56062[0]),
  (VTBL_ENTRY)&_ZN6dd60623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee560623barEv,_ZTv0_n16_N7ee560623barEv),
};
extern VTBL_ENTRY _ZTV7ee56062[];
static  VTT_ENTRY vtt_ee56062[] = {
  {&(_ZTV7ee56062[3]),  3,10},
  {&(_ZTV7ee56062[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56062[];
extern  VTBL_ENTRY _ZTV7ee56062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56062[];
static VTBL_ENTRY alt_thunk_names965[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee560623barEv,_ZTv0_n16_N7ee560623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee560623barEv,_ZThn8_N7ee560623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56062 = {  "ee56062", // class name
  bases_ee56062, 4,
  &(vtc_ee56062[0]), // expected_vtbl_contents
  &(vtt_ee56062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56062),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names965,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66062  : dd6062 {
  int e;
  virtual void  foo(); // _ZN7ee660623fooEv
  virtual void  bar(); // _ZN7ee660623barEv
  ~ee66062(); // tgen
  ee66062(); // tgen
};
//SIG(1 ee66062) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66062 ::foo(){vfunc_called(this, "_ZN7ee660623fooEv");}
void  ee66062 ::bar(){vfunc_called(this, "_ZN7ee660623barEv");}
ee66062 ::~ee66062(){ note_dtor("ee66062", this);} // tgen
ee66062 ::ee66062(){ note_ctor("ee66062", this);} // tgen

static void Test_ee66062()
{
  extern Class_Descriptor cd_ee66062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66062, buf);
    ee66062 *dp, &lv = *(dp=new (buf) ee66062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), 0, "ee66062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), 0, "ee66062");
    check_base_class_offset(lv, (cc062*)(dd6062*), 0, "ee66062");
    check_base_class_offset(lv, (dd6062*), 0, "ee66062");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66062.e");
    test_class_info(&lv, &cd_ee66062);
    dp->~ee66062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66062(Test_ee66062, "ee66062", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66062C1Ev();
extern void _ZN7ee66062D1Ev();
Name_Map name_map_ee66062[] = {
  NSPAIR(_ZN7ee66062C1Ev),
  NSPAIR(_ZN7ee66062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee66062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66062[];
extern void _ZN7ee660623fooEv();
extern void _ZN7ee660623barEv();
static  VTBL_ENTRY vtc_ee66062[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66062[0]),
  (VTBL_ENTRY)&_ZN7ee660623fooEv,
  (VTBL_ENTRY)&_ZN7ee660623barEv,
};
extern VTBL_ENTRY _ZTI7ee66062[];
extern  VTBL_ENTRY _ZTV7ee66062[];
Class_Descriptor cd_ee66062 = {  "ee66062", // class name
  bases_ee66062, 4,
  &(vtc_ee66062[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66062),4, //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  ee76062  : virtual dd6062 {
  int e;
  virtual void  foo(); // _ZN7ee760623fooEv
  virtual void  bar(); // _ZN7ee760623barEv
  ~ee76062(); // tgen
  ee76062(); // tgen
};
//SIG(1 ee76062) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76062 ::foo(){vfunc_called(this, "_ZN7ee760623fooEv");}
void  ee76062 ::bar(){vfunc_called(this, "_ZN7ee760623barEv");}
ee76062 ::~ee76062(){ note_dtor("ee76062", this);} // tgen
ee76062 ::ee76062(){ note_ctor("ee76062", this);} // tgen

static void Test_ee76062()
{
  extern Class_Descriptor cd_ee76062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76062, buf);
    ee76062 *dp, &lv = *(dp=new (buf) ee76062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee76062");
    check_base_class_offset(lv, (bb62*)(cc062*)(dd6062*), ABISELECT(16,8), "ee76062");
    check_base_class_offset(lv, (cc062*)(dd6062*), ABISELECT(16,8), "ee76062");
    check_base_class_offset(lv, (dd6062*), ABISELECT(16,8), "ee76062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76062.e");
    test_class_info(&lv, &cd_ee76062);
    dp->~ee76062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76062(Test_ee76062, "ee76062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76062C1Ev();
extern void _ZN7ee76062D1Ev();
Name_Map name_map_ee76062[] = {
  NSPAIR(_ZN7ee76062C1Ev),
  NSPAIR(_ZN7ee76062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd6062;
extern VTBL_ENTRY _ZTI6dd6062[];
extern  VTBL_ENTRY _ZTV6dd6062[];
static Base_Class bases_ee76062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc062,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6062,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76062[];
extern void _ZN7ee760623fooEv();
extern void _ZN7ee760623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee760623fooEv,_ZTv0_n12_N7ee760623fooEv)();
extern void ABISELECT(_ZThn16_N7ee760623fooEv,_ZThn8_N7ee760623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee760623barEv,_ZTv0_n16_N7ee760623barEv)();
extern void ABISELECT(_ZThn16_N7ee760623barEv,_ZThn8_N7ee760623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76062[0]),
  (VTBL_ENTRY)&_ZN7ee760623fooEv,
  (VTBL_ENTRY)&_ZN7ee760623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee760623fooEv,_ZTv0_n12_N7ee760623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee760623barEv,_ZTv0_n16_N7ee760623barEv),
};
extern VTBL_ENTRY _ZTV7ee76062[];
static  VTT_ENTRY vtt_ee76062[] = {
  {&(_ZTV7ee76062[3]),  3,11},
  {&(_ZTV7ee76062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76062[];
extern  VTBL_ENTRY _ZTV7ee76062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76062[];
static VTBL_ENTRY alt_thunk_names966[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee760623barEv,_ZTv0_n16_N7ee760623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee760623barEv,_ZThn8_N7ee760623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee760623fooEv,_ZTv0_n12_N7ee760623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee760623fooEv,_ZThn8_N7ee760623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76062 = {  "ee76062", // class name
  bases_ee76062, 4,
  &(vtc_ee76062[0]), // expected_vtbl_contents
  &(vtt_ee76062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76062),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names966,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7062  : virtual cc062 {
  int d;
  virtual void  bar(); // _ZN6dd70623barEv
  virtual void  foo(); // _ZN6dd70623fooEv
  ~dd7062(); // tgen
  dd7062(); // tgen
};
//SIG(-1 dd7062) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd7062 ::bar(){vfunc_called(this, "_ZN6dd70623barEv");}
void  dd7062 ::foo(){vfunc_called(this, "_ZN6dd70623fooEv");}
dd7062 ::~dd7062(){ note_dtor("dd7062", this);} // tgen
dd7062 ::dd7062(){ note_ctor("dd7062", this);} // tgen

static void Test_dd7062()
{
  extern Class_Descriptor cd_dd7062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7062, buf);
    dd7062 *dp, &lv = *(dp=new (buf) dd7062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,8), "dd7062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,8), "dd7062");
    check_base_class_offset(lv, (cc062*), ABISELECT(16,8), "dd7062");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7062.d");
    test_class_info(&lv, &cd_dd7062);
    dp->~dd7062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7062(Test_dd7062, "dd7062", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7062C1Ev();
extern void _ZN6dd7062D1Ev();
Name_Map name_map_dd7062[] = {
  NSPAIR(_ZN6dd7062C1Ev),
  NSPAIR(_ZN6dd7062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
static Base_Class bases_dd7062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
extern VTBL_ENTRY _ZTV6dd7062[];
static  VTT_ENTRY vtt_dd7062[] = {
  {&(_ZTV6dd7062[3]),  3,11},
  {&(_ZTV6dd7062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static VTBL_ENTRY alt_thunk_names967[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7062 = {  "dd7062", // class name
  bases_dd7062, 3,
  &(vtc_dd7062[0]), // expected_vtbl_contents
  &(vtt_dd7062[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7062),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names967,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07062  : dd7062 {
  int e;
  ~ee07062(); // tgen
  ee07062(); // tgen
};
//SIG(1 ee07062) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee07062 ::~ee07062(){ note_dtor("ee07062", this);} // tgen
ee07062 ::ee07062(){ note_ctor("ee07062", this);} // tgen

static void Test_ee07062()
{
  extern Class_Descriptor cd_ee07062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07062, buf);
    ee07062 *dp, &lv = *(dp=new (buf) ee07062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee07062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee07062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(16,12), "ee07062");
    check_base_class_offset(lv, (dd7062*), 0, "ee07062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07062.e");
    test_class_info(&lv, &cd_ee07062);
    dp->~ee07062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07062(Test_ee07062, "ee07062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07062C1Ev();
extern void _ZN7ee07062D1Ev();
Name_Map name_map_ee07062[] = {
  NSPAIR(_ZN7ee07062C1Ev),
  NSPAIR(_ZN7ee07062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee07062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
extern VTBL_ENTRY _ZTV7ee07062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee07062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee07062[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee07062[] = {
  {&(_ZTV7ee07062[3]),  3,11},
  {&(_tg__ZTV6dd7062__7ee07062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee07062[4]),  4,6},
  {&(_ZTV7ee07062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07062[];
extern  VTBL_ENTRY _ZTV7ee07062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07062[];
static VTBL_ENTRY alt_thunk_names968[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07062 = {  "ee07062", // class name
  bases_ee07062, 4,
  &(vtc_ee07062[0]), // expected_vtbl_contents
  &(vtt_ee07062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names968,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17062  : virtual dd7062 {
  int e;
  ~ee17062(); // tgen
  ee17062(); // tgen
};
//SIG(1 ee17062) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee17062 ::~ee17062(){ note_dtor("ee17062", this);} // tgen
ee17062 ::ee17062(){ note_ctor("ee17062", this);} // tgen

static void Test_ee17062()
{
  extern Class_Descriptor cd_ee17062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17062, buf);
    ee17062 *dp, &lv = *(dp=new (buf) ee17062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee17062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee17062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(32,16), "ee17062");
    check_base_class_offset(lv, (dd7062*), ABISELECT(16,8), "ee17062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17062.e");
    test_class_info(&lv, &cd_ee17062);
    dp->~ee17062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17062(Test_ee17062, "ee17062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17062C1Ev();
extern void _ZN7ee17062D1Ev();
Name_Map name_map_ee17062[] = {
  NSPAIR(_ZN7ee17062C1Ev),
  NSPAIR(_ZN7ee17062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee17062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17062[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
extern VTBL_ENTRY _ZTV7ee17062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee17062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee17062[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee17062[] = {
  {&(_ZTV7ee17062[4]),  4,17},
  {&(_ZTV7ee17062[9]),  9,17},
  {&(_ZTV7ee17062[15]),  15,17},
  {&(_tg__ZTV6dd7062__7ee17062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee17062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17062[];
extern  VTBL_ENTRY _ZTV7ee17062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17062[];
static VTBL_ENTRY alt_thunk_names969[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17062 = {  "ee17062", // class name
  bases_ee17062, 4,
  &(vtc_ee17062[0]), // expected_vtbl_contents
  &(vtt_ee17062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17062),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names969,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27062  : dd7062 {
  int e;
  virtual void  foo(); // _ZN7ee270623fooEv
  ~ee27062(); // tgen
  ee27062(); // tgen
};
//SIG(1 ee27062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee27062 ::foo(){vfunc_called(this, "_ZN7ee270623fooEv");}
ee27062 ::~ee27062(){ note_dtor("ee27062", this);} // tgen
ee27062 ::ee27062(){ note_ctor("ee27062", this);} // tgen

static void Test_ee27062()
{
  extern Class_Descriptor cd_ee27062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27062, buf);
    ee27062 *dp, &lv = *(dp=new (buf) ee27062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee27062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee27062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(16,12), "ee27062");
    check_base_class_offset(lv, (dd7062*), 0, "ee27062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27062.e");
    test_class_info(&lv, &cd_ee27062);
    dp->~ee27062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27062(Test_ee27062, "ee27062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27062C1Ev();
extern void _ZN7ee27062D1Ev();
Name_Map name_map_ee27062[] = {
  NSPAIR(_ZN7ee27062C1Ev),
  NSPAIR(_ZN7ee27062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee27062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27062[];
extern void _ZN6dd70623barEv();
extern void _ZN7ee270623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee270623fooEv,_ZTv0_n12_N7ee270623fooEv)();
extern void ABISELECT(_ZThn16_N7ee270623fooEv,_ZThn12_N7ee270623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN7ee270623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee270623fooEv,_ZTv0_n12_N7ee270623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
extern VTBL_ENTRY _ZTV7ee27062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee27062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee27062[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee27062[] = {
  {&(_ZTV7ee27062[3]),  3,11},
  {&(_tg__ZTV6dd7062__7ee27062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee27062[4]),  4,6},
  {&(_ZTV7ee27062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27062[];
extern  VTBL_ENTRY _ZTV7ee27062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27062[];
static VTBL_ENTRY alt_thunk_names970[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee270623fooEv,_ZTv0_n12_N7ee270623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee270623fooEv,_ZThn12_N7ee270623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27062 = {  "ee27062", // class name
  bases_ee27062, 4,
  &(vtc_ee27062[0]), // expected_vtbl_contents
  &(vtt_ee27062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names970,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37062  : virtual dd7062 {
  int e;
  virtual void  foo(); // _ZN7ee370623fooEv
  ~ee37062(); // tgen
  ee37062(); // tgen
};
//SIG(1 ee37062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee37062 ::foo(){vfunc_called(this, "_ZN7ee370623fooEv");}
ee37062 ::~ee37062(){ note_dtor("ee37062", this);} // tgen
ee37062 ::ee37062(){ note_ctor("ee37062", this);} // tgen

static void Test_ee37062()
{
  extern Class_Descriptor cd_ee37062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37062, buf);
    ee37062 *dp, &lv = *(dp=new (buf) ee37062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee37062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee37062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(32,16), "ee37062");
    check_base_class_offset(lv, (dd7062*), ABISELECT(16,8), "ee37062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37062.e");
    test_class_info(&lv, &cd_ee37062);
    dp->~ee37062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37062(Test_ee37062, "ee37062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37062C1Ev();
extern void _ZN7ee37062D1Ev();
Name_Map name_map_ee37062[] = {
  NSPAIR(_ZN7ee37062C1Ev),
  NSPAIR(_ZN7ee37062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee37062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37062[];
extern void _ZN7ee370623fooEv();
extern void _ZN6dd70623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee370623fooEv,_ZTv0_n20_N7ee370623fooEv)();
extern void ABISELECT(_ZThn16_N7ee370623fooEv,_ZThn8_N7ee370623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee370623fooEv,_ZTv0_n12_N7ee370623fooEv)();
extern void ABISELECT(_ZThn32_N7ee370623fooEv,_ZThn16_N7ee370623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37062[0]),
  (VTBL_ENTRY)&_ZN7ee370623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee370623fooEv,_ZTv0_n20_N7ee370623fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee370623fooEv,_ZTv0_n12_N7ee370623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
extern VTBL_ENTRY _ZTV7ee37062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee37062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee37062[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee37062[] = {
  {&(_ZTV7ee37062[4]),  4,18},
  {&(_ZTV7ee37062[10]),  10,18},
  {&(_ZTV7ee37062[16]),  16,18},
  {&(_tg__ZTV6dd7062__7ee37062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee37062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37062[];
extern  VTBL_ENTRY _ZTV7ee37062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37062[];
static VTBL_ENTRY alt_thunk_names971[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee370623fooEv,_ZTv0_n12_N7ee370623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee370623fooEv,_ZThn16_N7ee370623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee370623fooEv,_ZTv0_n20_N7ee370623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee370623fooEv,_ZThn8_N7ee370623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37062 = {  "ee37062", // class name
  bases_ee37062, 4,
  &(vtc_ee37062[0]), // expected_vtbl_contents
  &(vtt_ee37062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37062),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names971,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47062  : dd7062 {
  int e;
  virtual void  bar(); // _ZN7ee470623barEv
  ~ee47062(); // tgen
  ee47062(); // tgen
};
//SIG(1 ee47062) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee47062 ::bar(){vfunc_called(this, "_ZN7ee470623barEv");}
ee47062 ::~ee47062(){ note_dtor("ee47062", this);} // tgen
ee47062 ::ee47062(){ note_ctor("ee47062", this);} // tgen

static void Test_ee47062()
{
  extern Class_Descriptor cd_ee47062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47062, buf);
    ee47062 *dp, &lv = *(dp=new (buf) ee47062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee47062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee47062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(16,12), "ee47062");
    check_base_class_offset(lv, (dd7062*), 0, "ee47062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47062.e");
    test_class_info(&lv, &cd_ee47062);
    dp->~ee47062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47062(Test_ee47062, "ee47062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47062C1Ev();
extern void _ZN7ee47062D1Ev();
Name_Map name_map_ee47062[] = {
  NSPAIR(_ZN7ee47062C1Ev),
  NSPAIR(_ZN7ee47062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee47062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47062[];
extern void _ZN7ee470623barEv();
extern void _ZN6dd70623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee470623barEv,_ZTv0_n16_N7ee470623barEv)();
extern void ABISELECT(_ZThn16_N7ee470623barEv,_ZThn12_N7ee470623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47062[0]),
  (VTBL_ENTRY)&_ZN7ee470623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee470623barEv,_ZTv0_n16_N7ee470623barEv),
};
extern VTBL_ENTRY _ZTV7ee47062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee47062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee47062[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee47062[] = {
  {&(_ZTV7ee47062[3]),  3,11},
  {&(_tg__ZTV6dd7062__7ee47062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee47062[4]),  4,6},
  {&(_ZTV7ee47062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47062[];
extern  VTBL_ENTRY _ZTV7ee47062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47062[];
static VTBL_ENTRY alt_thunk_names972[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee470623barEv,_ZTv0_n16_N7ee470623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee470623barEv,_ZThn12_N7ee470623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47062 = {  "ee47062", // class name
  bases_ee47062, 4,
  &(vtc_ee47062[0]), // expected_vtbl_contents
  &(vtt_ee47062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names972,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57062  : virtual dd7062 {
  int e;
  virtual void  bar(); // _ZN7ee570623barEv
  ~ee57062(); // tgen
  ee57062(); // tgen
};
//SIG(1 ee57062) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee57062 ::bar(){vfunc_called(this, "_ZN7ee570623barEv");}
ee57062 ::~ee57062(){ note_dtor("ee57062", this);} // tgen
ee57062 ::ee57062(){ note_ctor("ee57062", this);} // tgen

static void Test_ee57062()
{
  extern Class_Descriptor cd_ee57062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57062, buf);
    ee57062 *dp, &lv = *(dp=new (buf) ee57062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee57062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee57062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(32,16), "ee57062");
    check_base_class_offset(lv, (dd7062*), ABISELECT(16,8), "ee57062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57062.e");
    test_class_info(&lv, &cd_ee57062);
    dp->~ee57062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57062(Test_ee57062, "ee57062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57062C1Ev();
extern void _ZN7ee57062D1Ev();
Name_Map name_map_ee57062[] = {
  NSPAIR(_ZN7ee57062C1Ev),
  NSPAIR(_ZN7ee57062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee57062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57062[];
extern void _ZN7ee570623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee570623barEv,_ZTv0_n16_N7ee570623barEv)();
extern void ABISELECT(_ZThn16_N7ee570623barEv,_ZThn8_N7ee570623barEv)() __attribute__((weak));
extern void _ZN6dd70623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee570623barEv,_ZTv0_n16_N7ee570623barEv)();
extern void ABISELECT(_ZThn32_N7ee570623barEv,_ZThn16_N7ee570623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57062[0]),
  (VTBL_ENTRY)&_ZN7ee570623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee570623barEv,_ZTv0_n16_N7ee570623barEv),
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee570623barEv,_ZTv0_n16_N7ee570623barEv),
};
extern VTBL_ENTRY _ZTV7ee57062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee57062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee57062[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee57062[] = {
  {&(_ZTV7ee57062[4]),  4,18},
  {&(_ZTV7ee57062[10]),  10,18},
  {&(_ZTV7ee57062[16]),  16,18},
  {&(_tg__ZTV6dd7062__7ee57062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee57062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57062[];
extern  VTBL_ENTRY _ZTV7ee57062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57062[];
static VTBL_ENTRY alt_thunk_names973[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee570623barEv,_ZTv0_n16_N7ee570623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee570623barEv,_ZThn16_N7ee570623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee570623barEv,_ZThn8_N7ee570623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57062 = {  "ee57062", // class name
  bases_ee57062, 4,
  &(vtc_ee57062[0]), // expected_vtbl_contents
  &(vtt_ee57062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57062),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names973,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67062  : dd7062 {
  int e;
  virtual void  foo(); // _ZN7ee670623fooEv
  virtual void  bar(); // _ZN7ee670623barEv
  ~ee67062(); // tgen
  ee67062(); // tgen
};
//SIG(1 ee67062) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67062 ::foo(){vfunc_called(this, "_ZN7ee670623fooEv");}
void  ee67062 ::bar(){vfunc_called(this, "_ZN7ee670623barEv");}
ee67062 ::~ee67062(){ note_dtor("ee67062", this);} // tgen
ee67062 ::ee67062(){ note_ctor("ee67062", this);} // tgen

static void Test_ee67062()
{
  extern Class_Descriptor cd_ee67062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67062, buf);
    ee67062 *dp, &lv = *(dp=new (buf) ee67062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(16,12), "ee67062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(16,12), "ee67062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(16,12), "ee67062");
    check_base_class_offset(lv, (dd7062*), 0, "ee67062");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67062.e");
    test_class_info(&lv, &cd_ee67062);
    dp->~ee67062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67062(Test_ee67062, "ee67062", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67062C1Ev();
extern void _ZN7ee67062D1Ev();
Name_Map name_map_ee67062[] = {
  NSPAIR(_ZN7ee67062C1Ev),
  NSPAIR(_ZN7ee67062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee67062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67062[];
extern void _ZN7ee670623barEv();
extern void _ZN7ee670623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee670623fooEv,_ZTv0_n12_N7ee670623fooEv)();
extern void ABISELECT(_ZThn16_N7ee670623fooEv,_ZThn12_N7ee670623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee670623barEv,_ZTv0_n16_N7ee670623barEv)();
extern void ABISELECT(_ZThn16_N7ee670623barEv,_ZThn12_N7ee670623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67062[0]),
  (VTBL_ENTRY)&_ZN7ee670623barEv,
  (VTBL_ENTRY)&_ZN7ee670623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee670623fooEv,_ZTv0_n12_N7ee670623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee670623barEv,_ZTv0_n16_N7ee670623barEv),
};
extern VTBL_ENTRY _ZTV7ee67062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee67062[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee67062[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee67062[] = {
  {&(_ZTV7ee67062[3]),  3,11},
  {&(_tg__ZTV6dd7062__7ee67062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee67062[4]),  4,6},
  {&(_ZTV7ee67062[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67062[];
extern  VTBL_ENTRY _ZTV7ee67062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67062[];
static VTBL_ENTRY alt_thunk_names974[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn12_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn12_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee670623barEv,_ZTv0_n16_N7ee670623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee670623barEv,_ZThn12_N7ee670623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee670623fooEv,_ZTv0_n12_N7ee670623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee670623fooEv,_ZThn12_N7ee670623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67062 = {  "ee67062", // class name
  bases_ee67062, 4,
  &(vtc_ee67062[0]), // expected_vtbl_contents
  &(vtt_ee67062[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67062),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67062),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67062),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names974,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77062  : virtual dd7062 {
  int e;
  virtual void  foo(); // _ZN7ee770623fooEv
  virtual void  bar(); // _ZN7ee770623barEv
  ~ee77062(); // tgen
  ee77062(); // tgen
};
//SIG(1 ee77062) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77062 ::foo(){vfunc_called(this, "_ZN7ee770623fooEv");}
void  ee77062 ::bar(){vfunc_called(this, "_ZN7ee770623barEv");}
ee77062 ::~ee77062(){ note_dtor("ee77062", this);} // tgen
ee77062 ::ee77062(){ note_ctor("ee77062", this);} // tgen

static void Test_ee77062()
{
  extern Class_Descriptor cd_ee77062;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77062, buf);
    ee77062 *dp, &lv = *(dp=new (buf) ee77062());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77062)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77062)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc062*), ABISELECT(32,16), "ee77062");
    check_base_class_offset(lv, (bb62*)(cc062*), ABISELECT(32,16), "ee77062");
    check_base_class_offset(lv, (cc062*)(dd7062*), ABISELECT(32,16), "ee77062");
    check_base_class_offset(lv, (dd7062*), ABISELECT(16,8), "ee77062");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77062.e");
    test_class_info(&lv, &cd_ee77062);
    dp->~ee77062();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77062(Test_ee77062, "ee77062", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77062C1Ev();
extern void _ZN7ee77062D1Ev();
Name_Map name_map_ee77062[] = {
  NSPAIR(_ZN7ee77062C1Ev),
  NSPAIR(_ZN7ee77062D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc062;
extern VTBL_ENTRY _ZTI5cc062[];
extern  VTBL_ENTRY _ZTV5cc062[];
extern Class_Descriptor cd_dd7062;
extern VTBL_ENTRY _ZTI6dd7062[];
extern  VTBL_ENTRY _ZTV6dd7062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7062[];
static Base_Class bases_ee77062[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc062,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7062,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77062[];
extern void _ZN7ee770623fooEv();
extern void _ZN7ee770623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee770623barEv,_ZTv0_n16_N7ee770623barEv)();
extern void ABISELECT(_ZThn16_N7ee770623barEv,_ZThn8_N7ee770623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee770623fooEv,_ZTv0_n20_N7ee770623fooEv)();
extern void ABISELECT(_ZThn16_N7ee770623fooEv,_ZThn8_N7ee770623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee770623fooEv,_ZTv0_n12_N7ee770623fooEv)();
extern void ABISELECT(_ZThn32_N7ee770623fooEv,_ZThn16_N7ee770623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee770623barEv,_ZTv0_n16_N7ee770623barEv)();
extern void ABISELECT(_ZThn32_N7ee770623barEv,_ZThn16_N7ee770623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77062[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77062[0]),
  (VTBL_ENTRY)&_ZN7ee770623fooEv,
  (VTBL_ENTRY)&_ZN7ee770623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee770623barEv,_ZTv0_n16_N7ee770623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee770623fooEv,_ZTv0_n20_N7ee770623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee770623fooEv,_ZTv0_n12_N7ee770623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee770623barEv,_ZTv0_n16_N7ee770623barEv),
};
extern VTBL_ENTRY _ZTV7ee77062[];
extern void _ZN6dd70623barEv();
extern void _ZN6dd70623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7062__7ee77062[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&_ZN6dd70623barEv,
  (VTBL_ENTRY)&_ZN6dd70623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv)();
extern void ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv)();
extern void ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb625cc062__6dd7062__7ee77062[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7062[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv),
};
static  VTT_ENTRY vtt_ee77062[] = {
  {&(_ZTV7ee77062[4]),  4,19},
  {&(_ZTV7ee77062[11]),  11,19},
  {&(_ZTV7ee77062[17]),  17,19},
  {&(_tg__ZTV6dd7062__7ee77062[3]),  3,5},
  {&(_tg__ZTV4bb625cc062__6dd7062__7ee77062[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77062[];
extern  VTBL_ENTRY _ZTV7ee77062[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77062[];
static VTBL_ENTRY alt_thunk_names975[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd70623barEv,_ZTv0_n16_N6dd70623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623barEv,_ZThn8_N6dd70623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd70623fooEv,_ZTv0_n12_N6dd70623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd70623fooEv,_ZThn8_N6dd70623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee770623fooEv,_ZTv0_n12_N7ee770623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee770623fooEv,_ZThn16_N7ee770623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee770623fooEv,_ZTv0_n20_N7ee770623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee770623fooEv,_ZThn8_N7ee770623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee770623barEv,_ZTv0_n16_N7ee770623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee770623barEv,_ZThn16_N7ee770623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee770623barEv,_ZThn8_N7ee770623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77062 = {  "ee77062", // class name
  bases_ee77062, 4,
  &(vtc_ee77062[0]), // expected_vtbl_contents
  &(vtt_ee77062[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77062),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77062),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77062),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names975,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc162  : virtual bb62 {
  int c;
  ~cc162(); // tgen
  cc162(); // tgen
};
//SIG(-1 cc162) C1{ VBC2{ BC3{ v2 v1 Fi} v1 v2 Fi} Fi}


cc162 ::~cc162(){ note_dtor("cc162", this);} // tgen
cc162 ::cc162(){ note_ctor("cc162", this);} // tgen

static void Test_cc162()
{
  extern Class_Descriptor cd_cc162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc162, buf);
    cc162 *dp, &lv = *(dp=new (buf) cc162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,8), "cc162");
    check_base_class_offset(lv, (bb62*), ABISELECT(16,8), "cc162");
    check_field_offset(lv, c, ABISELECT(8,4), "cc162.c");
    test_class_info(&lv, &cd_cc162);
    dp->~cc162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc162(Test_cc162, "cc162", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc162C1Ev();
extern void _ZN5cc162D1Ev();
Name_Map name_map_cc162[] = {
  NSPAIR(_ZN5cc162C1Ev),
  NSPAIR(_ZN5cc162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI5cc162[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_cc162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV5cc162[];
static  VTT_ENTRY vtt_cc162[] = {
  {&(_ZTV5cc162[3]),  3,9},
  {&(_ZTV5cc162[7]),  7,9},
};
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
Class_Descriptor cd_cc162 = {  "cc162", // class name
  bases_cc162, 2,
  &(vtc_cc162[0]), // expected_vtbl_contents
  &(vtt_cc162[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc162),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc162),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  dd0162  : cc162 {
  int d;
  ~dd0162(); // tgen
  dd0162(); // tgen
};
//SIG(-1 dd0162) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} Fi}


dd0162 ::~dd0162(){ note_dtor("dd0162", this);} // tgen
dd0162 ::dd0162(){ note_ctor("dd0162", this);} // tgen

static void Test_dd0162()
{
  extern Class_Descriptor cd_dd0162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0162, buf);
    dd0162 *dp, &lv = *(dp=new (buf) dd0162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd0162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(16,12), "dd0162");
    check_base_class_offset(lv, (cc162*), 0, "dd0162");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0162.d");
    test_class_info(&lv, &cd_dd0162);
    dp->~dd0162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0162(Test_dd0162, "dd0162", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0162C1Ev();
extern void _ZN6dd0162D1Ev();
Name_Map name_map_dd0162[] = {
  NSPAIR(_ZN6dd0162C1Ev),
  NSPAIR(_ZN6dd0162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd0162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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_cc162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0162[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd0162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd0162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd0162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd0162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd0162[] = {
  {&(_ZTV6dd0162[3]),  3,9},
  {&(_tg__ZTV5cc162__6dd0162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd0162[4]),  4,6},
  {&(_ZTV6dd0162[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
Class_Descriptor cd_dd0162 = {  "dd0162", // class name
  bases_dd0162, 3,
  &(vtc_dd0162[0]), // expected_vtbl_contents
  &(vtt_dd0162[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0162),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0162),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  ee00162  : dd0162 {
  int e;
  ~ee00162(); // tgen
  ee00162(); // tgen
};
//SIG(1 ee00162) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee00162 ::~ee00162(){ note_dtor("ee00162", this);} // tgen
ee00162 ::ee00162(){ note_ctor("ee00162", this);} // tgen

static void Test_ee00162()
{
  extern Class_Descriptor cd_ee00162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00162, buf);
    ee00162 *dp, &lv = *(dp=new (buf) ee00162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee00162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(24,16), "ee00162");
    check_base_class_offset(lv, (cc162*)(dd0162*), 0, "ee00162");
    check_base_class_offset(lv, (dd0162*), 0, "ee00162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00162.e");
    test_class_info(&lv, &cd_ee00162);
    dp->~ee00162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00162(Test_ee00162, "ee00162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00162C1Ev();
extern void _ZN7ee00162D1Ev();
Name_Map name_map_ee00162[] = {
  NSPAIR(_ZN7ee00162C1Ev),
  NSPAIR(_ZN7ee00162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee00162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00162[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee00162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00162[0]),
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee00162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee00162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee00162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee00162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee00162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee00162[] = {
  {&(_ZTV7ee00162[3]),  3,9},
  {&(_tg__ZTV6dd0162__7ee00162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee00162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee00162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee00162[4]),  4,6},
  {&(_ZTV7ee00162[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee00162[];
extern  VTBL_ENTRY _ZTV7ee00162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00162[];
Class_Descriptor cd_ee00162 = {  "ee00162", // class name
  bases_ee00162, 4,
  &(vtc_ee00162[0]), // expected_vtbl_contents
  &(vtt_ee00162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00162),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10162  : virtual dd0162 {
  int e;
  ~ee10162(); // tgen
  ee10162(); // tgen
};
//SIG(1 ee10162) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee10162 ::~ee10162(){ note_dtor("ee10162", this);} // tgen
ee10162 ::ee10162(){ note_ctor("ee10162", this);} // tgen

static void Test_ee10162()
{
  extern Class_Descriptor cd_ee10162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10162, buf);
    ee10162 *dp, &lv = *(dp=new (buf) ee10162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee10162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(32,20), "ee10162");
    check_base_class_offset(lv, (cc162*)(dd0162*), ABISELECT(16,8), "ee10162");
    check_base_class_offset(lv, (dd0162*), ABISELECT(16,8), "ee10162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10162.e");
    test_class_info(&lv, &cd_ee10162);
    dp->~ee10162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10162(Test_ee10162, "ee10162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10162C1Ev();
extern void _ZN7ee10162D1Ev();
Name_Map name_map_ee10162[] = {
  NSPAIR(_ZN7ee10162C1Ev),
  NSPAIR(_ZN7ee10162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee10162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee10162[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee10162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10162[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10162[0]),
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee10162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee10162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee10162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee10162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee10162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee10162[] = {
  {&(_ZTV7ee10162[4]),  4,13},
  {&(_ZTV7ee10162[7]),  7,13},
  {&(_ZTV7ee10162[11]),  11,13},
  {&(_tg__ZTV6dd0162__7ee10162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee10162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee10162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee10162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10162[];
extern  VTBL_ENTRY _ZTV7ee10162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10162[];
Class_Descriptor cd_ee10162 = {  "ee10162", // class name
  bases_ee10162, 4,
  &(vtc_ee10162[0]), // expected_vtbl_contents
  &(vtt_ee10162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10162),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20162  : dd0162 {
  int e;
  virtual void  foo(); // _ZN7ee201623fooEv
  ~ee20162(); // tgen
  ee20162(); // tgen
};
//SIG(1 ee20162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee20162 ::foo(){vfunc_called(this, "_ZN7ee201623fooEv");}
ee20162 ::~ee20162(){ note_dtor("ee20162", this);} // tgen
ee20162 ::ee20162(){ note_ctor("ee20162", this);} // tgen

static void Test_ee20162()
{
  extern Class_Descriptor cd_ee20162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20162, buf);
    ee20162 *dp, &lv = *(dp=new (buf) ee20162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee20162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(24,16), "ee20162");
    check_base_class_offset(lv, (cc162*)(dd0162*), 0, "ee20162");
    check_base_class_offset(lv, (dd0162*), 0, "ee20162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20162.e");
    test_class_info(&lv, &cd_ee20162);
    dp->~ee20162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20162(Test_ee20162, "ee20162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20162C1Ev();
extern void _ZN7ee20162D1Ev();
Name_Map name_map_ee20162[] = {
  NSPAIR(_ZN7ee20162C1Ev),
  NSPAIR(_ZN7ee20162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee20162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20162[];
extern void _ZN7ee201623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee201623fooEv,_ZTv0_n12_N7ee201623fooEv)();
extern void ABISELECT(_ZThn24_N7ee201623fooEv,_ZThn16_N7ee201623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee20162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20162[0]),
  (VTBL_ENTRY)&_ZN7ee201623fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee201623fooEv,_ZTv0_n12_N7ee201623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee20162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee20162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee20162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee20162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee20162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee20162[] = {
  {&(_ZTV7ee20162[3]),  3,10},
  {&(_tg__ZTV6dd0162__7ee20162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee20162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee20162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee20162[4]),  4,6},
  {&(_ZTV7ee20162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee20162[];
extern  VTBL_ENTRY _ZTV7ee20162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20162[];
static VTBL_ENTRY alt_thunk_names976[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee201623fooEv,_ZTv0_n12_N7ee201623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee201623fooEv,_ZThn16_N7ee201623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20162 = {  "ee20162", // class name
  bases_ee20162, 4,
  &(vtc_ee20162[0]), // expected_vtbl_contents
  &(vtt_ee20162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names976,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30162  : virtual dd0162 {
  int e;
  virtual void  foo(); // _ZN7ee301623fooEv
  ~ee30162(); // tgen
  ee30162(); // tgen
};
//SIG(1 ee30162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee30162 ::foo(){vfunc_called(this, "_ZN7ee301623fooEv");}
ee30162 ::~ee30162(){ note_dtor("ee30162", this);} // tgen
ee30162 ::ee30162(){ note_ctor("ee30162", this);} // tgen

static void Test_ee30162()
{
  extern Class_Descriptor cd_ee30162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30162, buf);
    ee30162 *dp, &lv = *(dp=new (buf) ee30162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee30162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(32,20), "ee30162");
    check_base_class_offset(lv, (cc162*)(dd0162*), ABISELECT(16,8), "ee30162");
    check_base_class_offset(lv, (dd0162*), ABISELECT(16,8), "ee30162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30162.e");
    test_class_info(&lv, &cd_ee30162);
    dp->~ee30162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30162(Test_ee30162, "ee30162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30162C1Ev();
extern void _ZN7ee30162D1Ev();
Name_Map name_map_ee30162[] = {
  NSPAIR(_ZN7ee30162C1Ev),
  NSPAIR(_ZN7ee30162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee30162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee30162[];
extern void _ZN7ee301623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee301623fooEv,_ZTv0_n12_N7ee301623fooEv)();
extern void ABISELECT(_ZThn32_N7ee301623fooEv,_ZThn20_N7ee301623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee30162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30162[0]),
  (VTBL_ENTRY)&_ZN7ee301623fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30162[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee301623fooEv,_ZTv0_n12_N7ee301623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee30162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee30162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee30162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee30162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee30162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee30162[] = {
  {&(_ZTV7ee30162[4]),  4,14},
  {&(_ZTV7ee30162[8]),  8,14},
  {&(_ZTV7ee30162[12]),  12,14},
  {&(_tg__ZTV6dd0162__7ee30162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee30162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee30162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee30162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30162[];
extern  VTBL_ENTRY _ZTV7ee30162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30162[];
static VTBL_ENTRY alt_thunk_names977[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee301623fooEv,_ZTv0_n12_N7ee301623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee301623fooEv,_ZThn20_N7ee301623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30162 = {  "ee30162", // class name
  bases_ee30162, 4,
  &(vtc_ee30162[0]), // expected_vtbl_contents
  &(vtt_ee30162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names977,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40162  : dd0162 {
  int e;
  virtual void  bar(); // _ZN7ee401623barEv
  ~ee40162(); // tgen
  ee40162(); // tgen
};
//SIG(1 ee40162) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee40162 ::bar(){vfunc_called(this, "_ZN7ee401623barEv");}
ee40162 ::~ee40162(){ note_dtor("ee40162", this);} // tgen
ee40162 ::ee40162(){ note_ctor("ee40162", this);} // tgen

static void Test_ee40162()
{
  extern Class_Descriptor cd_ee40162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40162, buf);
    ee40162 *dp, &lv = *(dp=new (buf) ee40162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee40162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(24,16), "ee40162");
    check_base_class_offset(lv, (cc162*)(dd0162*), 0, "ee40162");
    check_base_class_offset(lv, (dd0162*), 0, "ee40162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40162.e");
    test_class_info(&lv, &cd_ee40162);
    dp->~ee40162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40162(Test_ee40162, "ee40162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40162C1Ev();
extern void _ZN7ee40162D1Ev();
Name_Map name_map_ee40162[] = {
  NSPAIR(_ZN7ee40162C1Ev),
  NSPAIR(_ZN7ee40162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee40162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40162[];
extern void _ZN7ee401623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee401623barEv,_ZTv0_n16_N7ee401623barEv)();
extern void ABISELECT(_ZThn24_N7ee401623barEv,_ZThn16_N7ee401623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40162[0]),
  (VTBL_ENTRY)&_ZN7ee401623barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee401623barEv,_ZTv0_n16_N7ee401623barEv),
};
extern VTBL_ENTRY _ZTV7ee40162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee40162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee40162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee40162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee40162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee40162[] = {
  {&(_ZTV7ee40162[3]),  3,10},
  {&(_tg__ZTV6dd0162__7ee40162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee40162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee40162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee40162[4]),  4,6},
  {&(_ZTV7ee40162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee40162[];
extern  VTBL_ENTRY _ZTV7ee40162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40162[];
static VTBL_ENTRY alt_thunk_names978[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee401623barEv,_ZTv0_n16_N7ee401623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee401623barEv,_ZThn16_N7ee401623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40162 = {  "ee40162", // class name
  bases_ee40162, 4,
  &(vtc_ee40162[0]), // expected_vtbl_contents
  &(vtt_ee40162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names978,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50162  : virtual dd0162 {
  int e;
  virtual void  bar(); // _ZN7ee501623barEv
  ~ee50162(); // tgen
  ee50162(); // tgen
};
//SIG(1 ee50162) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee50162 ::bar(){vfunc_called(this, "_ZN7ee501623barEv");}
ee50162 ::~ee50162(){ note_dtor("ee50162", this);} // tgen
ee50162 ::ee50162(){ note_ctor("ee50162", this);} // tgen

static void Test_ee50162()
{
  extern Class_Descriptor cd_ee50162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50162, buf);
    ee50162 *dp, &lv = *(dp=new (buf) ee50162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee50162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(32,20), "ee50162");
    check_base_class_offset(lv, (cc162*)(dd0162*), ABISELECT(16,8), "ee50162");
    check_base_class_offset(lv, (dd0162*), ABISELECT(16,8), "ee50162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50162.e");
    test_class_info(&lv, &cd_ee50162);
    dp->~ee50162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50162(Test_ee50162, "ee50162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50162C1Ev();
extern void _ZN7ee50162D1Ev();
Name_Map name_map_ee50162[] = {
  NSPAIR(_ZN7ee50162C1Ev),
  NSPAIR(_ZN7ee50162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee50162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee50162[];
extern void _ZN7ee501623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee501623barEv,_ZTv0_n16_N7ee501623barEv)();
extern void ABISELECT(_ZThn32_N7ee501623barEv,_ZThn20_N7ee501623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50162[0]),
  (VTBL_ENTRY)&_ZN7ee501623barEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50162[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee501623barEv,_ZTv0_n16_N7ee501623barEv),
};
extern VTBL_ENTRY _ZTV7ee50162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee50162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee50162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee50162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee50162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee50162[] = {
  {&(_ZTV7ee50162[4]),  4,14},
  {&(_ZTV7ee50162[8]),  8,14},
  {&(_ZTV7ee50162[12]),  12,14},
  {&(_tg__ZTV6dd0162__7ee50162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee50162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee50162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee50162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50162[];
extern  VTBL_ENTRY _ZTV7ee50162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50162[];
static VTBL_ENTRY alt_thunk_names979[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee501623barEv,_ZTv0_n16_N7ee501623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee501623barEv,_ZThn20_N7ee501623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50162 = {  "ee50162", // class name
  bases_ee50162, 4,
  &(vtc_ee50162[0]), // expected_vtbl_contents
  &(vtt_ee50162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names979,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60162  : dd0162 {
  int e;
  virtual void  foo(); // _ZN7ee601623fooEv
  virtual void  bar(); // _ZN7ee601623barEv
  ~ee60162(); // tgen
  ee60162(); // tgen
};
//SIG(1 ee60162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee60162 ::foo(){vfunc_called(this, "_ZN7ee601623fooEv");}
void  ee60162 ::bar(){vfunc_called(this, "_ZN7ee601623barEv");}
ee60162 ::~ee60162(){ note_dtor("ee60162", this);} // tgen
ee60162 ::ee60162(){ note_ctor("ee60162", this);} // tgen

static void Test_ee60162()
{
  extern Class_Descriptor cd_ee60162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60162, buf);
    ee60162 *dp, &lv = *(dp=new (buf) ee60162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee60162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(24,16), "ee60162");
    check_base_class_offset(lv, (cc162*)(dd0162*), 0, "ee60162");
    check_base_class_offset(lv, (dd0162*), 0, "ee60162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60162.e");
    test_class_info(&lv, &cd_ee60162);
    dp->~ee60162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60162(Test_ee60162, "ee60162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60162C1Ev();
extern void _ZN7ee60162D1Ev();
Name_Map name_map_ee60162[] = {
  NSPAIR(_ZN7ee60162C1Ev),
  NSPAIR(_ZN7ee60162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee60162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60162[];
extern void _ZN7ee601623fooEv();
extern void _ZN7ee601623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee601623fooEv,_ZTv0_n12_N7ee601623fooEv)();
extern void ABISELECT(_ZThn24_N7ee601623fooEv,_ZThn16_N7ee601623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee601623barEv,_ZTv0_n16_N7ee601623barEv)();
extern void ABISELECT(_ZThn24_N7ee601623barEv,_ZThn16_N7ee601623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60162[0]),
  (VTBL_ENTRY)&_ZN7ee601623fooEv,
  (VTBL_ENTRY)&_ZN7ee601623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee601623fooEv,_ZTv0_n12_N7ee601623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee601623barEv,_ZTv0_n16_N7ee601623barEv),
};
extern VTBL_ENTRY _ZTV7ee60162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee60162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee60162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee60162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee60162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee60162[] = {
  {&(_ZTV7ee60162[3]),  3,11},
  {&(_tg__ZTV6dd0162__7ee60162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee60162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee60162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee60162[4]),  4,6},
  {&(_ZTV7ee60162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60162[];
extern  VTBL_ENTRY _ZTV7ee60162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60162[];
static VTBL_ENTRY alt_thunk_names980[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee601623barEv,_ZTv0_n16_N7ee601623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee601623barEv,_ZThn16_N7ee601623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee601623fooEv,_ZTv0_n12_N7ee601623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee601623fooEv,_ZThn16_N7ee601623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60162 = {  "ee60162", // class name
  bases_ee60162, 4,
  &(vtc_ee60162[0]), // expected_vtbl_contents
  &(vtt_ee60162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names980,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70162  : virtual dd0162 {
  int e;
  virtual void  foo(); // _ZN7ee701623fooEv
  virtual void  bar(); // _ZN7ee701623barEv
  ~ee70162(); // tgen
  ee70162(); // tgen
};
//SIG(1 ee70162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee70162 ::foo(){vfunc_called(this, "_ZN7ee701623fooEv");}
void  ee70162 ::bar(){vfunc_called(this, "_ZN7ee701623barEv");}
ee70162 ::~ee70162(){ note_dtor("ee70162", this);} // tgen
ee70162 ::ee70162(){ note_ctor("ee70162", this);} // tgen

static void Test_ee70162()
{
  extern Class_Descriptor cd_ee70162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70162, buf);
    ee70162 *dp, &lv = *(dp=new (buf) ee70162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee70162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd0162*), ABISELECT(32,20), "ee70162");
    check_base_class_offset(lv, (cc162*)(dd0162*), ABISELECT(16,8), "ee70162");
    check_base_class_offset(lv, (dd0162*), ABISELECT(16,8), "ee70162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70162.e");
    test_class_info(&lv, &cd_ee70162);
    dp->~ee70162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70162(Test_ee70162, "ee70162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70162C1Ev();
extern void _ZN7ee70162D1Ev();
Name_Map name_map_ee70162[] = {
  NSPAIR(_ZN7ee70162C1Ev),
  NSPAIR(_ZN7ee70162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd0162;
extern VTBL_ENTRY _ZTI6dd0162[];
extern  VTBL_ENTRY _ZTV6dd0162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0162[];
static Base_Class bases_ee70162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0162,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee70162[];
extern void _ZN7ee701623fooEv();
extern void _ZN7ee701623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee701623fooEv,_ZTv0_n12_N7ee701623fooEv)();
extern void ABISELECT(_ZThn32_N7ee701623fooEv,_ZThn20_N7ee701623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee701623barEv,_ZTv0_n16_N7ee701623barEv)();
extern void ABISELECT(_ZThn32_N7ee701623barEv,_ZThn20_N7ee701623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70162[0]),
  (VTBL_ENTRY)&_ZN7ee701623fooEv,
  (VTBL_ENTRY)&_ZN7ee701623barEv,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee701623fooEv,_ZTv0_n12_N7ee701623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee701623barEv,_ZTv0_n16_N7ee701623barEv),
};
extern VTBL_ENTRY _ZTV7ee70162[];
static  VTBL_ENTRY _tg__ZTV6dd0162__7ee70162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd0162__7ee70162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd0162__7ee70162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0162__7ee70162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee70162[] = {
  {&(_ZTV7ee70162[4]),  4,15},
  {&(_ZTV7ee70162[9]),  9,15},
  {&(_ZTV7ee70162[13]),  13,15},
  {&(_tg__ZTV6dd0162__7ee70162[3]),  3,3},
  {&(_tg__ZTV5cc1626dd0162__7ee70162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd0162__7ee70162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0162__7ee70162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70162[];
extern  VTBL_ENTRY _ZTV7ee70162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70162[];
static VTBL_ENTRY alt_thunk_names981[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee701623barEv,_ZTv0_n16_N7ee701623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee701623barEv,_ZThn20_N7ee701623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee701623fooEv,_ZTv0_n12_N7ee701623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee701623fooEv,_ZThn20_N7ee701623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70162 = {  "ee70162", // class name
  bases_ee70162, 4,
  &(vtc_ee70162[0]), // expected_vtbl_contents
  &(vtt_ee70162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names981,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1162  : virtual cc162 {
  int d;
  ~dd1162(); // tgen
  dd1162(); // tgen
};
//SIG(-1 dd1162) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} Fi}


dd1162 ::~dd1162(){ note_dtor("dd1162", this);} // tgen
dd1162 ::dd1162(){ note_ctor("dd1162", this);} // tgen

static void Test_dd1162()
{
  extern Class_Descriptor cd_dd1162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1162, buf);
    dd1162 *dp, &lv = *(dp=new (buf) dd1162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd1162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,16), "dd1162");
    check_base_class_offset(lv, (cc162*), ABISELECT(16,8), "dd1162");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1162.d");
    test_class_info(&lv, &cd_dd1162);
    dp->~dd1162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1162(Test_dd1162, "dd1162", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1162C1Ev();
extern void _ZN6dd1162D1Ev();
Name_Map name_map_dd1162[] = {
  NSPAIR(_ZN6dd1162C1Ev),
  NSPAIR(_ZN6dd1162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd1162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd1162[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd1162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd1162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd1162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd1162[] = {
  {&(_ZTV6dd1162[4]),  4,13},
  {&(_ZTV6dd1162[7]),  7,13},
  {&(_ZTV6dd1162[11]),  11,13},
  {&(_tg__ZTV5cc162__6dd1162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd1162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
Class_Descriptor cd_dd1162 = {  "dd1162", // class name
  bases_dd1162, 3,
  &(vtc_dd1162[0]), // expected_vtbl_contents
  &(vtt_dd1162[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1162),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1162),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  ee01162  : dd1162 {
  int e;
  ~ee01162(); // tgen
  ee01162(); // tgen
};
//SIG(1 ee01162) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee01162 ::~ee01162(){ note_dtor("ee01162", this);} // tgen
ee01162 ::ee01162(){ note_ctor("ee01162", this);} // tgen

static void Test_ee01162()
{
  extern Class_Descriptor cd_ee01162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01162, buf);
    ee01162 *dp, &lv = *(dp=new (buf) ee01162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee01162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee01162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(16,12), "ee01162");
    check_base_class_offset(lv, (dd1162*), 0, "ee01162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01162.e");
    test_class_info(&lv, &cd_ee01162);
    dp->~ee01162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01162(Test_ee01162, "ee01162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01162C1Ev();
extern void _ZN7ee01162D1Ev();
Name_Map name_map_ee01162[] = {
  NSPAIR(_ZN7ee01162C1Ev),
  NSPAIR(_ZN7ee01162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee01162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01162[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee01162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01162[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01162[0]),
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee01162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee01162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee01162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee01162[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee01162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee01162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee01162[] = {
  {&(_ZTV7ee01162[4]),  4,13},
  {&(_tg__ZTV6dd1162__7ee01162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee01162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee01162[4]),  4,6},
  {&(_ZTV7ee01162[7]),  7,13},
  {&(_ZTV7ee01162[11]),  11,13},
  {&(_tg__ZTV5cc162__7ee01162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee01162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01162[];
extern  VTBL_ENTRY _ZTV7ee01162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01162[];
Class_Descriptor cd_ee01162 = {  "ee01162", // class name
  bases_ee01162, 4,
  &(vtc_ee01162[0]), // expected_vtbl_contents
  &(vtt_ee01162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01162),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11162  : virtual dd1162 {
  int e;
  ~ee11162(); // tgen
  ee11162(); // tgen
};
//SIG(1 ee11162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} Fi}


ee11162 ::~ee11162(){ note_dtor("ee11162", this);} // tgen
ee11162 ::ee11162(){ note_ctor("ee11162", this);} // tgen

static void Test_ee11162()
{
  extern Class_Descriptor cd_ee11162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11162, buf);
    ee11162 *dp, &lv = *(dp=new (buf) ee11162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee11162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee11162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(32,16), "ee11162");
    check_base_class_offset(lv, (dd1162*), ABISELECT(16,8), "ee11162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11162.e");
    test_class_info(&lv, &cd_ee11162);
    dp->~ee11162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11162(Test_ee11162, "ee11162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11162C1Ev();
extern void _ZN7ee11162D1Ev();
Name_Map name_map_ee11162[] = {
  NSPAIR(_ZN7ee11162C1Ev),
  NSPAIR(_ZN7ee11162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee11162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11162[];
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee11162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11162[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11162[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11162[0]),
  0,
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee11162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee11162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee11162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee11162[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee11162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee11162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee11162[] = {
  {&(_ZTV7ee11162[5]),  5,18},
  {&(_ZTV7ee11162[9]),  9,18},
  {&(_ZTV7ee11162[12]),  12,18},
  {&(_ZTV7ee11162[16]),  16,18},
  {&(_tg__ZTV6dd1162__7ee11162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee11162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee11162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee11162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee11162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11162[];
extern  VTBL_ENTRY _ZTV7ee11162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11162[];
Class_Descriptor cd_ee11162 = {  "ee11162", // class name
  bases_ee11162, 4,
  &(vtc_ee11162[0]), // expected_vtbl_contents
  &(vtt_ee11162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11162),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21162  : dd1162 {
  int e;
  virtual void  foo(); // _ZN7ee211623fooEv
  ~ee21162(); // tgen
  ee21162(); // tgen
};
//SIG(1 ee21162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee21162 ::foo(){vfunc_called(this, "_ZN7ee211623fooEv");}
ee21162 ::~ee21162(){ note_dtor("ee21162", this);} // tgen
ee21162 ::ee21162(){ note_ctor("ee21162", this);} // tgen

static void Test_ee21162()
{
  extern Class_Descriptor cd_ee21162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21162, buf);
    ee21162 *dp, &lv = *(dp=new (buf) ee21162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee21162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee21162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(16,12), "ee21162");
    check_base_class_offset(lv, (dd1162*), 0, "ee21162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21162.e");
    test_class_info(&lv, &cd_ee21162);
    dp->~ee21162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21162(Test_ee21162, "ee21162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21162C1Ev();
extern void _ZN7ee21162D1Ev();
Name_Map name_map_ee21162[] = {
  NSPAIR(_ZN7ee21162C1Ev),
  NSPAIR(_ZN7ee21162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee21162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21162[];
extern void _ZN7ee211623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee211623fooEv,_ZTv0_n12_N7ee211623fooEv)();
extern void ABISELECT(_ZThn32_N7ee211623fooEv,_ZThn20_N7ee211623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee21162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21162[0]),
  (VTBL_ENTRY)&_ZN7ee211623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21162[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee211623fooEv,_ZTv0_n12_N7ee211623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee21162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee21162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee21162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee21162[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee21162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee21162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee21162[] = {
  {&(_ZTV7ee21162[4]),  4,14},
  {&(_tg__ZTV6dd1162__7ee21162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee21162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee21162[4]),  4,6},
  {&(_ZTV7ee21162[8]),  8,14},
  {&(_ZTV7ee21162[12]),  12,14},
  {&(_tg__ZTV5cc162__7ee21162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee21162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21162[];
extern  VTBL_ENTRY _ZTV7ee21162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21162[];
static VTBL_ENTRY alt_thunk_names982[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee211623fooEv,_ZTv0_n12_N7ee211623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee211623fooEv,_ZThn20_N7ee211623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21162 = {  "ee21162", // class name
  bases_ee21162, 4,
  &(vtc_ee21162[0]), // expected_vtbl_contents
  &(vtt_ee21162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names982,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31162  : virtual dd1162 {
  int e;
  virtual void  foo(); // _ZN7ee311623fooEv
  ~ee31162(); // tgen
  ee31162(); // tgen
};
//SIG(1 ee31162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 Fi}


void  ee31162 ::foo(){vfunc_called(this, "_ZN7ee311623fooEv");}
ee31162 ::~ee31162(){ note_dtor("ee31162", this);} // tgen
ee31162 ::ee31162(){ note_ctor("ee31162", this);} // tgen

static void Test_ee31162()
{
  extern Class_Descriptor cd_ee31162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31162, buf);
    ee31162 *dp, &lv = *(dp=new (buf) ee31162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee31162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee31162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(32,16), "ee31162");
    check_base_class_offset(lv, (dd1162*), ABISELECT(16,8), "ee31162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31162.e");
    test_class_info(&lv, &cd_ee31162);
    dp->~ee31162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31162(Test_ee31162, "ee31162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31162C1Ev();
extern void _ZN7ee31162D1Ev();
Name_Map name_map_ee31162[] = {
  NSPAIR(_ZN7ee31162C1Ev),
  NSPAIR(_ZN7ee31162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee31162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31162[];
extern void _ZN7ee311623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee311623fooEv,_ZTv0_n12_N7ee311623fooEv)();
extern void ABISELECT(_ZThn48_N7ee311623fooEv,_ZThn24_N7ee311623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee31162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31162[0]),
  (VTBL_ENTRY)&_ZN7ee311623fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31162[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31162[0]),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee311623fooEv,_ZTv0_n12_N7ee311623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee31162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee31162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee31162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee31162[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee31162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee31162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee31162[] = {
  {&(_ZTV7ee31162[5]),  5,19},
  {&(_ZTV7ee31162[10]),  10,19},
  {&(_ZTV7ee31162[13]),  13,19},
  {&(_ZTV7ee31162[17]),  17,19},
  {&(_tg__ZTV6dd1162__7ee31162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee31162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee31162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee31162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee31162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31162[];
extern  VTBL_ENTRY _ZTV7ee31162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31162[];
static VTBL_ENTRY alt_thunk_names983[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee311623fooEv,_ZTv0_n12_N7ee311623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee311623fooEv,_ZThn24_N7ee311623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31162 = {  "ee31162", // class name
  bases_ee31162, 4,
  &(vtc_ee31162[0]), // expected_vtbl_contents
  &(vtt_ee31162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31162),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names983,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41162  : dd1162 {
  int e;
  virtual void  bar(); // _ZN7ee411623barEv
  ~ee41162(); // tgen
  ee41162(); // tgen
};
//SIG(1 ee41162) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee41162 ::bar(){vfunc_called(this, "_ZN7ee411623barEv");}
ee41162 ::~ee41162(){ note_dtor("ee41162", this);} // tgen
ee41162 ::ee41162(){ note_ctor("ee41162", this);} // tgen

static void Test_ee41162()
{
  extern Class_Descriptor cd_ee41162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41162, buf);
    ee41162 *dp, &lv = *(dp=new (buf) ee41162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee41162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee41162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(16,12), "ee41162");
    check_base_class_offset(lv, (dd1162*), 0, "ee41162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41162.e");
    test_class_info(&lv, &cd_ee41162);
    dp->~ee41162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41162(Test_ee41162, "ee41162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41162C1Ev();
extern void _ZN7ee41162D1Ev();
Name_Map name_map_ee41162[] = {
  NSPAIR(_ZN7ee41162C1Ev),
  NSPAIR(_ZN7ee41162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee41162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41162[];
extern void _ZN7ee411623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee411623barEv,_ZTv0_n16_N7ee411623barEv)();
extern void ABISELECT(_ZThn32_N7ee411623barEv,_ZThn20_N7ee411623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41162[0]),
  (VTBL_ENTRY)&_ZN7ee411623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41162[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee411623barEv,_ZTv0_n16_N7ee411623barEv),
};
extern VTBL_ENTRY _ZTV7ee41162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee41162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee41162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee41162[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee41162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee41162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee41162[] = {
  {&(_ZTV7ee41162[4]),  4,14},
  {&(_tg__ZTV6dd1162__7ee41162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee41162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee41162[4]),  4,6},
  {&(_ZTV7ee41162[8]),  8,14},
  {&(_ZTV7ee41162[12]),  12,14},
  {&(_tg__ZTV5cc162__7ee41162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee41162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41162[];
extern  VTBL_ENTRY _ZTV7ee41162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41162[];
static VTBL_ENTRY alt_thunk_names984[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee411623barEv,_ZTv0_n16_N7ee411623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee411623barEv,_ZThn20_N7ee411623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41162 = {  "ee41162", // class name
  bases_ee41162, 4,
  &(vtc_ee41162[0]), // expected_vtbl_contents
  &(vtt_ee41162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names984,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51162  : virtual dd1162 {
  int e;
  virtual void  bar(); // _ZN7ee511623barEv
  ~ee51162(); // tgen
  ee51162(); // tgen
};
//SIG(1 ee51162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} Fi} v1 Fi}


void  ee51162 ::bar(){vfunc_called(this, "_ZN7ee511623barEv");}
ee51162 ::~ee51162(){ note_dtor("ee51162", this);} // tgen
ee51162 ::ee51162(){ note_ctor("ee51162", this);} // tgen

static void Test_ee51162()
{
  extern Class_Descriptor cd_ee51162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51162, buf);
    ee51162 *dp, &lv = *(dp=new (buf) ee51162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee51162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee51162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(32,16), "ee51162");
    check_base_class_offset(lv, (dd1162*), ABISELECT(16,8), "ee51162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51162.e");
    test_class_info(&lv, &cd_ee51162);
    dp->~ee51162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51162(Test_ee51162, "ee51162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51162C1Ev();
extern void _ZN7ee51162D1Ev();
Name_Map name_map_ee51162[] = {
  NSPAIR(_ZN7ee51162C1Ev),
  NSPAIR(_ZN7ee51162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee51162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51162[];
extern void _ZN7ee511623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee511623barEv,_ZTv0_n16_N7ee511623barEv)();
extern void ABISELECT(_ZThn48_N7ee511623barEv,_ZThn24_N7ee511623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51162[0]),
  (VTBL_ENTRY)&_ZN7ee511623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51162[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51162[0]),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee511623barEv,_ZTv0_n16_N7ee511623barEv),
};
extern VTBL_ENTRY _ZTV7ee51162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee51162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee51162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee51162[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee51162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee51162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee51162[] = {
  {&(_ZTV7ee51162[5]),  5,19},
  {&(_ZTV7ee51162[10]),  10,19},
  {&(_ZTV7ee51162[13]),  13,19},
  {&(_ZTV7ee51162[17]),  17,19},
  {&(_tg__ZTV6dd1162__7ee51162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee51162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee51162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee51162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee51162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51162[];
extern  VTBL_ENTRY _ZTV7ee51162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51162[];
static VTBL_ENTRY alt_thunk_names985[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee511623barEv,_ZTv0_n16_N7ee511623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee511623barEv,_ZThn24_N7ee511623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51162 = {  "ee51162", // class name
  bases_ee51162, 4,
  &(vtc_ee51162[0]), // expected_vtbl_contents
  &(vtt_ee51162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51162),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names985,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61162  : dd1162 {
  int e;
  virtual void  foo(); // _ZN7ee611623fooEv
  virtual void  bar(); // _ZN7ee611623barEv
  ~ee61162(); // tgen
  ee61162(); // tgen
};
//SIG(1 ee61162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee61162 ::foo(){vfunc_called(this, "_ZN7ee611623fooEv");}
void  ee61162 ::bar(){vfunc_called(this, "_ZN7ee611623barEv");}
ee61162 ::~ee61162(){ note_dtor("ee61162", this);} // tgen
ee61162 ::ee61162(){ note_ctor("ee61162", this);} // tgen

static void Test_ee61162()
{
  extern Class_Descriptor cd_ee61162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61162, buf);
    ee61162 *dp, &lv = *(dp=new (buf) ee61162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee61162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee61162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(16,12), "ee61162");
    check_base_class_offset(lv, (dd1162*), 0, "ee61162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61162.e");
    test_class_info(&lv, &cd_ee61162);
    dp->~ee61162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61162(Test_ee61162, "ee61162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61162C1Ev();
extern void _ZN7ee61162D1Ev();
Name_Map name_map_ee61162[] = {
  NSPAIR(_ZN7ee61162C1Ev),
  NSPAIR(_ZN7ee61162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee61162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61162[];
extern void _ZN7ee611623fooEv();
extern void _ZN7ee611623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee611623fooEv,_ZTv0_n12_N7ee611623fooEv)();
extern void ABISELECT(_ZThn32_N7ee611623fooEv,_ZThn20_N7ee611623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee611623barEv,_ZTv0_n16_N7ee611623barEv)();
extern void ABISELECT(_ZThn32_N7ee611623barEv,_ZThn20_N7ee611623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61162[0]),
  (VTBL_ENTRY)&_ZN7ee611623fooEv,
  (VTBL_ENTRY)&_ZN7ee611623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee611623fooEv,_ZTv0_n12_N7ee611623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee611623barEv,_ZTv0_n16_N7ee611623barEv),
};
extern VTBL_ENTRY _ZTV7ee61162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee61162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee61162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee61162[] = {
  0,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee61162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee61162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee61162[] = {
  {&(_ZTV7ee61162[4]),  4,15},
  {&(_tg__ZTV6dd1162__7ee61162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee61162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee61162[4]),  4,6},
  {&(_ZTV7ee61162[9]),  9,15},
  {&(_ZTV7ee61162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee61162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee61162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61162[];
extern  VTBL_ENTRY _ZTV7ee61162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61162[];
static VTBL_ENTRY alt_thunk_names986[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee611623barEv,_ZTv0_n16_N7ee611623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee611623barEv,_ZThn20_N7ee611623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee611623fooEv,_ZTv0_n12_N7ee611623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee611623fooEv,_ZThn20_N7ee611623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61162 = {  "ee61162", // class name
  bases_ee61162, 4,
  &(vtc_ee61162[0]), // expected_vtbl_contents
  &(vtt_ee61162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names986,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71162  : virtual dd1162 {
  int e;
  virtual void  foo(); // _ZN7ee711623fooEv
  virtual void  bar(); // _ZN7ee711623barEv
  ~ee71162(); // tgen
  ee71162(); // tgen
};
//SIG(1 ee71162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} Fi} v1 v2 Fi}


void  ee71162 ::foo(){vfunc_called(this, "_ZN7ee711623fooEv");}
void  ee71162 ::bar(){vfunc_called(this, "_ZN7ee711623barEv");}
ee71162 ::~ee71162(){ note_dtor("ee71162", this);} // tgen
ee71162 ::ee71162(){ note_ctor("ee71162", this);} // tgen

static void Test_ee71162()
{
  extern Class_Descriptor cd_ee71162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71162, buf);
    ee71162 *dp, &lv = *(dp=new (buf) ee71162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee71162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee71162");
    check_base_class_offset(lv, (cc162*)(dd1162*), ABISELECT(32,16), "ee71162");
    check_base_class_offset(lv, (dd1162*), ABISELECT(16,8), "ee71162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71162.e");
    test_class_info(&lv, &cd_ee71162);
    dp->~ee71162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71162(Test_ee71162, "ee71162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71162C1Ev();
extern void _ZN7ee71162D1Ev();
Name_Map name_map_ee71162[] = {
  NSPAIR(_ZN7ee71162C1Ev),
  NSPAIR(_ZN7ee71162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd1162;
extern VTBL_ENTRY _ZTI6dd1162[];
extern  VTBL_ENTRY _ZTV6dd1162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1162[];
static Base_Class bases_ee71162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1162,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71162[];
extern void _ZN7ee711623fooEv();
extern void _ZN7ee711623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee711623fooEv,_ZTv0_n12_N7ee711623fooEv)();
extern void ABISELECT(_ZThn48_N7ee711623fooEv,_ZThn24_N7ee711623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee711623barEv,_ZTv0_n16_N7ee711623barEv)();
extern void ABISELECT(_ZThn48_N7ee711623barEv,_ZThn24_N7ee711623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71162[0]),
  (VTBL_ENTRY)&_ZN7ee711623fooEv,
  (VTBL_ENTRY)&_ZN7ee711623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71162[0]),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71162[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee711623fooEv,_ZTv0_n12_N7ee711623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee711623barEv,_ZTv0_n16_N7ee711623barEv),
};
extern VTBL_ENTRY _ZTV7ee71162[];
static  VTBL_ENTRY _tg__ZTV6dd1162__7ee71162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd1162__7ee71162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1162__7ee71162[] = {
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee71162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee71162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee71162[] = {
  {&(_ZTV7ee71162[5]),  5,20},
  {&(_ZTV7ee71162[11]),  11,20},
  {&(_ZTV7ee71162[14]),  14,20},
  {&(_ZTV7ee71162[18]),  18,20},
  {&(_tg__ZTV6dd1162__7ee71162[4]),  4,4},
  {&(_tg__ZTV5cc162__6dd1162__7ee71162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd1162__7ee71162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee71162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee71162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71162[];
extern  VTBL_ENTRY _ZTV7ee71162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71162[];
static VTBL_ENTRY alt_thunk_names987[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee711623barEv,_ZTv0_n16_N7ee711623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee711623barEv,_ZThn24_N7ee711623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee711623fooEv,_ZTv0_n12_N7ee711623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee711623fooEv,_ZThn24_N7ee711623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71162 = {  "ee71162", // class name
  bases_ee71162, 4,
  &(vtc_ee71162[0]), // expected_vtbl_contents
  &(vtt_ee71162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71162),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names987,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2162  : cc162 {
  int d;
  virtual void  foo(); // _ZN6dd21623fooEv
  ~dd2162(); // tgen
  dd2162(); // tgen
};
//SIG(-1 dd2162) C1{ BC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd2162 ::foo(){vfunc_called(this, "_ZN6dd21623fooEv");}
dd2162 ::~dd2162(){ note_dtor("dd2162", this);} // tgen
dd2162 ::dd2162(){ note_ctor("dd2162", this);} // tgen

static void Test_dd2162()
{
  extern Class_Descriptor cd_dd2162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2162, buf);
    dd2162 *dp, &lv = *(dp=new (buf) dd2162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd2162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(16,12), "dd2162");
    check_base_class_offset(lv, (cc162*), 0, "dd2162");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2162.d");
    test_class_info(&lv, &cd_dd2162);
    dp->~dd2162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2162(Test_dd2162, "dd2162", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2162C1Ev();
extern void _ZN6dd2162D1Ev();
Name_Map name_map_dd2162[] = {
  NSPAIR(_ZN6dd2162C1Ev),
  NSPAIR(_ZN6dd2162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd2162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2162[];
extern void _ZN6dd21623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd2162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd2162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd2162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd2162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd2162[] = {
  {&(_ZTV6dd2162[3]),  3,10},
  {&(_tg__ZTV5cc162__6dd2162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd2162[4]),  4,6},
  {&(_ZTV6dd2162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static VTBL_ENTRY alt_thunk_names988[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2162 = {  "dd2162", // class name
  bases_dd2162, 3,
  &(vtc_dd2162[0]), // expected_vtbl_contents
  &(vtt_dd2162[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2162),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names988,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02162  : dd2162 {
  int e;
  ~ee02162(); // tgen
  ee02162(); // tgen
};
//SIG(1 ee02162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee02162 ::~ee02162(){ note_dtor("ee02162", this);} // tgen
ee02162 ::ee02162(){ note_ctor("ee02162", this);} // tgen

static void Test_ee02162()
{
  extern Class_Descriptor cd_ee02162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02162, buf);
    ee02162 *dp, &lv = *(dp=new (buf) ee02162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee02162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(24,16), "ee02162");
    check_base_class_offset(lv, (cc162*)(dd2162*), 0, "ee02162");
    check_base_class_offset(lv, (dd2162*), 0, "ee02162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02162.e");
    test_class_info(&lv, &cd_ee02162);
    dp->~ee02162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02162(Test_ee02162, "ee02162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02162C1Ev();
extern void _ZN7ee02162D1Ev();
Name_Map name_map_ee02162[] = {
  NSPAIR(_ZN7ee02162C1Ev),
  NSPAIR(_ZN7ee02162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee02162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02162[];
extern void _ZN6dd21623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee02162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee02162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee02162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee02162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee02162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee02162[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee02162[] = {
  {&(_ZTV7ee02162[3]),  3,10},
  {&(_tg__ZTV6dd2162__7ee02162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee02162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee02162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee02162[4]),  4,6},
  {&(_ZTV7ee02162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee02162[];
extern  VTBL_ENTRY _ZTV7ee02162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02162[];
static VTBL_ENTRY alt_thunk_names989[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02162 = {  "ee02162", // class name
  bases_ee02162, 4,
  &(vtc_ee02162[0]), // expected_vtbl_contents
  &(vtt_ee02162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names989,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12162  : virtual dd2162 {
  int e;
  ~ee12162(); // tgen
  ee12162(); // tgen
};
//SIG(1 ee12162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee12162 ::~ee12162(){ note_dtor("ee12162", this);} // tgen
ee12162 ::ee12162(){ note_ctor("ee12162", this);} // tgen

static void Test_ee12162()
{
  extern Class_Descriptor cd_ee12162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12162, buf);
    ee12162 *dp, &lv = *(dp=new (buf) ee12162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee12162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(32,20), "ee12162");
    check_base_class_offset(lv, (cc162*)(dd2162*), ABISELECT(16,8), "ee12162");
    check_base_class_offset(lv, (dd2162*), ABISELECT(16,8), "ee12162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12162.e");
    test_class_info(&lv, &cd_ee12162);
    dp->~ee12162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12162(Test_ee12162, "ee12162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12162C1Ev();
extern void _ZN7ee12162D1Ev();
Name_Map name_map_ee12162[] = {
  NSPAIR(_ZN7ee12162C1Ev),
  NSPAIR(_ZN7ee12162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee12162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12162[];
extern void _ZN6dd21623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee12162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12162[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee12162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee12162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee12162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee12162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee12162[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee12162[] = {
  {&(_ZTV7ee12162[4]),  4,15},
  {&(_ZTV7ee12162[8]),  8,15},
  {&(_ZTV7ee12162[13]),  13,15},
  {&(_tg__ZTV6dd2162__7ee12162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee12162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee12162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee12162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12162[];
extern  VTBL_ENTRY _ZTV7ee12162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12162[];
static VTBL_ENTRY alt_thunk_names990[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12162 = {  "ee12162", // class name
  bases_ee12162, 4,
  &(vtc_ee12162[0]), // expected_vtbl_contents
  &(vtt_ee12162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names990,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22162  : dd2162 {
  int e;
  virtual void  foo(); // _ZN7ee221623fooEv
  ~ee22162(); // tgen
  ee22162(); // tgen
};
//SIG(1 ee22162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee22162 ::foo(){vfunc_called(this, "_ZN7ee221623fooEv");}
ee22162 ::~ee22162(){ note_dtor("ee22162", this);} // tgen
ee22162 ::ee22162(){ note_ctor("ee22162", this);} // tgen

static void Test_ee22162()
{
  extern Class_Descriptor cd_ee22162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22162, buf);
    ee22162 *dp, &lv = *(dp=new (buf) ee22162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee22162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(24,16), "ee22162");
    check_base_class_offset(lv, (cc162*)(dd2162*), 0, "ee22162");
    check_base_class_offset(lv, (dd2162*), 0, "ee22162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22162.e");
    test_class_info(&lv, &cd_ee22162);
    dp->~ee22162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22162(Test_ee22162, "ee22162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22162C1Ev();
extern void _ZN7ee22162D1Ev();
Name_Map name_map_ee22162[] = {
  NSPAIR(_ZN7ee22162C1Ev),
  NSPAIR(_ZN7ee22162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee22162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22162[];
extern void _ZN7ee221623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee221623fooEv,_ZTv0_n12_N7ee221623fooEv)();
extern void ABISELECT(_ZThn24_N7ee221623fooEv,_ZThn16_N7ee221623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee22162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22162[0]),
  (VTBL_ENTRY)&_ZN7ee221623fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee221623fooEv,_ZTv0_n12_N7ee221623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee22162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee22162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee22162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee22162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee22162[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee22162[] = {
  {&(_ZTV7ee22162[3]),  3,10},
  {&(_tg__ZTV6dd2162__7ee22162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee22162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee22162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee22162[4]),  4,6},
  {&(_ZTV7ee22162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee22162[];
extern  VTBL_ENTRY _ZTV7ee22162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22162[];
static VTBL_ENTRY alt_thunk_names991[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee221623fooEv,_ZTv0_n12_N7ee221623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee221623fooEv,_ZThn16_N7ee221623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22162 = {  "ee22162", // class name
  bases_ee22162, 4,
  &(vtc_ee22162[0]), // expected_vtbl_contents
  &(vtt_ee22162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names991,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32162  : virtual dd2162 {
  int e;
  virtual void  foo(); // _ZN7ee321623fooEv
  ~ee32162(); // tgen
  ee32162(); // tgen
};
//SIG(1 ee32162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee32162 ::foo(){vfunc_called(this, "_ZN7ee321623fooEv");}
ee32162 ::~ee32162(){ note_dtor("ee32162", this);} // tgen
ee32162 ::ee32162(){ note_ctor("ee32162", this);} // tgen

static void Test_ee32162()
{
  extern Class_Descriptor cd_ee32162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32162, buf);
    ee32162 *dp, &lv = *(dp=new (buf) ee32162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee32162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(32,20), "ee32162");
    check_base_class_offset(lv, (cc162*)(dd2162*), ABISELECT(16,8), "ee32162");
    check_base_class_offset(lv, (dd2162*), ABISELECT(16,8), "ee32162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32162.e");
    test_class_info(&lv, &cd_ee32162);
    dp->~ee32162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32162(Test_ee32162, "ee32162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32162C1Ev();
extern void _ZN7ee32162D1Ev();
Name_Map name_map_ee32162[] = {
  NSPAIR(_ZN7ee32162C1Ev),
  NSPAIR(_ZN7ee32162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee32162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32162[];
extern void _ZN7ee321623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee321623fooEv,_ZTv0_n16_N7ee321623fooEv)();
extern void ABISELECT(_ZThn16_N7ee321623fooEv,_ZThn8_N7ee321623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee321623fooEv,_ZTv0_n12_N7ee321623fooEv)();
extern void ABISELECT(_ZThn32_N7ee321623fooEv,_ZThn20_N7ee321623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee32162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32162[0]),
  (VTBL_ENTRY)&_ZN7ee321623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee321623fooEv,_ZTv0_n16_N7ee321623fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee321623fooEv,_ZTv0_n12_N7ee321623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee32162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee32162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee32162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee32162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee32162[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee32162[] = {
  {&(_ZTV7ee32162[4]),  4,16},
  {&(_ZTV7ee32162[9]),  9,16},
  {&(_ZTV7ee32162[14]),  14,16},
  {&(_tg__ZTV6dd2162__7ee32162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee32162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee32162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee32162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32162[];
extern  VTBL_ENTRY _ZTV7ee32162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32162[];
static VTBL_ENTRY alt_thunk_names992[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee321623fooEv,_ZTv0_n12_N7ee321623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee321623fooEv,_ZThn20_N7ee321623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee321623fooEv,_ZTv0_n16_N7ee321623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee321623fooEv,_ZThn8_N7ee321623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32162 = {  "ee32162", // class name
  bases_ee32162, 4,
  &(vtc_ee32162[0]), // expected_vtbl_contents
  &(vtt_ee32162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32162),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names992,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42162  : dd2162 {
  int e;
  virtual void  bar(); // _ZN7ee421623barEv
  ~ee42162(); // tgen
  ee42162(); // tgen
};
//SIG(1 ee42162) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee42162 ::bar(){vfunc_called(this, "_ZN7ee421623barEv");}
ee42162 ::~ee42162(){ note_dtor("ee42162", this);} // tgen
ee42162 ::ee42162(){ note_ctor("ee42162", this);} // tgen

static void Test_ee42162()
{
  extern Class_Descriptor cd_ee42162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42162, buf);
    ee42162 *dp, &lv = *(dp=new (buf) ee42162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee42162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(24,16), "ee42162");
    check_base_class_offset(lv, (cc162*)(dd2162*), 0, "ee42162");
    check_base_class_offset(lv, (dd2162*), 0, "ee42162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42162.e");
    test_class_info(&lv, &cd_ee42162);
    dp->~ee42162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42162(Test_ee42162, "ee42162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42162C1Ev();
extern void _ZN7ee42162D1Ev();
Name_Map name_map_ee42162[] = {
  NSPAIR(_ZN7ee42162C1Ev),
  NSPAIR(_ZN7ee42162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee42162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42162[];
extern void _ZN6dd21623fooEv();
extern void _ZN7ee421623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee421623barEv,_ZTv0_n16_N7ee421623barEv)();
extern void ABISELECT(_ZThn24_N7ee421623barEv,_ZThn16_N7ee421623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
  (VTBL_ENTRY)&_ZN7ee421623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee421623barEv,_ZTv0_n16_N7ee421623barEv),
};
extern VTBL_ENTRY _ZTV7ee42162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee42162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee42162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee42162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee42162[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee42162[] = {
  {&(_ZTV7ee42162[3]),  3,11},
  {&(_tg__ZTV6dd2162__7ee42162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee42162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee42162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee42162[4]),  4,6},
  {&(_ZTV7ee42162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42162[];
extern  VTBL_ENTRY _ZTV7ee42162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42162[];
static VTBL_ENTRY alt_thunk_names993[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee421623barEv,_ZTv0_n16_N7ee421623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee421623barEv,_ZThn16_N7ee421623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42162 = {  "ee42162", // class name
  bases_ee42162, 4,
  &(vtc_ee42162[0]), // expected_vtbl_contents
  &(vtt_ee42162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names993,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52162  : virtual dd2162 {
  int e;
  virtual void  bar(); // _ZN7ee521623barEv
  ~ee52162(); // tgen
  ee52162(); // tgen
};
//SIG(1 ee52162) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee52162 ::bar(){vfunc_called(this, "_ZN7ee521623barEv");}
ee52162 ::~ee52162(){ note_dtor("ee52162", this);} // tgen
ee52162 ::ee52162(){ note_ctor("ee52162", this);} // tgen

static void Test_ee52162()
{
  extern Class_Descriptor cd_ee52162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52162, buf);
    ee52162 *dp, &lv = *(dp=new (buf) ee52162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee52162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(32,20), "ee52162");
    check_base_class_offset(lv, (cc162*)(dd2162*), ABISELECT(16,8), "ee52162");
    check_base_class_offset(lv, (dd2162*), ABISELECT(16,8), "ee52162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52162.e");
    test_class_info(&lv, &cd_ee52162);
    dp->~ee52162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52162(Test_ee52162, "ee52162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52162C1Ev();
extern void _ZN7ee52162D1Ev();
Name_Map name_map_ee52162[] = {
  NSPAIR(_ZN7ee52162C1Ev),
  NSPAIR(_ZN7ee52162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee52162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52162[];
extern void _ZN7ee521623barEv();
extern void _ZN6dd21623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee521623barEv,_ZTv0_n16_N7ee521623barEv)();
extern void ABISELECT(_ZThn32_N7ee521623barEv,_ZThn20_N7ee521623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52162[0]),
  (VTBL_ENTRY)&_ZN7ee521623barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee521623barEv,_ZTv0_n16_N7ee521623barEv),
};
extern VTBL_ENTRY _ZTV7ee52162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee52162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee52162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee52162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee52162[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee52162[] = {
  {&(_ZTV7ee52162[4]),  4,16},
  {&(_ZTV7ee52162[9]),  9,16},
  {&(_ZTV7ee52162[14]),  14,16},
  {&(_tg__ZTV6dd2162__7ee52162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee52162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee52162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee52162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52162[];
extern  VTBL_ENTRY _ZTV7ee52162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52162[];
static VTBL_ENTRY alt_thunk_names994[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee521623barEv,_ZTv0_n16_N7ee521623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee521623barEv,_ZThn20_N7ee521623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52162 = {  "ee52162", // class name
  bases_ee52162, 4,
  &(vtc_ee52162[0]), // expected_vtbl_contents
  &(vtt_ee52162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52162),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names994,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62162  : dd2162 {
  int e;
  virtual void  foo(); // _ZN7ee621623fooEv
  virtual void  bar(); // _ZN7ee621623barEv
  ~ee62162(); // tgen
  ee62162(); // tgen
};
//SIG(1 ee62162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee62162 ::foo(){vfunc_called(this, "_ZN7ee621623fooEv");}
void  ee62162 ::bar(){vfunc_called(this, "_ZN7ee621623barEv");}
ee62162 ::~ee62162(){ note_dtor("ee62162", this);} // tgen
ee62162 ::ee62162(){ note_ctor("ee62162", this);} // tgen

static void Test_ee62162()
{
  extern Class_Descriptor cd_ee62162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62162, buf);
    ee62162 *dp, &lv = *(dp=new (buf) ee62162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee62162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(24,16), "ee62162");
    check_base_class_offset(lv, (cc162*)(dd2162*), 0, "ee62162");
    check_base_class_offset(lv, (dd2162*), 0, "ee62162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62162.e");
    test_class_info(&lv, &cd_ee62162);
    dp->~ee62162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62162(Test_ee62162, "ee62162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62162C1Ev();
extern void _ZN7ee62162D1Ev();
Name_Map name_map_ee62162[] = {
  NSPAIR(_ZN7ee62162C1Ev),
  NSPAIR(_ZN7ee62162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee62162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62162[];
extern void _ZN7ee621623fooEv();
extern void _ZN7ee621623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee621623fooEv,_ZTv0_n12_N7ee621623fooEv)();
extern void ABISELECT(_ZThn24_N7ee621623fooEv,_ZThn16_N7ee621623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee621623barEv,_ZTv0_n16_N7ee621623barEv)();
extern void ABISELECT(_ZThn24_N7ee621623barEv,_ZThn16_N7ee621623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62162[0]),
  (VTBL_ENTRY)&_ZN7ee621623fooEv,
  (VTBL_ENTRY)&_ZN7ee621623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee621623fooEv,_ZTv0_n12_N7ee621623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee621623barEv,_ZTv0_n16_N7ee621623barEv),
};
extern VTBL_ENTRY _ZTV7ee62162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee62162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee62162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee62162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee62162[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee62162[] = {
  {&(_ZTV7ee62162[3]),  3,11},
  {&(_tg__ZTV6dd2162__7ee62162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee62162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee62162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee62162[4]),  4,6},
  {&(_ZTV7ee62162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62162[];
extern  VTBL_ENTRY _ZTV7ee62162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62162[];
static VTBL_ENTRY alt_thunk_names995[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd21623fooEv,_ZThn16_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee621623barEv,_ZTv0_n16_N7ee621623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee621623barEv,_ZThn16_N7ee621623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee621623fooEv,_ZTv0_n12_N7ee621623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee621623fooEv,_ZThn16_N7ee621623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62162 = {  "ee62162", // class name
  bases_ee62162, 4,
  &(vtc_ee62162[0]), // expected_vtbl_contents
  &(vtt_ee62162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names995,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72162  : virtual dd2162 {
  int e;
  virtual void  foo(); // _ZN7ee721623fooEv
  virtual void  bar(); // _ZN7ee721623barEv
  ~ee72162(); // tgen
  ee72162(); // tgen
};
//SIG(1 ee72162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee72162 ::foo(){vfunc_called(this, "_ZN7ee721623fooEv");}
void  ee72162 ::bar(){vfunc_called(this, "_ZN7ee721623barEv");}
ee72162 ::~ee72162(){ note_dtor("ee72162", this);} // tgen
ee72162 ::ee72162(){ note_ctor("ee72162", this);} // tgen

static void Test_ee72162()
{
  extern Class_Descriptor cd_ee72162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72162, buf);
    ee72162 *dp, &lv = *(dp=new (buf) ee72162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee72162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd2162*), ABISELECT(32,20), "ee72162");
    check_base_class_offset(lv, (cc162*)(dd2162*), ABISELECT(16,8), "ee72162");
    check_base_class_offset(lv, (dd2162*), ABISELECT(16,8), "ee72162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72162.e");
    test_class_info(&lv, &cd_ee72162);
    dp->~ee72162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72162(Test_ee72162, "ee72162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72162C1Ev();
extern void _ZN7ee72162D1Ev();
Name_Map name_map_ee72162[] = {
  NSPAIR(_ZN7ee72162C1Ev),
  NSPAIR(_ZN7ee72162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd2162;
extern VTBL_ENTRY _ZTI6dd2162[];
extern  VTBL_ENTRY _ZTV6dd2162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2162[];
static Base_Class bases_ee72162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2162,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72162[];
extern void _ZN7ee721623fooEv();
extern void _ZN7ee721623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee721623fooEv,_ZTv0_n16_N7ee721623fooEv)();
extern void ABISELECT(_ZThn16_N7ee721623fooEv,_ZThn8_N7ee721623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee721623fooEv,_ZTv0_n12_N7ee721623fooEv)();
extern void ABISELECT(_ZThn32_N7ee721623fooEv,_ZThn20_N7ee721623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee721623barEv,_ZTv0_n16_N7ee721623barEv)();
extern void ABISELECT(_ZThn32_N7ee721623barEv,_ZThn20_N7ee721623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72162[0]),
  (VTBL_ENTRY)&_ZN7ee721623fooEv,
  (VTBL_ENTRY)&_ZN7ee721623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee721623fooEv,_ZTv0_n16_N7ee721623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee721623fooEv,_ZTv0_n12_N7ee721623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee721623barEv,_ZTv0_n16_N7ee721623barEv),
};
extern VTBL_ENTRY _ZTV7ee72162[];
extern void _ZN6dd21623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2162__7ee72162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&_ZN6dd21623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd2162__7ee72162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd2162__7ee72162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv)();
extern void ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2162__7ee72162[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee72162[] = {
  {&(_ZTV7ee72162[4]),  4,17},
  {&(_ZTV7ee72162[10]),  10,17},
  {&(_ZTV7ee72162[15]),  15,17},
  {&(_tg__ZTV6dd2162__7ee72162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd2162__7ee72162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd2162__7ee72162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2162__7ee72162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72162[];
extern  VTBL_ENTRY _ZTV7ee72162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72162[];
static VTBL_ENTRY alt_thunk_names996[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd21623fooEv,_ZTv0_n12_N6dd21623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd21623fooEv,_ZThn12_N6dd21623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee721623barEv,_ZTv0_n16_N7ee721623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee721623barEv,_ZThn20_N7ee721623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee721623fooEv,_ZTv0_n12_N7ee721623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee721623fooEv,_ZThn20_N7ee721623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee721623fooEv,_ZTv0_n16_N7ee721623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee721623fooEv,_ZThn8_N7ee721623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72162 = {  "ee72162", // class name
  bases_ee72162, 4,
  &(vtc_ee72162[0]), // expected_vtbl_contents
  &(vtt_ee72162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72162),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names996,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3162  : virtual cc162 {
  int d;
  virtual void  foo(); // _ZN6dd31623fooEv
  ~dd3162(); // tgen
  dd3162(); // tgen
};
//SIG(-1 dd3162) C1{ VBC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  dd3162 ::foo(){vfunc_called(this, "_ZN6dd31623fooEv");}
dd3162 ::~dd3162(){ note_dtor("dd3162", this);} // tgen
dd3162 ::dd3162(){ note_ctor("dd3162", this);} // tgen

static void Test_dd3162()
{
  extern Class_Descriptor cd_dd3162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3162, buf);
    dd3162 *dp, &lv = *(dp=new (buf) dd3162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd3162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,16), "dd3162");
    check_base_class_offset(lv, (cc162*), ABISELECT(16,8), "dd3162");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3162.d");
    test_class_info(&lv, &cd_dd3162);
    dp->~dd3162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3162(Test_dd3162, "dd3162", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3162C1Ev();
extern void _ZN6dd3162D1Ev();
Name_Map name_map_dd3162[] = {
  NSPAIR(_ZN6dd3162C1Ev),
  NSPAIR(_ZN6dd3162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd3162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd3162[];
extern void _ZN6dd31623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd3162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd3162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd3162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd3162[] = {
  {&(_ZTV6dd3162[4]),  4,14},
  {&(_ZTV6dd3162[8]),  8,14},
  {&(_ZTV6dd3162[12]),  12,14},
  {&(_tg__ZTV5cc162__6dd3162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd3162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static VTBL_ENTRY alt_thunk_names997[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3162 = {  "dd3162", // class name
  bases_dd3162, 3,
  &(vtc_dd3162[0]), // expected_vtbl_contents
  &(vtt_dd3162[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3162),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names997,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03162  : dd3162 {
  int e;
  ~ee03162(); // tgen
  ee03162(); // tgen
};
//SIG(1 ee03162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee03162 ::~ee03162(){ note_dtor("ee03162", this);} // tgen
ee03162 ::ee03162(){ note_ctor("ee03162", this);} // tgen

static void Test_ee03162()
{
  extern Class_Descriptor cd_ee03162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03162, buf);
    ee03162 *dp, &lv = *(dp=new (buf) ee03162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee03162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee03162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(16,12), "ee03162");
    check_base_class_offset(lv, (dd3162*), 0, "ee03162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03162.e");
    test_class_info(&lv, &cd_ee03162);
    dp->~ee03162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03162(Test_ee03162, "ee03162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03162C1Ev();
extern void _ZN7ee03162D1Ev();
Name_Map name_map_ee03162[] = {
  NSPAIR(_ZN7ee03162C1Ev),
  NSPAIR(_ZN7ee03162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee03162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03162[];
extern void _ZN6dd31623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee03162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03162[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee03162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee03162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee03162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee03162[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee03162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee03162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee03162[] = {
  {&(_ZTV7ee03162[4]),  4,14},
  {&(_tg__ZTV6dd3162__7ee03162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee03162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee03162[4]),  4,6},
  {&(_ZTV7ee03162[8]),  8,14},
  {&(_ZTV7ee03162[12]),  12,14},
  {&(_tg__ZTV5cc162__7ee03162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee03162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03162[];
extern  VTBL_ENTRY _ZTV7ee03162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03162[];
static VTBL_ENTRY alt_thunk_names998[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03162 = {  "ee03162", // class name
  bases_ee03162, 4,
  &(vtc_ee03162[0]), // expected_vtbl_contents
  &(vtt_ee03162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names998,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13162  : virtual dd3162 {
  int e;
  ~ee13162(); // tgen
  ee13162(); // tgen
};
//SIG(1 ee13162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} Fi}


ee13162 ::~ee13162(){ note_dtor("ee13162", this);} // tgen
ee13162 ::ee13162(){ note_ctor("ee13162", this);} // tgen

static void Test_ee13162()
{
  extern Class_Descriptor cd_ee13162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13162, buf);
    ee13162 *dp, &lv = *(dp=new (buf) ee13162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee13162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee13162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(32,16), "ee13162");
    check_base_class_offset(lv, (dd3162*), ABISELECT(16,8), "ee13162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13162.e");
    test_class_info(&lv, &cd_ee13162);
    dp->~ee13162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13162(Test_ee13162, "ee13162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13162C1Ev();
extern void _ZN7ee13162D1Ev();
Name_Map name_map_ee13162[] = {
  NSPAIR(_ZN7ee13162C1Ev),
  NSPAIR(_ZN7ee13162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee13162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13162[];
extern void _ZN6dd31623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee13162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13162[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13162[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee13162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee13162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee13162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee13162[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee13162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee13162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee13162[] = {
  {&(_ZTV7ee13162[5]),  5,20},
  {&(_ZTV7ee13162[10]),  10,20},
  {&(_ZTV7ee13162[14]),  14,20},
  {&(_ZTV7ee13162[18]),  18,20},
  {&(_tg__ZTV6dd3162__7ee13162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee13162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee13162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee13162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee13162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13162[];
extern  VTBL_ENTRY _ZTV7ee13162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13162[];
static VTBL_ENTRY alt_thunk_names999[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13162 = {  "ee13162", // class name
  bases_ee13162, 4,
  &(vtc_ee13162[0]), // expected_vtbl_contents
  &(vtt_ee13162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13162),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names999,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23162  : dd3162 {
  int e;
  virtual void  foo(); // _ZN7ee231623fooEv
  ~ee23162(); // tgen
  ee23162(); // tgen
};
//SIG(1 ee23162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee23162 ::foo(){vfunc_called(this, "_ZN7ee231623fooEv");}
ee23162 ::~ee23162(){ note_dtor("ee23162", this);} // tgen
ee23162 ::ee23162(){ note_ctor("ee23162", this);} // tgen

static void Test_ee23162()
{
  extern Class_Descriptor cd_ee23162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23162, buf);
    ee23162 *dp, &lv = *(dp=new (buf) ee23162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee23162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee23162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(16,12), "ee23162");
    check_base_class_offset(lv, (dd3162*), 0, "ee23162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23162.e");
    test_class_info(&lv, &cd_ee23162);
    dp->~ee23162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23162(Test_ee23162, "ee23162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23162C1Ev();
extern void _ZN7ee23162D1Ev();
Name_Map name_map_ee23162[] = {
  NSPAIR(_ZN7ee23162C1Ev),
  NSPAIR(_ZN7ee23162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee23162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23162[];
extern void _ZN7ee231623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee231623fooEv,_ZTv0_n12_N7ee231623fooEv)();
extern void ABISELECT(_ZThn32_N7ee231623fooEv,_ZThn20_N7ee231623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee23162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23162[0]),
  (VTBL_ENTRY)&_ZN7ee231623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23162[0]),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee231623fooEv,_ZTv0_n12_N7ee231623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee23162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee23162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee23162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee23162[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee23162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee23162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee23162[] = {
  {&(_ZTV7ee23162[4]),  4,14},
  {&(_tg__ZTV6dd3162__7ee23162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee23162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee23162[4]),  4,6},
  {&(_ZTV7ee23162[8]),  8,14},
  {&(_ZTV7ee23162[12]),  12,14},
  {&(_tg__ZTV5cc162__7ee23162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee23162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23162[];
extern  VTBL_ENTRY _ZTV7ee23162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23162[];
static VTBL_ENTRY alt_thunk_names1000[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee231623fooEv,_ZTv0_n12_N7ee231623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee231623fooEv,_ZThn20_N7ee231623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23162 = {  "ee23162", // class name
  bases_ee23162, 4,
  &(vtc_ee23162[0]), // expected_vtbl_contents
  &(vtt_ee23162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1000,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33162  : virtual dd3162 {
  int e;
  virtual void  foo(); // _ZN7ee331623fooEv
  ~ee33162(); // tgen
  ee33162(); // tgen
};
//SIG(1 ee33162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 Fi}


void  ee33162 ::foo(){vfunc_called(this, "_ZN7ee331623fooEv");}
ee33162 ::~ee33162(){ note_dtor("ee33162", this);} // tgen
ee33162 ::ee33162(){ note_ctor("ee33162", this);} // tgen

static void Test_ee33162()
{
  extern Class_Descriptor cd_ee33162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33162, buf);
    ee33162 *dp, &lv = *(dp=new (buf) ee33162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee33162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee33162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(32,16), "ee33162");
    check_base_class_offset(lv, (dd3162*), ABISELECT(16,8), "ee33162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33162.e");
    test_class_info(&lv, &cd_ee33162);
    dp->~ee33162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33162(Test_ee33162, "ee33162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33162C1Ev();
extern void _ZN7ee33162D1Ev();
Name_Map name_map_ee33162[] = {
  NSPAIR(_ZN7ee33162C1Ev),
  NSPAIR(_ZN7ee33162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee33162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33162[];
extern void _ZN7ee331623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee331623fooEv,_ZTv0_n20_N7ee331623fooEv)();
extern void ABISELECT(_ZThn16_N7ee331623fooEv,_ZThn8_N7ee331623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee331623fooEv,_ZTv0_n12_N7ee331623fooEv)();
extern void ABISELECT(_ZThn48_N7ee331623fooEv,_ZThn24_N7ee331623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee33162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33162[0]),
  (VTBL_ENTRY)&_ZN7ee331623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee331623fooEv,_ZTv0_n20_N7ee331623fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33162[0]),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee331623fooEv,_ZTv0_n12_N7ee331623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee33162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee33162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee33162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee33162[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee33162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee33162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee33162[] = {
  {&(_ZTV7ee33162[5]),  5,21},
  {&(_ZTV7ee33162[11]),  11,21},
  {&(_ZTV7ee33162[15]),  15,21},
  {&(_ZTV7ee33162[19]),  19,21},
  {&(_tg__ZTV6dd3162__7ee33162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee33162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee33162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee33162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee33162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33162[];
extern  VTBL_ENTRY _ZTV7ee33162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33162[];
static VTBL_ENTRY alt_thunk_names1001[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee331623fooEv,_ZTv0_n12_N7ee331623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee331623fooEv,_ZThn24_N7ee331623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee331623fooEv,_ZTv0_n20_N7ee331623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee331623fooEv,_ZThn8_N7ee331623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33162 = {  "ee33162", // class name
  bases_ee33162, 4,
  &(vtc_ee33162[0]), // expected_vtbl_contents
  &(vtt_ee33162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33162),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1001,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43162  : dd3162 {
  int e;
  virtual void  bar(); // _ZN7ee431623barEv
  ~ee43162(); // tgen
  ee43162(); // tgen
};
//SIG(1 ee43162) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee43162 ::bar(){vfunc_called(this, "_ZN7ee431623barEv");}
ee43162 ::~ee43162(){ note_dtor("ee43162", this);} // tgen
ee43162 ::ee43162(){ note_ctor("ee43162", this);} // tgen

static void Test_ee43162()
{
  extern Class_Descriptor cd_ee43162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43162, buf);
    ee43162 *dp, &lv = *(dp=new (buf) ee43162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee43162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee43162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(16,12), "ee43162");
    check_base_class_offset(lv, (dd3162*), 0, "ee43162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43162.e");
    test_class_info(&lv, &cd_ee43162);
    dp->~ee43162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43162(Test_ee43162, "ee43162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43162C1Ev();
extern void _ZN7ee43162D1Ev();
Name_Map name_map_ee43162[] = {
  NSPAIR(_ZN7ee43162C1Ev),
  NSPAIR(_ZN7ee43162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee43162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43162[];
extern void _ZN6dd31623fooEv();
extern void _ZN7ee431623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee431623barEv,_ZTv0_n16_N7ee431623barEv)();
extern void ABISELECT(_ZThn32_N7ee431623barEv,_ZThn20_N7ee431623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
  (VTBL_ENTRY)&_ZN7ee431623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee431623barEv,_ZTv0_n16_N7ee431623barEv),
};
extern VTBL_ENTRY _ZTV7ee43162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee43162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee43162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee43162[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee43162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee43162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee43162[] = {
  {&(_ZTV7ee43162[4]),  4,15},
  {&(_tg__ZTV6dd3162__7ee43162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee43162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee43162[4]),  4,6},
  {&(_ZTV7ee43162[9]),  9,15},
  {&(_ZTV7ee43162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee43162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee43162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43162[];
extern  VTBL_ENTRY _ZTV7ee43162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43162[];
static VTBL_ENTRY alt_thunk_names1002[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee431623barEv,_ZTv0_n16_N7ee431623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee431623barEv,_ZThn20_N7ee431623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43162 = {  "ee43162", // class name
  bases_ee43162, 4,
  &(vtc_ee43162[0]), // expected_vtbl_contents
  &(vtt_ee43162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1002,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53162  : virtual dd3162 {
  int e;
  virtual void  bar(); // _ZN7ee531623barEv
  ~ee53162(); // tgen
  ee53162(); // tgen
};
//SIG(1 ee53162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v2 Fi} v1 Fi}


void  ee53162 ::bar(){vfunc_called(this, "_ZN7ee531623barEv");}
ee53162 ::~ee53162(){ note_dtor("ee53162", this);} // tgen
ee53162 ::ee53162(){ note_ctor("ee53162", this);} // tgen

static void Test_ee53162()
{
  extern Class_Descriptor cd_ee53162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53162, buf);
    ee53162 *dp, &lv = *(dp=new (buf) ee53162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee53162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee53162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(32,16), "ee53162");
    check_base_class_offset(lv, (dd3162*), ABISELECT(16,8), "ee53162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53162.e");
    test_class_info(&lv, &cd_ee53162);
    dp->~ee53162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53162(Test_ee53162, "ee53162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53162C1Ev();
extern void _ZN7ee53162D1Ev();
Name_Map name_map_ee53162[] = {
  NSPAIR(_ZN7ee53162C1Ev),
  NSPAIR(_ZN7ee53162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee53162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53162[];
extern void _ZN7ee531623barEv();
extern void _ZN6dd31623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee531623barEv,_ZTv0_n16_N7ee531623barEv)();
extern void ABISELECT(_ZThn48_N7ee531623barEv,_ZThn24_N7ee531623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53162[0]),
  (VTBL_ENTRY)&_ZN7ee531623barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53162[0]),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee531623barEv,_ZTv0_n16_N7ee531623barEv),
};
extern VTBL_ENTRY _ZTV7ee53162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee53162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee53162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee53162[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee53162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee53162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee53162[] = {
  {&(_ZTV7ee53162[5]),  5,21},
  {&(_ZTV7ee53162[11]),  11,21},
  {&(_ZTV7ee53162[15]),  15,21},
  {&(_ZTV7ee53162[19]),  19,21},
  {&(_tg__ZTV6dd3162__7ee53162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee53162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee53162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee53162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee53162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53162[];
extern  VTBL_ENTRY _ZTV7ee53162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53162[];
static VTBL_ENTRY alt_thunk_names1003[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee531623barEv,_ZTv0_n16_N7ee531623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee531623barEv,_ZThn24_N7ee531623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53162 = {  "ee53162", // class name
  bases_ee53162, 4,
  &(vtc_ee53162[0]), // expected_vtbl_contents
  &(vtt_ee53162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53162),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1003,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63162  : dd3162 {
  int e;
  virtual void  foo(); // _ZN7ee631623fooEv
  virtual void  bar(); // _ZN7ee631623barEv
  ~ee63162(); // tgen
  ee63162(); // tgen
};
//SIG(1 ee63162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee63162 ::foo(){vfunc_called(this, "_ZN7ee631623fooEv");}
void  ee63162 ::bar(){vfunc_called(this, "_ZN7ee631623barEv");}
ee63162 ::~ee63162(){ note_dtor("ee63162", this);} // tgen
ee63162 ::ee63162(){ note_ctor("ee63162", this);} // tgen

static void Test_ee63162()
{
  extern Class_Descriptor cd_ee63162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63162, buf);
    ee63162 *dp, &lv = *(dp=new (buf) ee63162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee63162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee63162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(16,12), "ee63162");
    check_base_class_offset(lv, (dd3162*), 0, "ee63162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63162.e");
    test_class_info(&lv, &cd_ee63162);
    dp->~ee63162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63162(Test_ee63162, "ee63162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63162C1Ev();
extern void _ZN7ee63162D1Ev();
Name_Map name_map_ee63162[] = {
  NSPAIR(_ZN7ee63162C1Ev),
  NSPAIR(_ZN7ee63162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee63162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63162[];
extern void _ZN7ee631623fooEv();
extern void _ZN7ee631623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee631623fooEv,_ZTv0_n12_N7ee631623fooEv)();
extern void ABISELECT(_ZThn32_N7ee631623fooEv,_ZThn20_N7ee631623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee631623barEv,_ZTv0_n16_N7ee631623barEv)();
extern void ABISELECT(_ZThn32_N7ee631623barEv,_ZThn20_N7ee631623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63162[0]),
  (VTBL_ENTRY)&_ZN7ee631623fooEv,
  (VTBL_ENTRY)&_ZN7ee631623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee631623fooEv,_ZTv0_n12_N7ee631623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee631623barEv,_ZTv0_n16_N7ee631623barEv),
};
extern VTBL_ENTRY _ZTV7ee63162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee63162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee63162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee63162[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee63162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee63162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee63162[] = {
  {&(_ZTV7ee63162[4]),  4,15},
  {&(_tg__ZTV6dd3162__7ee63162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee63162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee63162[4]),  4,6},
  {&(_ZTV7ee63162[9]),  9,15},
  {&(_ZTV7ee63162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee63162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee63162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63162[];
extern  VTBL_ENTRY _ZTV7ee63162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63162[];
static VTBL_ENTRY alt_thunk_names1004[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn20_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee631623barEv,_ZTv0_n16_N7ee631623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee631623barEv,_ZThn20_N7ee631623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee631623fooEv,_ZTv0_n12_N7ee631623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee631623fooEv,_ZThn20_N7ee631623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63162 = {  "ee63162", // class name
  bases_ee63162, 4,
  &(vtc_ee63162[0]), // expected_vtbl_contents
  &(vtt_ee63162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1004,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73162  : virtual dd3162 {
  int e;
  virtual void  foo(); // _ZN7ee731623fooEv
  virtual void  bar(); // _ZN7ee731623barEv
  ~ee73162(); // tgen
  ee73162(); // tgen
};
//SIG(1 ee73162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi} v1 v2 Fi}


void  ee73162 ::foo(){vfunc_called(this, "_ZN7ee731623fooEv");}
void  ee73162 ::bar(){vfunc_called(this, "_ZN7ee731623barEv");}
ee73162 ::~ee73162(){ note_dtor("ee73162", this);} // tgen
ee73162 ::ee73162(){ note_ctor("ee73162", this);} // tgen

static void Test_ee73162()
{
  extern Class_Descriptor cd_ee73162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73162, buf);
    ee73162 *dp, &lv = *(dp=new (buf) ee73162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee73162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee73162");
    check_base_class_offset(lv, (cc162*)(dd3162*), ABISELECT(32,16), "ee73162");
    check_base_class_offset(lv, (dd3162*), ABISELECT(16,8), "ee73162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73162.e");
    test_class_info(&lv, &cd_ee73162);
    dp->~ee73162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73162(Test_ee73162, "ee73162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73162C1Ev();
extern void _ZN7ee73162D1Ev();
Name_Map name_map_ee73162[] = {
  NSPAIR(_ZN7ee73162C1Ev),
  NSPAIR(_ZN7ee73162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd3162;
extern VTBL_ENTRY _ZTI6dd3162[];
extern  VTBL_ENTRY _ZTV6dd3162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3162[];
static Base_Class bases_ee73162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3162,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73162[];
extern void _ZN7ee731623fooEv();
extern void _ZN7ee731623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee731623fooEv,_ZTv0_n20_N7ee731623fooEv)();
extern void ABISELECT(_ZThn16_N7ee731623fooEv,_ZThn8_N7ee731623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee731623fooEv,_ZTv0_n12_N7ee731623fooEv)();
extern void ABISELECT(_ZThn48_N7ee731623fooEv,_ZThn24_N7ee731623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee731623barEv,_ZTv0_n16_N7ee731623barEv)();
extern void ABISELECT(_ZThn48_N7ee731623barEv,_ZThn24_N7ee731623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73162[0]),
  (VTBL_ENTRY)&_ZN7ee731623fooEv,
  (VTBL_ENTRY)&_ZN7ee731623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee731623fooEv,_ZTv0_n20_N7ee731623fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73162[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee731623fooEv,_ZTv0_n12_N7ee731623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee731623barEv,_ZTv0_n16_N7ee731623barEv),
};
extern VTBL_ENTRY _ZTV7ee73162[];
extern void _ZN6dd31623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3162__7ee73162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&_ZN6dd31623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd3162__7ee73162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv)();
extern void ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3162__7ee73162[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee73162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee73162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee73162[] = {
  {&(_ZTV7ee73162[5]),  5,22},
  {&(_ZTV7ee73162[12]),  12,22},
  {&(_ZTV7ee73162[16]),  16,22},
  {&(_ZTV7ee73162[20]),  20,22},
  {&(_tg__ZTV6dd3162__7ee73162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd3162__7ee73162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd3162__7ee73162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee73162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee73162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73162[];
extern  VTBL_ENTRY _ZTV7ee73162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73162[];
static VTBL_ENTRY alt_thunk_names1005[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd31623fooEv,_ZTv0_n12_N6dd31623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd31623fooEv,_ZThn16_N6dd31623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee731623barEv,_ZTv0_n16_N7ee731623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee731623barEv,_ZThn24_N7ee731623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee731623fooEv,_ZTv0_n12_N7ee731623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee731623fooEv,_ZThn24_N7ee731623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee731623fooEv,_ZTv0_n20_N7ee731623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee731623fooEv,_ZThn8_N7ee731623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73162 = {  "ee73162", // class name
  bases_ee73162, 4,
  &(vtc_ee73162[0]), // expected_vtbl_contents
  &(vtt_ee73162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73162),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1005,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4162  : cc162 {
  int d;
  virtual void  bar(); // _ZN6dd41623barEv
  ~dd4162(); // tgen
  dd4162(); // tgen
};
//SIG(-1 dd4162) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd4162 ::bar(){vfunc_called(this, "_ZN6dd41623barEv");}
dd4162 ::~dd4162(){ note_dtor("dd4162", this);} // tgen
dd4162 ::dd4162(){ note_ctor("dd4162", this);} // tgen

static void Test_dd4162()
{
  extern Class_Descriptor cd_dd4162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4162, buf);
    dd4162 *dp, &lv = *(dp=new (buf) dd4162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd4162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(16,12), "dd4162");
    check_base_class_offset(lv, (cc162*), 0, "dd4162");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4162.d");
    test_class_info(&lv, &cd_dd4162);
    dp->~dd4162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4162(Test_dd4162, "dd4162", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4162C1Ev();
extern void _ZN6dd4162D1Ev();
Name_Map name_map_dd4162[] = {
  NSPAIR(_ZN6dd4162C1Ev),
  NSPAIR(_ZN6dd4162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd4162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4162[];
extern void _ZN6dd41623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
extern VTBL_ENTRY _ZTV6dd4162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd4162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd4162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd4162[] = {
  {&(_ZTV6dd4162[3]),  3,10},
  {&(_tg__ZTV5cc162__6dd4162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd4162[4]),  4,6},
  {&(_ZTV6dd4162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static VTBL_ENTRY alt_thunk_names1006[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4162 = {  "dd4162", // class name
  bases_dd4162, 3,
  &(vtc_dd4162[0]), // expected_vtbl_contents
  &(vtt_dd4162[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4162),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1006,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04162  : dd4162 {
  int e;
  ~ee04162(); // tgen
  ee04162(); // tgen
};
//SIG(1 ee04162) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee04162 ::~ee04162(){ note_dtor("ee04162", this);} // tgen
ee04162 ::ee04162(){ note_ctor("ee04162", this);} // tgen

static void Test_ee04162()
{
  extern Class_Descriptor cd_ee04162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04162, buf);
    ee04162 *dp, &lv = *(dp=new (buf) ee04162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee04162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(24,16), "ee04162");
    check_base_class_offset(lv, (cc162*)(dd4162*), 0, "ee04162");
    check_base_class_offset(lv, (dd4162*), 0, "ee04162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04162.e");
    test_class_info(&lv, &cd_ee04162);
    dp->~ee04162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04162(Test_ee04162, "ee04162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04162C1Ev();
extern void _ZN7ee04162D1Ev();
Name_Map name_map_ee04162[] = {
  NSPAIR(_ZN7ee04162C1Ev),
  NSPAIR(_ZN7ee04162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee04162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04162[];
extern void _ZN6dd41623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
extern VTBL_ENTRY _ZTV7ee04162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee04162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee04162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee04162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee04162[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee04162[] = {
  {&(_ZTV7ee04162[3]),  3,10},
  {&(_tg__ZTV6dd4162__7ee04162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee04162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee04162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee04162[4]),  4,6},
  {&(_ZTV7ee04162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee04162[];
extern  VTBL_ENTRY _ZTV7ee04162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04162[];
static VTBL_ENTRY alt_thunk_names1007[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04162 = {  "ee04162", // class name
  bases_ee04162, 4,
  &(vtc_ee04162[0]), // expected_vtbl_contents
  &(vtt_ee04162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1007,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14162  : virtual dd4162 {
  int e;
  ~ee14162(); // tgen
  ee14162(); // tgen
};
//SIG(1 ee14162) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee14162 ::~ee14162(){ note_dtor("ee14162", this);} // tgen
ee14162 ::ee14162(){ note_ctor("ee14162", this);} // tgen

static void Test_ee14162()
{
  extern Class_Descriptor cd_ee14162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14162, buf);
    ee14162 *dp, &lv = *(dp=new (buf) ee14162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee14162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(32,20), "ee14162");
    check_base_class_offset(lv, (cc162*)(dd4162*), ABISELECT(16,8), "ee14162");
    check_base_class_offset(lv, (dd4162*), ABISELECT(16,8), "ee14162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14162.e");
    test_class_info(&lv, &cd_ee14162);
    dp->~ee14162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14162(Test_ee14162, "ee14162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14162C1Ev();
extern void _ZN7ee14162D1Ev();
Name_Map name_map_ee14162[] = {
  NSPAIR(_ZN7ee14162C1Ev),
  NSPAIR(_ZN7ee14162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee14162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14162[];
extern void _ZN6dd41623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14162[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
extern VTBL_ENTRY _ZTV7ee14162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee14162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee14162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee14162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee14162[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee14162[] = {
  {&(_ZTV7ee14162[4]),  4,15},
  {&(_ZTV7ee14162[8]),  8,15},
  {&(_ZTV7ee14162[13]),  13,15},
  {&(_tg__ZTV6dd4162__7ee14162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee14162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee14162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee14162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14162[];
extern  VTBL_ENTRY _ZTV7ee14162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14162[];
static VTBL_ENTRY alt_thunk_names1008[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14162 = {  "ee14162", // class name
  bases_ee14162, 4,
  &(vtc_ee14162[0]), // expected_vtbl_contents
  &(vtt_ee14162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1008,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24162  : dd4162 {
  int e;
  virtual void  foo(); // _ZN7ee241623fooEv
  ~ee24162(); // tgen
  ee24162(); // tgen
};
//SIG(1 ee24162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee24162 ::foo(){vfunc_called(this, "_ZN7ee241623fooEv");}
ee24162 ::~ee24162(){ note_dtor("ee24162", this);} // tgen
ee24162 ::ee24162(){ note_ctor("ee24162", this);} // tgen

static void Test_ee24162()
{
  extern Class_Descriptor cd_ee24162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24162, buf);
    ee24162 *dp, &lv = *(dp=new (buf) ee24162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee24162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(24,16), "ee24162");
    check_base_class_offset(lv, (cc162*)(dd4162*), 0, "ee24162");
    check_base_class_offset(lv, (dd4162*), 0, "ee24162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24162.e");
    test_class_info(&lv, &cd_ee24162);
    dp->~ee24162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24162(Test_ee24162, "ee24162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24162C1Ev();
extern void _ZN7ee24162D1Ev();
Name_Map name_map_ee24162[] = {
  NSPAIR(_ZN7ee24162C1Ev),
  NSPAIR(_ZN7ee24162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee24162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24162[];
extern void _ZN6dd41623barEv();
extern void _ZN7ee241623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee241623fooEv,_ZTv0_n12_N7ee241623fooEv)();
extern void ABISELECT(_ZThn24_N7ee241623fooEv,_ZThn16_N7ee241623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
  (VTBL_ENTRY)&_ZN7ee241623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee241623fooEv,_ZTv0_n12_N7ee241623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
extern VTBL_ENTRY _ZTV7ee24162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee24162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee24162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee24162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee24162[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee24162[] = {
  {&(_ZTV7ee24162[3]),  3,11},
  {&(_tg__ZTV6dd4162__7ee24162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee24162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee24162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee24162[4]),  4,6},
  {&(_ZTV7ee24162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24162[];
extern  VTBL_ENTRY _ZTV7ee24162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24162[];
static VTBL_ENTRY alt_thunk_names1009[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee241623fooEv,_ZTv0_n12_N7ee241623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee241623fooEv,_ZThn16_N7ee241623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24162 = {  "ee24162", // class name
  bases_ee24162, 4,
  &(vtc_ee24162[0]), // expected_vtbl_contents
  &(vtt_ee24162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1009,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34162  : virtual dd4162 {
  int e;
  virtual void  foo(); // _ZN7ee341623fooEv
  ~ee34162(); // tgen
  ee34162(); // tgen
};
//SIG(1 ee34162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee34162 ::foo(){vfunc_called(this, "_ZN7ee341623fooEv");}
ee34162 ::~ee34162(){ note_dtor("ee34162", this);} // tgen
ee34162 ::ee34162(){ note_ctor("ee34162", this);} // tgen

static void Test_ee34162()
{
  extern Class_Descriptor cd_ee34162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34162, buf);
    ee34162 *dp, &lv = *(dp=new (buf) ee34162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee34162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(32,20), "ee34162");
    check_base_class_offset(lv, (cc162*)(dd4162*), ABISELECT(16,8), "ee34162");
    check_base_class_offset(lv, (dd4162*), ABISELECT(16,8), "ee34162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34162.e");
    test_class_info(&lv, &cd_ee34162);
    dp->~ee34162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34162(Test_ee34162, "ee34162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34162C1Ev();
extern void _ZN7ee34162D1Ev();
Name_Map name_map_ee34162[] = {
  NSPAIR(_ZN7ee34162C1Ev),
  NSPAIR(_ZN7ee34162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee34162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34162[];
extern void _ZN7ee341623fooEv();
extern void _ZN6dd41623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee341623fooEv,_ZTv0_n12_N7ee341623fooEv)();
extern void ABISELECT(_ZThn32_N7ee341623fooEv,_ZThn20_N7ee341623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34162[0]),
  (VTBL_ENTRY)&_ZN7ee341623fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee341623fooEv,_ZTv0_n12_N7ee341623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
extern VTBL_ENTRY _ZTV7ee34162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee34162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee34162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee34162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee34162[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee34162[] = {
  {&(_ZTV7ee34162[4]),  4,16},
  {&(_ZTV7ee34162[9]),  9,16},
  {&(_ZTV7ee34162[14]),  14,16},
  {&(_tg__ZTV6dd4162__7ee34162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee34162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee34162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee34162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34162[];
extern  VTBL_ENTRY _ZTV7ee34162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34162[];
static VTBL_ENTRY alt_thunk_names1010[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee341623fooEv,_ZTv0_n12_N7ee341623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee341623fooEv,_ZThn20_N7ee341623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34162 = {  "ee34162", // class name
  bases_ee34162, 4,
  &(vtc_ee34162[0]), // expected_vtbl_contents
  &(vtt_ee34162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34162),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1010,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44162  : dd4162 {
  int e;
  virtual void  bar(); // _ZN7ee441623barEv
  ~ee44162(); // tgen
  ee44162(); // tgen
};
//SIG(1 ee44162) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee44162 ::bar(){vfunc_called(this, "_ZN7ee441623barEv");}
ee44162 ::~ee44162(){ note_dtor("ee44162", this);} // tgen
ee44162 ::ee44162(){ note_ctor("ee44162", this);} // tgen

static void Test_ee44162()
{
  extern Class_Descriptor cd_ee44162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44162, buf);
    ee44162 *dp, &lv = *(dp=new (buf) ee44162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee44162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(24,16), "ee44162");
    check_base_class_offset(lv, (cc162*)(dd4162*), 0, "ee44162");
    check_base_class_offset(lv, (dd4162*), 0, "ee44162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44162.e");
    test_class_info(&lv, &cd_ee44162);
    dp->~ee44162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44162(Test_ee44162, "ee44162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44162C1Ev();
extern void _ZN7ee44162D1Ev();
Name_Map name_map_ee44162[] = {
  NSPAIR(_ZN7ee44162C1Ev),
  NSPAIR(_ZN7ee44162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee44162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44162[];
extern void _ZN7ee441623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee441623barEv,_ZTv0_n16_N7ee441623barEv)();
extern void ABISELECT(_ZThn24_N7ee441623barEv,_ZThn16_N7ee441623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44162[0]),
  (VTBL_ENTRY)&_ZN7ee441623barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee441623barEv,_ZTv0_n16_N7ee441623barEv),
};
extern VTBL_ENTRY _ZTV7ee44162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee44162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee44162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee44162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee44162[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee44162[] = {
  {&(_ZTV7ee44162[3]),  3,10},
  {&(_tg__ZTV6dd4162__7ee44162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee44162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee44162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee44162[4]),  4,6},
  {&(_ZTV7ee44162[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee44162[];
extern  VTBL_ENTRY _ZTV7ee44162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44162[];
static VTBL_ENTRY alt_thunk_names1011[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee441623barEv,_ZTv0_n16_N7ee441623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee441623barEv,_ZThn16_N7ee441623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44162 = {  "ee44162", // class name
  bases_ee44162, 4,
  &(vtc_ee44162[0]), // expected_vtbl_contents
  &(vtt_ee44162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44162),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1011,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54162  : virtual dd4162 {
  int e;
  virtual void  bar(); // _ZN7ee541623barEv
  ~ee54162(); // tgen
  ee54162(); // tgen
};
//SIG(1 ee54162) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee54162 ::bar(){vfunc_called(this, "_ZN7ee541623barEv");}
ee54162 ::~ee54162(){ note_dtor("ee54162", this);} // tgen
ee54162 ::ee54162(){ note_ctor("ee54162", this);} // tgen

static void Test_ee54162()
{
  extern Class_Descriptor cd_ee54162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54162, buf);
    ee54162 *dp, &lv = *(dp=new (buf) ee54162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee54162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(32,20), "ee54162");
    check_base_class_offset(lv, (cc162*)(dd4162*), ABISELECT(16,8), "ee54162");
    check_base_class_offset(lv, (dd4162*), ABISELECT(16,8), "ee54162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54162.e");
    test_class_info(&lv, &cd_ee54162);
    dp->~ee54162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54162(Test_ee54162, "ee54162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54162C1Ev();
extern void _ZN7ee54162D1Ev();
Name_Map name_map_ee54162[] = {
  NSPAIR(_ZN7ee54162C1Ev),
  NSPAIR(_ZN7ee54162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee54162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54162[];
extern void _ZN7ee541623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee541623barEv,_ZTv0_n16_N7ee541623barEv)();
extern void ABISELECT(_ZThn16_N7ee541623barEv,_ZThn8_N7ee541623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee541623barEv,_ZTv0_n16_N7ee541623barEv)();
extern void ABISELECT(_ZThn32_N7ee541623barEv,_ZThn20_N7ee541623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54162[0]),
  (VTBL_ENTRY)&_ZN7ee541623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee541623barEv,_ZTv0_n16_N7ee541623barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee541623barEv,_ZTv0_n16_N7ee541623barEv),
};
extern VTBL_ENTRY _ZTV7ee54162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee54162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee54162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee54162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee54162[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee54162[] = {
  {&(_ZTV7ee54162[4]),  4,16},
  {&(_ZTV7ee54162[9]),  9,16},
  {&(_ZTV7ee54162[14]),  14,16},
  {&(_tg__ZTV6dd4162__7ee54162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee54162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee54162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee54162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54162[];
extern  VTBL_ENTRY _ZTV7ee54162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54162[];
static VTBL_ENTRY alt_thunk_names1012[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee541623barEv,_ZTv0_n16_N7ee541623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee541623barEv,_ZThn20_N7ee541623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee541623barEv,_ZThn8_N7ee541623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54162 = {  "ee54162", // class name
  bases_ee54162, 4,
  &(vtc_ee54162[0]), // expected_vtbl_contents
  &(vtt_ee54162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54162),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1012,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64162  : dd4162 {
  int e;
  virtual void  foo(); // _ZN7ee641623fooEv
  virtual void  bar(); // _ZN7ee641623barEv
  ~ee64162(); // tgen
  ee64162(); // tgen
};
//SIG(1 ee64162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee64162 ::foo(){vfunc_called(this, "_ZN7ee641623fooEv");}
void  ee64162 ::bar(){vfunc_called(this, "_ZN7ee641623barEv");}
ee64162 ::~ee64162(){ note_dtor("ee64162", this);} // tgen
ee64162 ::ee64162(){ note_ctor("ee64162", this);} // tgen

static void Test_ee64162()
{
  extern Class_Descriptor cd_ee64162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64162, buf);
    ee64162 *dp, &lv = *(dp=new (buf) ee64162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee64162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(24,16), "ee64162");
    check_base_class_offset(lv, (cc162*)(dd4162*), 0, "ee64162");
    check_base_class_offset(lv, (dd4162*), 0, "ee64162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64162.e");
    test_class_info(&lv, &cd_ee64162);
    dp->~ee64162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64162(Test_ee64162, "ee64162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64162C1Ev();
extern void _ZN7ee64162D1Ev();
Name_Map name_map_ee64162[] = {
  NSPAIR(_ZN7ee64162C1Ev),
  NSPAIR(_ZN7ee64162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee64162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64162[];
extern void _ZN7ee641623barEv();
extern void _ZN7ee641623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee641623fooEv,_ZTv0_n12_N7ee641623fooEv)();
extern void ABISELECT(_ZThn24_N7ee641623fooEv,_ZThn16_N7ee641623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee641623barEv,_ZTv0_n16_N7ee641623barEv)();
extern void ABISELECT(_ZThn24_N7ee641623barEv,_ZThn16_N7ee641623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64162[0]),
  (VTBL_ENTRY)&_ZN7ee641623barEv,
  (VTBL_ENTRY)&_ZN7ee641623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee641623fooEv,_ZTv0_n12_N7ee641623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee641623barEv,_ZTv0_n16_N7ee641623barEv),
};
extern VTBL_ENTRY _ZTV7ee64162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee64162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee64162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee64162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee64162[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee64162[] = {
  {&(_ZTV7ee64162[3]),  3,11},
  {&(_tg__ZTV6dd4162__7ee64162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee64162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee64162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee64162[4]),  4,6},
  {&(_ZTV7ee64162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64162[];
extern  VTBL_ENTRY _ZTV7ee64162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64162[];
static VTBL_ENTRY alt_thunk_names1013[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd41623barEv,_ZThn16_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee641623barEv,_ZTv0_n16_N7ee641623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee641623barEv,_ZThn16_N7ee641623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee641623fooEv,_ZTv0_n12_N7ee641623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee641623fooEv,_ZThn16_N7ee641623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64162 = {  "ee64162", // class name
  bases_ee64162, 4,
  &(vtc_ee64162[0]), // expected_vtbl_contents
  &(vtt_ee64162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1013,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74162  : virtual dd4162 {
  int e;
  virtual void  foo(); // _ZN7ee741623fooEv
  virtual void  bar(); // _ZN7ee741623barEv
  ~ee74162(); // tgen
  ee74162(); // tgen
};
//SIG(1 ee74162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee74162 ::foo(){vfunc_called(this, "_ZN7ee741623fooEv");}
void  ee74162 ::bar(){vfunc_called(this, "_ZN7ee741623barEv");}
ee74162 ::~ee74162(){ note_dtor("ee74162", this);} // tgen
ee74162 ::ee74162(){ note_ctor("ee74162", this);} // tgen

static void Test_ee74162()
{
  extern Class_Descriptor cd_ee74162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74162, buf);
    ee74162 *dp, &lv = *(dp=new (buf) ee74162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee74162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd4162*), ABISELECT(32,20), "ee74162");
    check_base_class_offset(lv, (cc162*)(dd4162*), ABISELECT(16,8), "ee74162");
    check_base_class_offset(lv, (dd4162*), ABISELECT(16,8), "ee74162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74162.e");
    test_class_info(&lv, &cd_ee74162);
    dp->~ee74162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74162(Test_ee74162, "ee74162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74162C1Ev();
extern void _ZN7ee74162D1Ev();
Name_Map name_map_ee74162[] = {
  NSPAIR(_ZN7ee74162C1Ev),
  NSPAIR(_ZN7ee74162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd4162;
extern VTBL_ENTRY _ZTI6dd4162[];
extern  VTBL_ENTRY _ZTV6dd4162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4162[];
static Base_Class bases_ee74162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4162,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74162[];
extern void _ZN7ee741623fooEv();
extern void _ZN7ee741623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee741623barEv,_ZTv0_n16_N7ee741623barEv)();
extern void ABISELECT(_ZThn16_N7ee741623barEv,_ZThn8_N7ee741623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee741623fooEv,_ZTv0_n12_N7ee741623fooEv)();
extern void ABISELECT(_ZThn32_N7ee741623fooEv,_ZThn20_N7ee741623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee741623barEv,_ZTv0_n16_N7ee741623barEv)();
extern void ABISELECT(_ZThn32_N7ee741623barEv,_ZThn20_N7ee741623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74162[0]),
  (VTBL_ENTRY)&_ZN7ee741623fooEv,
  (VTBL_ENTRY)&_ZN7ee741623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee741623barEv,_ZTv0_n16_N7ee741623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee741623fooEv,_ZTv0_n12_N7ee741623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee741623barEv,_ZTv0_n16_N7ee741623barEv),
};
extern VTBL_ENTRY _ZTV7ee74162[];
extern void _ZN6dd41623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4162__7ee74162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN6dd41623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd4162__7ee74162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd4162__7ee74162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv)();
extern void ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4162__7ee74162[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv),
};
static  VTT_ENTRY vtt_ee74162[] = {
  {&(_ZTV7ee74162[4]),  4,17},
  {&(_ZTV7ee74162[10]),  10,17},
  {&(_ZTV7ee74162[15]),  15,17},
  {&(_tg__ZTV6dd4162__7ee74162[3]),  3,4},
  {&(_tg__ZTV5cc1626dd4162__7ee74162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd4162__7ee74162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4162__7ee74162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74162[];
extern  VTBL_ENTRY _ZTV7ee74162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74162[];
static VTBL_ENTRY alt_thunk_names1014[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd41623barEv,_ZTv0_n16_N6dd41623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd41623barEv,_ZThn12_N6dd41623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee741623fooEv,_ZTv0_n12_N7ee741623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee741623fooEv,_ZThn20_N7ee741623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee741623barEv,_ZTv0_n16_N7ee741623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee741623barEv,_ZThn20_N7ee741623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee741623barEv,_ZThn8_N7ee741623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74162 = {  "ee74162", // class name
  bases_ee74162, 4,
  &(vtc_ee74162[0]), // expected_vtbl_contents
  &(vtt_ee74162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74162),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1014,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5162  : virtual cc162 {
  int d;
  virtual void  bar(); // _ZN6dd51623barEv
  ~dd5162(); // tgen
  dd5162(); // tgen
};
//SIG(-1 dd5162) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  dd5162 ::bar(){vfunc_called(this, "_ZN6dd51623barEv");}
dd5162 ::~dd5162(){ note_dtor("dd5162", this);} // tgen
dd5162 ::dd5162(){ note_ctor("dd5162", this);} // tgen

static void Test_dd5162()
{
  extern Class_Descriptor cd_dd5162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5162, buf);
    dd5162 *dp, &lv = *(dp=new (buf) dd5162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd5162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,16), "dd5162");
    check_base_class_offset(lv, (cc162*), ABISELECT(16,8), "dd5162");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5162.d");
    test_class_info(&lv, &cd_dd5162);
    dp->~dd5162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5162(Test_dd5162, "dd5162", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5162C1Ev();
extern void _ZN6dd5162D1Ev();
Name_Map name_map_dd5162[] = {
  NSPAIR(_ZN6dd5162C1Ev),
  NSPAIR(_ZN6dd5162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd5162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd5162[];
extern void _ZN6dd51623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
extern VTBL_ENTRY _ZTV6dd5162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd5162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd5162[] = {
  {&(_ZTV6dd5162[4]),  4,14},
  {&(_ZTV6dd5162[8]),  8,14},
  {&(_ZTV6dd5162[12]),  12,14},
  {&(_tg__ZTV5cc162__6dd5162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd5162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static VTBL_ENTRY alt_thunk_names1015[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5162 = {  "dd5162", // class name
  bases_dd5162, 3,
  &(vtc_dd5162[0]), // expected_vtbl_contents
  &(vtt_dd5162[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5162),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1015,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05162  : dd5162 {
  int e;
  ~ee05162(); // tgen
  ee05162(); // tgen
};
//SIG(1 ee05162) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee05162 ::~ee05162(){ note_dtor("ee05162", this);} // tgen
ee05162 ::ee05162(){ note_ctor("ee05162", this);} // tgen

static void Test_ee05162()
{
  extern Class_Descriptor cd_ee05162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05162, buf);
    ee05162 *dp, &lv = *(dp=new (buf) ee05162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee05162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee05162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(16,12), "ee05162");
    check_base_class_offset(lv, (dd5162*), 0, "ee05162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05162.e");
    test_class_info(&lv, &cd_ee05162);
    dp->~ee05162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05162(Test_ee05162, "ee05162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05162C1Ev();
extern void _ZN7ee05162D1Ev();
Name_Map name_map_ee05162[] = {
  NSPAIR(_ZN7ee05162C1Ev),
  NSPAIR(_ZN7ee05162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee05162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05162[];
extern void _ZN6dd51623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05162[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
extern VTBL_ENTRY _ZTV7ee05162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee05162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee05162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee05162[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee05162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee05162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee05162[] = {
  {&(_ZTV7ee05162[4]),  4,14},
  {&(_tg__ZTV6dd5162__7ee05162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee05162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee05162[4]),  4,6},
  {&(_ZTV7ee05162[8]),  8,14},
  {&(_ZTV7ee05162[12]),  12,14},
  {&(_tg__ZTV5cc162__7ee05162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee05162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05162[];
extern  VTBL_ENTRY _ZTV7ee05162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05162[];
static VTBL_ENTRY alt_thunk_names1016[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05162 = {  "ee05162", // class name
  bases_ee05162, 4,
  &(vtc_ee05162[0]), // expected_vtbl_contents
  &(vtt_ee05162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1016,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15162  : virtual dd5162 {
  int e;
  ~ee15162(); // tgen
  ee15162(); // tgen
};
//SIG(1 ee15162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} Fi}


ee15162 ::~ee15162(){ note_dtor("ee15162", this);} // tgen
ee15162 ::ee15162(){ note_ctor("ee15162", this);} // tgen

static void Test_ee15162()
{
  extern Class_Descriptor cd_ee15162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15162, buf);
    ee15162 *dp, &lv = *(dp=new (buf) ee15162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee15162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee15162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(32,16), "ee15162");
    check_base_class_offset(lv, (dd5162*), ABISELECT(16,8), "ee15162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15162.e");
    test_class_info(&lv, &cd_ee15162);
    dp->~ee15162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15162(Test_ee15162, "ee15162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15162C1Ev();
extern void _ZN7ee15162D1Ev();
Name_Map name_map_ee15162[] = {
  NSPAIR(_ZN7ee15162C1Ev),
  NSPAIR(_ZN7ee15162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee15162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15162[];
extern void _ZN6dd51623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15162[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15162[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
extern VTBL_ENTRY _ZTV7ee15162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee15162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee15162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee15162[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee15162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee15162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee15162[] = {
  {&(_ZTV7ee15162[5]),  5,20},
  {&(_ZTV7ee15162[10]),  10,20},
  {&(_ZTV7ee15162[14]),  14,20},
  {&(_ZTV7ee15162[18]),  18,20},
  {&(_tg__ZTV6dd5162__7ee15162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee15162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee15162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee15162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee15162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15162[];
extern  VTBL_ENTRY _ZTV7ee15162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15162[];
static VTBL_ENTRY alt_thunk_names1017[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15162 = {  "ee15162", // class name
  bases_ee15162, 4,
  &(vtc_ee15162[0]), // expected_vtbl_contents
  &(vtt_ee15162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15162),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1017,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25162  : dd5162 {
  int e;
  virtual void  foo(); // _ZN7ee251623fooEv
  ~ee25162(); // tgen
  ee25162(); // tgen
};
//SIG(1 ee25162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee25162 ::foo(){vfunc_called(this, "_ZN7ee251623fooEv");}
ee25162 ::~ee25162(){ note_dtor("ee25162", this);} // tgen
ee25162 ::ee25162(){ note_ctor("ee25162", this);} // tgen

static void Test_ee25162()
{
  extern Class_Descriptor cd_ee25162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25162, buf);
    ee25162 *dp, &lv = *(dp=new (buf) ee25162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee25162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee25162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(16,12), "ee25162");
    check_base_class_offset(lv, (dd5162*), 0, "ee25162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25162.e");
    test_class_info(&lv, &cd_ee25162);
    dp->~ee25162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25162(Test_ee25162, "ee25162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25162C1Ev();
extern void _ZN7ee25162D1Ev();
Name_Map name_map_ee25162[] = {
  NSPAIR(_ZN7ee25162C1Ev),
  NSPAIR(_ZN7ee25162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee25162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25162[];
extern void _ZN6dd51623barEv();
extern void _ZN7ee251623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee251623fooEv,_ZTv0_n12_N7ee251623fooEv)();
extern void ABISELECT(_ZThn32_N7ee251623fooEv,_ZThn20_N7ee251623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
  (VTBL_ENTRY)&_ZN7ee251623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee251623fooEv,_ZTv0_n12_N7ee251623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
extern VTBL_ENTRY _ZTV7ee25162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee25162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee25162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee25162[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee25162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee25162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee25162[] = {
  {&(_ZTV7ee25162[4]),  4,15},
  {&(_tg__ZTV6dd5162__7ee25162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee25162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee25162[4]),  4,6},
  {&(_ZTV7ee25162[9]),  9,15},
  {&(_ZTV7ee25162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee25162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee25162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25162[];
extern  VTBL_ENTRY _ZTV7ee25162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25162[];
static VTBL_ENTRY alt_thunk_names1018[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee251623fooEv,_ZTv0_n12_N7ee251623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee251623fooEv,_ZThn20_N7ee251623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25162 = {  "ee25162", // class name
  bases_ee25162, 4,
  &(vtc_ee25162[0]), // expected_vtbl_contents
  &(vtt_ee25162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1018,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35162  : virtual dd5162 {
  int e;
  virtual void  foo(); // _ZN7ee351623fooEv
  ~ee35162(); // tgen
  ee35162(); // tgen
};
//SIG(1 ee35162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 Fi}


void  ee35162 ::foo(){vfunc_called(this, "_ZN7ee351623fooEv");}
ee35162 ::~ee35162(){ note_dtor("ee35162", this);} // tgen
ee35162 ::ee35162(){ note_ctor("ee35162", this);} // tgen

static void Test_ee35162()
{
  extern Class_Descriptor cd_ee35162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35162, buf);
    ee35162 *dp, &lv = *(dp=new (buf) ee35162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee35162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee35162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(32,16), "ee35162");
    check_base_class_offset(lv, (dd5162*), ABISELECT(16,8), "ee35162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35162.e");
    test_class_info(&lv, &cd_ee35162);
    dp->~ee35162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35162(Test_ee35162, "ee35162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35162C1Ev();
extern void _ZN7ee35162D1Ev();
Name_Map name_map_ee35162[] = {
  NSPAIR(_ZN7ee35162C1Ev),
  NSPAIR(_ZN7ee35162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee35162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35162[];
extern void _ZN7ee351623fooEv();
extern void _ZN6dd51623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee351623fooEv,_ZTv0_n12_N7ee351623fooEv)();
extern void ABISELECT(_ZThn48_N7ee351623fooEv,_ZThn24_N7ee351623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35162[0]),
  (VTBL_ENTRY)&_ZN7ee351623fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35162[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee351623fooEv,_ZTv0_n12_N7ee351623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
extern VTBL_ENTRY _ZTV7ee35162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee35162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee35162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee35162[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee35162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee35162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee35162[] = {
  {&(_ZTV7ee35162[5]),  5,21},
  {&(_ZTV7ee35162[11]),  11,21},
  {&(_ZTV7ee35162[15]),  15,21},
  {&(_ZTV7ee35162[19]),  19,21},
  {&(_tg__ZTV6dd5162__7ee35162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee35162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee35162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee35162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee35162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35162[];
extern  VTBL_ENTRY _ZTV7ee35162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35162[];
static VTBL_ENTRY alt_thunk_names1019[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee351623fooEv,_ZTv0_n12_N7ee351623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee351623fooEv,_ZThn24_N7ee351623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35162 = {  "ee35162", // class name
  bases_ee35162, 4,
  &(vtc_ee35162[0]), // expected_vtbl_contents
  &(vtt_ee35162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35162),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1019,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45162  : dd5162 {
  int e;
  virtual void  bar(); // _ZN7ee451623barEv
  ~ee45162(); // tgen
  ee45162(); // tgen
};
//SIG(1 ee45162) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee45162 ::bar(){vfunc_called(this, "_ZN7ee451623barEv");}
ee45162 ::~ee45162(){ note_dtor("ee45162", this);} // tgen
ee45162 ::ee45162(){ note_ctor("ee45162", this);} // tgen

static void Test_ee45162()
{
  extern Class_Descriptor cd_ee45162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45162, buf);
    ee45162 *dp, &lv = *(dp=new (buf) ee45162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee45162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee45162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(16,12), "ee45162");
    check_base_class_offset(lv, (dd5162*), 0, "ee45162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45162.e");
    test_class_info(&lv, &cd_ee45162);
    dp->~ee45162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45162(Test_ee45162, "ee45162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45162C1Ev();
extern void _ZN7ee45162D1Ev();
Name_Map name_map_ee45162[] = {
  NSPAIR(_ZN7ee45162C1Ev),
  NSPAIR(_ZN7ee45162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee45162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45162[];
extern void _ZN7ee451623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee451623barEv,_ZTv0_n16_N7ee451623barEv)();
extern void ABISELECT(_ZThn32_N7ee451623barEv,_ZThn20_N7ee451623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45162[0]),
  (VTBL_ENTRY)&_ZN7ee451623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45162[0]),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee451623barEv,_ZTv0_n16_N7ee451623barEv),
};
extern VTBL_ENTRY _ZTV7ee45162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee45162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee45162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee45162[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee45162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee45162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee45162[] = {
  {&(_ZTV7ee45162[4]),  4,14},
  {&(_tg__ZTV6dd5162__7ee45162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee45162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee45162[4]),  4,6},
  {&(_ZTV7ee45162[8]),  8,14},
  {&(_ZTV7ee45162[12]),  12,14},
  {&(_tg__ZTV5cc162__7ee45162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee45162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45162[];
extern  VTBL_ENTRY _ZTV7ee45162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45162[];
static VTBL_ENTRY alt_thunk_names1020[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee451623barEv,_ZTv0_n16_N7ee451623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee451623barEv,_ZThn20_N7ee451623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45162 = {  "ee45162", // class name
  bases_ee45162, 4,
  &(vtc_ee45162[0]), // expected_vtbl_contents
  &(vtt_ee45162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45162),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1020,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55162  : virtual dd5162 {
  int e;
  virtual void  bar(); // _ZN7ee551623barEv
  ~ee55162(); // tgen
  ee55162(); // tgen
};
//SIG(1 ee55162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi} v1 Fi}


void  ee55162 ::bar(){vfunc_called(this, "_ZN7ee551623barEv");}
ee55162 ::~ee55162(){ note_dtor("ee55162", this);} // tgen
ee55162 ::ee55162(){ note_ctor("ee55162", this);} // tgen

static void Test_ee55162()
{
  extern Class_Descriptor cd_ee55162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55162, buf);
    ee55162 *dp, &lv = *(dp=new (buf) ee55162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee55162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee55162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(32,16), "ee55162");
    check_base_class_offset(lv, (dd5162*), ABISELECT(16,8), "ee55162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55162.e");
    test_class_info(&lv, &cd_ee55162);
    dp->~ee55162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55162(Test_ee55162, "ee55162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55162C1Ev();
extern void _ZN7ee55162D1Ev();
Name_Map name_map_ee55162[] = {
  NSPAIR(_ZN7ee55162C1Ev),
  NSPAIR(_ZN7ee55162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee55162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55162[];
extern void _ZN7ee551623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee551623barEv,_ZTv0_n20_N7ee551623barEv)();
extern void ABISELECT(_ZThn16_N7ee551623barEv,_ZThn8_N7ee551623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee551623barEv,_ZTv0_n16_N7ee551623barEv)();
extern void ABISELECT(_ZThn48_N7ee551623barEv,_ZThn24_N7ee551623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55162[0]),
  (VTBL_ENTRY)&_ZN7ee551623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee551623barEv,_ZTv0_n20_N7ee551623barEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55162[0]),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee551623barEv,_ZTv0_n16_N7ee551623barEv),
};
extern VTBL_ENTRY _ZTV7ee55162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee55162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee55162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee55162[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee55162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee55162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee55162[] = {
  {&(_ZTV7ee55162[5]),  5,21},
  {&(_ZTV7ee55162[11]),  11,21},
  {&(_ZTV7ee55162[15]),  15,21},
  {&(_ZTV7ee55162[19]),  19,21},
  {&(_tg__ZTV6dd5162__7ee55162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee55162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee55162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee55162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee55162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55162[];
extern  VTBL_ENTRY _ZTV7ee55162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55162[];
static VTBL_ENTRY alt_thunk_names1021[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee551623barEv,_ZTv0_n16_N7ee551623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee551623barEv,_ZThn24_N7ee551623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee551623barEv,_ZTv0_n20_N7ee551623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee551623barEv,_ZThn8_N7ee551623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55162 = {  "ee55162", // class name
  bases_ee55162, 4,
  &(vtc_ee55162[0]), // expected_vtbl_contents
  &(vtt_ee55162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55162),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1021,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65162  : dd5162 {
  int e;
  virtual void  foo(); // _ZN7ee651623fooEv
  virtual void  bar(); // _ZN7ee651623barEv
  ~ee65162(); // tgen
  ee65162(); // tgen
};
//SIG(1 ee65162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee65162 ::foo(){vfunc_called(this, "_ZN7ee651623fooEv");}
void  ee65162 ::bar(){vfunc_called(this, "_ZN7ee651623barEv");}
ee65162 ::~ee65162(){ note_dtor("ee65162", this);} // tgen
ee65162 ::ee65162(){ note_ctor("ee65162", this);} // tgen

static void Test_ee65162()
{
  extern Class_Descriptor cd_ee65162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65162, buf);
    ee65162 *dp, &lv = *(dp=new (buf) ee65162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee65162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee65162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(16,12), "ee65162");
    check_base_class_offset(lv, (dd5162*), 0, "ee65162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65162.e");
    test_class_info(&lv, &cd_ee65162);
    dp->~ee65162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65162(Test_ee65162, "ee65162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65162C1Ev();
extern void _ZN7ee65162D1Ev();
Name_Map name_map_ee65162[] = {
  NSPAIR(_ZN7ee65162C1Ev),
  NSPAIR(_ZN7ee65162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee65162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65162[];
extern void _ZN7ee651623barEv();
extern void _ZN7ee651623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee651623fooEv,_ZTv0_n12_N7ee651623fooEv)();
extern void ABISELECT(_ZThn32_N7ee651623fooEv,_ZThn20_N7ee651623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee651623barEv,_ZTv0_n16_N7ee651623barEv)();
extern void ABISELECT(_ZThn32_N7ee651623barEv,_ZThn20_N7ee651623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65162[0]),
  (VTBL_ENTRY)&_ZN7ee651623barEv,
  (VTBL_ENTRY)&_ZN7ee651623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee651623fooEv,_ZTv0_n12_N7ee651623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee651623barEv,_ZTv0_n16_N7ee651623barEv),
};
extern VTBL_ENTRY _ZTV7ee65162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee65162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee65162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee65162[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee65162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee65162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee65162[] = {
  {&(_ZTV7ee65162[4]),  4,15},
  {&(_tg__ZTV6dd5162__7ee65162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee65162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee65162[4]),  4,6},
  {&(_ZTV7ee65162[9]),  9,15},
  {&(_ZTV7ee65162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee65162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee65162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65162[];
extern  VTBL_ENTRY _ZTV7ee65162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65162[];
static VTBL_ENTRY alt_thunk_names1022[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn20_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee651623barEv,_ZTv0_n16_N7ee651623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee651623barEv,_ZThn20_N7ee651623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee651623fooEv,_ZTv0_n12_N7ee651623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee651623fooEv,_ZThn20_N7ee651623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65162 = {  "ee65162", // class name
  bases_ee65162, 4,
  &(vtc_ee65162[0]), // expected_vtbl_contents
  &(vtt_ee65162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1022,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75162  : virtual dd5162 {
  int e;
  virtual void  foo(); // _ZN7ee751623fooEv
  virtual void  bar(); // _ZN7ee751623barEv
  ~ee75162(); // tgen
  ee75162(); // tgen
};
//SIG(1 ee75162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 Fi} v1 v2 Fi}


void  ee75162 ::foo(){vfunc_called(this, "_ZN7ee751623fooEv");}
void  ee75162 ::bar(){vfunc_called(this, "_ZN7ee751623barEv");}
ee75162 ::~ee75162(){ note_dtor("ee75162", this);} // tgen
ee75162 ::ee75162(){ note_ctor("ee75162", this);} // tgen

static void Test_ee75162()
{
  extern Class_Descriptor cd_ee75162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75162, buf);
    ee75162 *dp, &lv = *(dp=new (buf) ee75162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee75162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee75162");
    check_base_class_offset(lv, (cc162*)(dd5162*), ABISELECT(32,16), "ee75162");
    check_base_class_offset(lv, (dd5162*), ABISELECT(16,8), "ee75162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75162.e");
    test_class_info(&lv, &cd_ee75162);
    dp->~ee75162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75162(Test_ee75162, "ee75162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75162C1Ev();
extern void _ZN7ee75162D1Ev();
Name_Map name_map_ee75162[] = {
  NSPAIR(_ZN7ee75162C1Ev),
  NSPAIR(_ZN7ee75162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd5162;
extern VTBL_ENTRY _ZTI6dd5162[];
extern  VTBL_ENTRY _ZTV6dd5162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5162[];
static Base_Class bases_ee75162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5162,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75162[];
extern void _ZN7ee751623fooEv();
extern void _ZN7ee751623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee751623barEv,_ZTv0_n20_N7ee751623barEv)();
extern void ABISELECT(_ZThn16_N7ee751623barEv,_ZThn8_N7ee751623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee751623fooEv,_ZTv0_n12_N7ee751623fooEv)();
extern void ABISELECT(_ZThn48_N7ee751623fooEv,_ZThn24_N7ee751623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee751623barEv,_ZTv0_n16_N7ee751623barEv)();
extern void ABISELECT(_ZThn48_N7ee751623barEv,_ZThn24_N7ee751623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75162[0]),
  (VTBL_ENTRY)&_ZN7ee751623fooEv,
  (VTBL_ENTRY)&_ZN7ee751623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee751623barEv,_ZTv0_n20_N7ee751623barEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75162[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee751623fooEv,_ZTv0_n12_N7ee751623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee751623barEv,_ZTv0_n16_N7ee751623barEv),
};
extern VTBL_ENTRY _ZTV7ee75162[];
extern void _ZN6dd51623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5162__7ee75162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN6dd51623barEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd5162__7ee75162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv)();
extern void ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5162__7ee75162[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee75162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee75162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee75162[] = {
  {&(_ZTV7ee75162[5]),  5,22},
  {&(_ZTV7ee75162[12]),  12,22},
  {&(_ZTV7ee75162[16]),  16,22},
  {&(_ZTV7ee75162[20]),  20,22},
  {&(_tg__ZTV6dd5162__7ee75162[4]),  4,5},
  {&(_tg__ZTV5cc162__6dd5162__7ee75162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd5162__7ee75162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee75162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee75162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75162[];
extern  VTBL_ENTRY _ZTV7ee75162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75162[];
static VTBL_ENTRY alt_thunk_names1023[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd51623barEv,_ZTv0_n16_N6dd51623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd51623barEv,_ZThn16_N6dd51623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee751623barEv,_ZTv0_n16_N7ee751623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee751623barEv,_ZThn24_N7ee751623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee751623fooEv,_ZTv0_n12_N7ee751623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee751623fooEv,_ZThn24_N7ee751623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee751623barEv,_ZTv0_n20_N7ee751623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee751623barEv,_ZThn8_N7ee751623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75162 = {  "ee75162", // class name
  bases_ee75162, 4,
  &(vtc_ee75162[0]), // expected_vtbl_contents
  &(vtt_ee75162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75162),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1023,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6162  : cc162 {
  int d;
  virtual void  bar(); // _ZN6dd61623barEv
  virtual void  foo(); // _ZN6dd61623fooEv
  ~dd6162(); // tgen
  dd6162(); // tgen
};
//SIG(-1 dd6162) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd6162 ::bar(){vfunc_called(this, "_ZN6dd61623barEv");}
void  dd6162 ::foo(){vfunc_called(this, "_ZN6dd61623fooEv");}
dd6162 ::~dd6162(){ note_dtor("dd6162", this);} // tgen
dd6162 ::dd6162(){ note_ctor("dd6162", this);} // tgen

static void Test_dd6162()
{
  extern Class_Descriptor cd_dd6162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6162, buf);
    dd6162 *dp, &lv = *(dp=new (buf) dd6162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd6162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(16,12), "dd6162");
    check_base_class_offset(lv, (cc162*), 0, "dd6162");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6162.d");
    test_class_info(&lv, &cd_dd6162);
    dp->~dd6162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6162(Test_dd6162, "dd6162", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6162C1Ev();
extern void _ZN6dd6162D1Ev();
Name_Map name_map_dd6162[] = {
  NSPAIR(_ZN6dd6162C1Ev),
  NSPAIR(_ZN6dd6162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd6162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
extern VTBL_ENTRY _ZTV6dd6162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd6162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd6162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd6162[] = {
  {&(_ZTV6dd6162[3]),  3,11},
  {&(_tg__ZTV5cc162__6dd6162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd6162[4]),  4,6},
  {&(_ZTV6dd6162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static VTBL_ENTRY alt_thunk_names1024[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6162 = {  "dd6162", // class name
  bases_dd6162, 3,
  &(vtc_dd6162[0]), // expected_vtbl_contents
  &(vtt_dd6162[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6162),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1024,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06162  : dd6162 {
  int e;
  ~ee06162(); // tgen
  ee06162(); // tgen
};
//SIG(1 ee06162) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee06162 ::~ee06162(){ note_dtor("ee06162", this);} // tgen
ee06162 ::ee06162(){ note_ctor("ee06162", this);} // tgen

static void Test_ee06162()
{
  extern Class_Descriptor cd_ee06162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06162, buf);
    ee06162 *dp, &lv = *(dp=new (buf) ee06162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee06162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(24,16), "ee06162");
    check_base_class_offset(lv, (cc162*)(dd6162*), 0, "ee06162");
    check_base_class_offset(lv, (dd6162*), 0, "ee06162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06162.e");
    test_class_info(&lv, &cd_ee06162);
    dp->~ee06162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06162(Test_ee06162, "ee06162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06162C1Ev();
extern void _ZN7ee06162D1Ev();
Name_Map name_map_ee06162[] = {
  NSPAIR(_ZN7ee06162C1Ev),
  NSPAIR(_ZN7ee06162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee06162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
extern VTBL_ENTRY _ZTV7ee06162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee06162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee06162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee06162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee06162[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee06162[] = {
  {&(_ZTV7ee06162[3]),  3,11},
  {&(_tg__ZTV6dd6162__7ee06162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee06162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee06162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee06162[4]),  4,6},
  {&(_ZTV7ee06162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06162[];
extern  VTBL_ENTRY _ZTV7ee06162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06162[];
static VTBL_ENTRY alt_thunk_names1025[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06162 = {  "ee06162", // class name
  bases_ee06162, 4,
  &(vtc_ee06162[0]), // expected_vtbl_contents
  &(vtt_ee06162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1025,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16162  : virtual dd6162 {
  int e;
  ~ee16162(); // tgen
  ee16162(); // tgen
};
//SIG(1 ee16162) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee16162 ::~ee16162(){ note_dtor("ee16162", this);} // tgen
ee16162 ::ee16162(){ note_ctor("ee16162", this);} // tgen

static void Test_ee16162()
{
  extern Class_Descriptor cd_ee16162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16162, buf);
    ee16162 *dp, &lv = *(dp=new (buf) ee16162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee16162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(32,20), "ee16162");
    check_base_class_offset(lv, (cc162*)(dd6162*), ABISELECT(16,8), "ee16162");
    check_base_class_offset(lv, (dd6162*), ABISELECT(16,8), "ee16162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16162.e");
    test_class_info(&lv, &cd_ee16162);
    dp->~ee16162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16162(Test_ee16162, "ee16162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16162C1Ev();
extern void _ZN7ee16162D1Ev();
Name_Map name_map_ee16162[] = {
  NSPAIR(_ZN7ee16162C1Ev),
  NSPAIR(_ZN7ee16162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee16162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16162[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
extern VTBL_ENTRY _ZTV7ee16162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee16162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee16162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee16162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee16162[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee16162[] = {
  {&(_ZTV7ee16162[4]),  4,17},
  {&(_ZTV7ee16162[9]),  9,17},
  {&(_ZTV7ee16162[15]),  15,17},
  {&(_tg__ZTV6dd6162__7ee16162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee16162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee16162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee16162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16162[];
extern  VTBL_ENTRY _ZTV7ee16162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16162[];
static VTBL_ENTRY alt_thunk_names1026[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16162 = {  "ee16162", // class name
  bases_ee16162, 4,
  &(vtc_ee16162[0]), // expected_vtbl_contents
  &(vtt_ee16162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16162),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1026,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26162  : dd6162 {
  int e;
  virtual void  foo(); // _ZN7ee261623fooEv
  ~ee26162(); // tgen
  ee26162(); // tgen
};
//SIG(1 ee26162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee26162 ::foo(){vfunc_called(this, "_ZN7ee261623fooEv");}
ee26162 ::~ee26162(){ note_dtor("ee26162", this);} // tgen
ee26162 ::ee26162(){ note_ctor("ee26162", this);} // tgen

static void Test_ee26162()
{
  extern Class_Descriptor cd_ee26162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26162, buf);
    ee26162 *dp, &lv = *(dp=new (buf) ee26162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee26162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(24,16), "ee26162");
    check_base_class_offset(lv, (cc162*)(dd6162*), 0, "ee26162");
    check_base_class_offset(lv, (dd6162*), 0, "ee26162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26162.e");
    test_class_info(&lv, &cd_ee26162);
    dp->~ee26162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26162(Test_ee26162, "ee26162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26162C1Ev();
extern void _ZN7ee26162D1Ev();
Name_Map name_map_ee26162[] = {
  NSPAIR(_ZN7ee26162C1Ev),
  NSPAIR(_ZN7ee26162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee26162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26162[];
extern void _ZN6dd61623barEv();
extern void _ZN7ee261623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee261623fooEv,_ZTv0_n12_N7ee261623fooEv)();
extern void ABISELECT(_ZThn24_N7ee261623fooEv,_ZThn16_N7ee261623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN7ee261623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee261623fooEv,_ZTv0_n12_N7ee261623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
extern VTBL_ENTRY _ZTV7ee26162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee26162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee26162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee26162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee26162[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee26162[] = {
  {&(_ZTV7ee26162[3]),  3,11},
  {&(_tg__ZTV6dd6162__7ee26162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee26162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee26162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee26162[4]),  4,6},
  {&(_ZTV7ee26162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26162[];
extern  VTBL_ENTRY _ZTV7ee26162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26162[];
static VTBL_ENTRY alt_thunk_names1027[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee261623fooEv,_ZTv0_n12_N7ee261623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee261623fooEv,_ZThn16_N7ee261623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26162 = {  "ee26162", // class name
  bases_ee26162, 4,
  &(vtc_ee26162[0]), // expected_vtbl_contents
  &(vtt_ee26162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1027,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36162  : virtual dd6162 {
  int e;
  virtual void  foo(); // _ZN7ee361623fooEv
  ~ee36162(); // tgen
  ee36162(); // tgen
};
//SIG(1 ee36162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee36162 ::foo(){vfunc_called(this, "_ZN7ee361623fooEv");}
ee36162 ::~ee36162(){ note_dtor("ee36162", this);} // tgen
ee36162 ::ee36162(){ note_ctor("ee36162", this);} // tgen

static void Test_ee36162()
{
  extern Class_Descriptor cd_ee36162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36162, buf);
    ee36162 *dp, &lv = *(dp=new (buf) ee36162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee36162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(32,20), "ee36162");
    check_base_class_offset(lv, (cc162*)(dd6162*), ABISELECT(16,8), "ee36162");
    check_base_class_offset(lv, (dd6162*), ABISELECT(16,8), "ee36162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36162.e");
    test_class_info(&lv, &cd_ee36162);
    dp->~ee36162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36162(Test_ee36162, "ee36162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36162C1Ev();
extern void _ZN7ee36162D1Ev();
Name_Map name_map_ee36162[] = {
  NSPAIR(_ZN7ee36162C1Ev),
  NSPAIR(_ZN7ee36162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee36162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36162[];
extern void _ZN7ee361623fooEv();
extern void _ZN6dd61623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee361623fooEv,_ZTv0_n20_N7ee361623fooEv)();
extern void ABISELECT(_ZThn16_N7ee361623fooEv,_ZThn8_N7ee361623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee361623fooEv,_ZTv0_n12_N7ee361623fooEv)();
extern void ABISELECT(_ZThn32_N7ee361623fooEv,_ZThn20_N7ee361623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36162[0]),
  (VTBL_ENTRY)&_ZN7ee361623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee361623fooEv,_ZTv0_n20_N7ee361623fooEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee361623fooEv,_ZTv0_n12_N7ee361623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
extern VTBL_ENTRY _ZTV7ee36162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee36162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee36162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee36162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee36162[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee36162[] = {
  {&(_ZTV7ee36162[4]),  4,18},
  {&(_ZTV7ee36162[10]),  10,18},
  {&(_ZTV7ee36162[16]),  16,18},
  {&(_tg__ZTV6dd6162__7ee36162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee36162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee36162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee36162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36162[];
extern  VTBL_ENTRY _ZTV7ee36162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36162[];
static VTBL_ENTRY alt_thunk_names1028[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee361623fooEv,_ZTv0_n12_N7ee361623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee361623fooEv,_ZThn20_N7ee361623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee361623fooEv,_ZTv0_n20_N7ee361623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee361623fooEv,_ZThn8_N7ee361623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36162 = {  "ee36162", // class name
  bases_ee36162, 4,
  &(vtc_ee36162[0]), // expected_vtbl_contents
  &(vtt_ee36162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36162),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1028,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46162  : dd6162 {
  int e;
  virtual void  bar(); // _ZN7ee461623barEv
  ~ee46162(); // tgen
  ee46162(); // tgen
};
//SIG(1 ee46162) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee46162 ::bar(){vfunc_called(this, "_ZN7ee461623barEv");}
ee46162 ::~ee46162(){ note_dtor("ee46162", this);} // tgen
ee46162 ::ee46162(){ note_ctor("ee46162", this);} // tgen

static void Test_ee46162()
{
  extern Class_Descriptor cd_ee46162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46162, buf);
    ee46162 *dp, &lv = *(dp=new (buf) ee46162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee46162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(24,16), "ee46162");
    check_base_class_offset(lv, (cc162*)(dd6162*), 0, "ee46162");
    check_base_class_offset(lv, (dd6162*), 0, "ee46162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46162.e");
    test_class_info(&lv, &cd_ee46162);
    dp->~ee46162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46162(Test_ee46162, "ee46162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46162C1Ev();
extern void _ZN7ee46162D1Ev();
Name_Map name_map_ee46162[] = {
  NSPAIR(_ZN7ee46162C1Ev),
  NSPAIR(_ZN7ee46162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee46162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46162[];
extern void _ZN7ee461623barEv();
extern void _ZN6dd61623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee461623barEv,_ZTv0_n16_N7ee461623barEv)();
extern void ABISELECT(_ZThn24_N7ee461623barEv,_ZThn16_N7ee461623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46162[0]),
  (VTBL_ENTRY)&_ZN7ee461623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee461623barEv,_ZTv0_n16_N7ee461623barEv),
};
extern VTBL_ENTRY _ZTV7ee46162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee46162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee46162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee46162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee46162[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee46162[] = {
  {&(_ZTV7ee46162[3]),  3,11},
  {&(_tg__ZTV6dd6162__7ee46162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee46162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee46162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee46162[4]),  4,6},
  {&(_ZTV7ee46162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46162[];
extern  VTBL_ENTRY _ZTV7ee46162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46162[];
static VTBL_ENTRY alt_thunk_names1029[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee461623barEv,_ZTv0_n16_N7ee461623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee461623barEv,_ZThn16_N7ee461623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46162 = {  "ee46162", // class name
  bases_ee46162, 4,
  &(vtc_ee46162[0]), // expected_vtbl_contents
  &(vtt_ee46162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1029,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56162  : virtual dd6162 {
  int e;
  virtual void  bar(); // _ZN7ee561623barEv
  ~ee56162(); // tgen
  ee56162(); // tgen
};
//SIG(1 ee56162) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee56162 ::bar(){vfunc_called(this, "_ZN7ee561623barEv");}
ee56162 ::~ee56162(){ note_dtor("ee56162", this);} // tgen
ee56162 ::ee56162(){ note_ctor("ee56162", this);} // tgen

static void Test_ee56162()
{
  extern Class_Descriptor cd_ee56162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56162, buf);
    ee56162 *dp, &lv = *(dp=new (buf) ee56162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee56162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(32,20), "ee56162");
    check_base_class_offset(lv, (cc162*)(dd6162*), ABISELECT(16,8), "ee56162");
    check_base_class_offset(lv, (dd6162*), ABISELECT(16,8), "ee56162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56162.e");
    test_class_info(&lv, &cd_ee56162);
    dp->~ee56162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56162(Test_ee56162, "ee56162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56162C1Ev();
extern void _ZN7ee56162D1Ev();
Name_Map name_map_ee56162[] = {
  NSPAIR(_ZN7ee56162C1Ev),
  NSPAIR(_ZN7ee56162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee56162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56162[];
extern void _ZN7ee561623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee561623barEv,_ZTv0_n16_N7ee561623barEv)();
extern void ABISELECT(_ZThn16_N7ee561623barEv,_ZThn8_N7ee561623barEv)() __attribute__((weak));
extern void _ZN6dd61623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee561623barEv,_ZTv0_n16_N7ee561623barEv)();
extern void ABISELECT(_ZThn32_N7ee561623barEv,_ZThn20_N7ee561623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56162[0]),
  (VTBL_ENTRY)&_ZN7ee561623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee561623barEv,_ZTv0_n16_N7ee561623barEv),
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee561623barEv,_ZTv0_n16_N7ee561623barEv),
};
extern VTBL_ENTRY _ZTV7ee56162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee56162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee56162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee56162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee56162[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee56162[] = {
  {&(_ZTV7ee56162[4]),  4,18},
  {&(_ZTV7ee56162[10]),  10,18},
  {&(_ZTV7ee56162[16]),  16,18},
  {&(_tg__ZTV6dd6162__7ee56162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee56162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee56162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee56162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56162[];
extern  VTBL_ENTRY _ZTV7ee56162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56162[];
static VTBL_ENTRY alt_thunk_names1030[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee561623barEv,_ZTv0_n16_N7ee561623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee561623barEv,_ZThn20_N7ee561623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee561623barEv,_ZThn8_N7ee561623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56162 = {  "ee56162", // class name
  bases_ee56162, 4,
  &(vtc_ee56162[0]), // expected_vtbl_contents
  &(vtt_ee56162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56162),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1030,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66162  : dd6162 {
  int e;
  virtual void  foo(); // _ZN7ee661623fooEv
  virtual void  bar(); // _ZN7ee661623barEv
  ~ee66162(); // tgen
  ee66162(); // tgen
};
//SIG(1 ee66162) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66162 ::foo(){vfunc_called(this, "_ZN7ee661623fooEv");}
void  ee66162 ::bar(){vfunc_called(this, "_ZN7ee661623barEv");}
ee66162 ::~ee66162(){ note_dtor("ee66162", this);} // tgen
ee66162 ::ee66162(){ note_ctor("ee66162", this);} // tgen

static void Test_ee66162()
{
  extern Class_Descriptor cd_ee66162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66162, buf);
    ee66162 *dp, &lv = *(dp=new (buf) ee66162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee66162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(24,16), "ee66162");
    check_base_class_offset(lv, (cc162*)(dd6162*), 0, "ee66162");
    check_base_class_offset(lv, (dd6162*), 0, "ee66162");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66162.e");
    test_class_info(&lv, &cd_ee66162);
    dp->~ee66162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66162(Test_ee66162, "ee66162", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66162C1Ev();
extern void _ZN7ee66162D1Ev();
Name_Map name_map_ee66162[] = {
  NSPAIR(_ZN7ee66162C1Ev),
  NSPAIR(_ZN7ee66162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee66162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66162[];
extern void _ZN7ee661623barEv();
extern void _ZN7ee661623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee661623fooEv,_ZTv0_n12_N7ee661623fooEv)();
extern void ABISELECT(_ZThn24_N7ee661623fooEv,_ZThn16_N7ee661623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee661623barEv,_ZTv0_n16_N7ee661623barEv)();
extern void ABISELECT(_ZThn24_N7ee661623barEv,_ZThn16_N7ee661623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66162[0]),
  (VTBL_ENTRY)&_ZN7ee661623barEv,
  (VTBL_ENTRY)&_ZN7ee661623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee661623fooEv,_ZTv0_n12_N7ee661623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee661623barEv,_ZTv0_n16_N7ee661623barEv),
};
extern VTBL_ENTRY _ZTV7ee66162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee66162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee66162[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee66162[] = {
  0,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee66162[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee66162[] = {
  {&(_ZTV7ee66162[3]),  3,11},
  {&(_tg__ZTV6dd6162__7ee66162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee66162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee66162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee66162[4]),  4,6},
  {&(_ZTV7ee66162[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66162[];
extern  VTBL_ENTRY _ZTV7ee66162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66162[];
static VTBL_ENTRY alt_thunk_names1031[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623barEv,_ZThn16_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd61623fooEv,_ZThn16_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee661623barEv,_ZTv0_n16_N7ee661623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee661623barEv,_ZThn16_N7ee661623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee661623fooEv,_ZTv0_n12_N7ee661623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee661623fooEv,_ZThn16_N7ee661623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66162 = {  "ee66162", // class name
  bases_ee66162, 4,
  &(vtc_ee66162[0]), // expected_vtbl_contents
  &(vtt_ee66162[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66162),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66162),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1031,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76162  : virtual dd6162 {
  int e;
  virtual void  foo(); // _ZN7ee761623fooEv
  virtual void  bar(); // _ZN7ee761623barEv
  ~ee76162(); // tgen
  ee76162(); // tgen
};
//SIG(1 ee76162) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76162 ::foo(){vfunc_called(this, "_ZN7ee761623fooEv");}
void  ee76162 ::bar(){vfunc_called(this, "_ZN7ee761623barEv");}
ee76162 ::~ee76162(){ note_dtor("ee76162", this);} // tgen
ee76162 ::ee76162(){ note_ctor("ee76162", this);} // tgen

static void Test_ee76162()
{
  extern Class_Descriptor cd_ee76162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76162, buf);
    ee76162 *dp, &lv = *(dp=new (buf) ee76162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee76162");
    check_base_class_offset(lv, (bb62*)(cc162*)(dd6162*), ABISELECT(32,20), "ee76162");
    check_base_class_offset(lv, (cc162*)(dd6162*), ABISELECT(16,8), "ee76162");
    check_base_class_offset(lv, (dd6162*), ABISELECT(16,8), "ee76162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76162.e");
    test_class_info(&lv, &cd_ee76162);
    dp->~ee76162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76162(Test_ee76162, "ee76162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76162C1Ev();
extern void _ZN7ee76162D1Ev();
Name_Map name_map_ee76162[] = {
  NSPAIR(_ZN7ee76162C1Ev),
  NSPAIR(_ZN7ee76162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd6162;
extern VTBL_ENTRY _ZTI6dd6162[];
extern  VTBL_ENTRY _ZTV6dd6162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6162[];
static Base_Class bases_ee76162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76162[];
extern void _ZN7ee761623fooEv();
extern void _ZN7ee761623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee761623barEv,_ZTv0_n16_N7ee761623barEv)();
extern void ABISELECT(_ZThn16_N7ee761623barEv,_ZThn8_N7ee761623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee761623fooEv,_ZTv0_n20_N7ee761623fooEv)();
extern void ABISELECT(_ZThn16_N7ee761623fooEv,_ZThn8_N7ee761623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee761623fooEv,_ZTv0_n12_N7ee761623fooEv)();
extern void ABISELECT(_ZThn32_N7ee761623fooEv,_ZThn20_N7ee761623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee761623barEv,_ZTv0_n16_N7ee761623barEv)();
extern void ABISELECT(_ZThn32_N7ee761623barEv,_ZThn20_N7ee761623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76162[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76162[0]),
  (VTBL_ENTRY)&_ZN7ee761623fooEv,
  (VTBL_ENTRY)&_ZN7ee761623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee761623barEv,_ZTv0_n16_N7ee761623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee761623fooEv,_ZTv0_n20_N7ee761623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee761623fooEv,_ZTv0_n12_N7ee761623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee761623barEv,_ZTv0_n16_N7ee761623barEv),
};
extern VTBL_ENTRY _ZTV7ee76162[];
extern void _ZN6dd61623barEv();
extern void _ZN6dd61623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6162__7ee76162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&_ZN6dd61623barEv,
  (VTBL_ENTRY)&_ZN6dd61623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc1626dd6162__7ee76162[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc1626dd6162__7ee76162[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv)();
extern void ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv)();
extern void ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6162__7ee76162[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv),
};
static  VTT_ENTRY vtt_ee76162[] = {
  {&(_ZTV7ee76162[4]),  4,19},
  {&(_ZTV7ee76162[11]),  11,19},
  {&(_ZTV7ee76162[17]),  17,19},
  {&(_tg__ZTV6dd6162__7ee76162[3]),  3,5},
  {&(_tg__ZTV5cc1626dd6162__7ee76162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc1626dd6162__7ee76162[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6162__7ee76162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76162[];
extern  VTBL_ENTRY _ZTV7ee76162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76162[];
static VTBL_ENTRY alt_thunk_names1032[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd61623barEv,_ZTv0_n16_N6dd61623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623barEv,_ZThn12_N6dd61623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd61623fooEv,_ZTv0_n12_N6dd61623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd61623fooEv,_ZThn12_N6dd61623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee761623fooEv,_ZTv0_n12_N7ee761623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee761623fooEv,_ZThn20_N7ee761623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee761623fooEv,_ZTv0_n20_N7ee761623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee761623fooEv,_ZThn8_N7ee761623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee761623barEv,_ZTv0_n16_N7ee761623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee761623barEv,_ZThn20_N7ee761623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee761623barEv,_ZThn8_N7ee761623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76162 = {  "ee76162", // class name
  bases_ee76162, 4,
  &(vtc_ee76162[0]), // expected_vtbl_contents
  &(vtt_ee76162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76162),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76162),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1032,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7162  : virtual cc162 {
  int d;
  virtual void  bar(); // _ZN6dd71623barEv
  virtual void  foo(); // _ZN6dd71623fooEv
  ~dd7162(); // tgen
  dd7162(); // tgen
};
//SIG(-1 dd7162) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  dd7162 ::bar(){vfunc_called(this, "_ZN6dd71623barEv");}
void  dd7162 ::foo(){vfunc_called(this, "_ZN6dd71623fooEv");}
dd7162 ::~dd7162(){ note_dtor("dd7162", this);} // tgen
dd7162 ::dd7162(){ note_ctor("dd7162", this);} // tgen

static void Test_dd7162()
{
  extern Class_Descriptor cd_dd7162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7162, buf);
    dd7162 *dp, &lv = *(dp=new (buf) dd7162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd7162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,16), "dd7162");
    check_base_class_offset(lv, (cc162*), ABISELECT(16,8), "dd7162");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7162.d");
    test_class_info(&lv, &cd_dd7162);
    dp->~dd7162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7162(Test_dd7162, "dd7162", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7162C1Ev();
extern void _ZN6dd7162D1Ev();
Name_Map name_map_dd7162[] = {
  NSPAIR(_ZN6dd7162C1Ev),
  NSPAIR(_ZN6dd7162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
static Base_Class bases_dd7162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc162,    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
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
extern VTBL_ENTRY _ZTV6dd7162[];
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__6dd7162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd7162[] = {
  {&(_ZTV6dd7162[4]),  4,15},
  {&(_ZTV6dd7162[9]),  9,15},
  {&(_ZTV6dd7162[13]),  13,15},
  {&(_tg__ZTV5cc162__6dd7162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__6dd7162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static VTBL_ENTRY alt_thunk_names1033[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7162 = {  "dd7162", // class name
  bases_dd7162, 3,
  &(vtc_dd7162[0]), // expected_vtbl_contents
  &(vtt_dd7162[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7162),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1033,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07162  : dd7162 {
  int e;
  ~ee07162(); // tgen
  ee07162(); // tgen
};
//SIG(1 ee07162) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee07162 ::~ee07162(){ note_dtor("ee07162", this);} // tgen
ee07162 ::ee07162(){ note_ctor("ee07162", this);} // tgen

static void Test_ee07162()
{
  extern Class_Descriptor cd_ee07162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07162, buf);
    ee07162 *dp, &lv = *(dp=new (buf) ee07162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee07162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee07162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(16,12), "ee07162");
    check_base_class_offset(lv, (dd7162*), 0, "ee07162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07162.e");
    test_class_info(&lv, &cd_ee07162);
    dp->~ee07162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07162(Test_ee07162, "ee07162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07162C1Ev();
extern void _ZN7ee07162D1Ev();
Name_Map name_map_ee07162[] = {
  NSPAIR(_ZN7ee07162C1Ev),
  NSPAIR(_ZN7ee07162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee07162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
extern VTBL_ENTRY _ZTV7ee07162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee07162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee07162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee07162[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee07162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee07162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee07162[] = {
  {&(_ZTV7ee07162[4]),  4,15},
  {&(_tg__ZTV6dd7162__7ee07162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee07162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee07162[4]),  4,6},
  {&(_ZTV7ee07162[9]),  9,15},
  {&(_ZTV7ee07162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee07162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee07162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07162[];
extern  VTBL_ENTRY _ZTV7ee07162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07162[];
static VTBL_ENTRY alt_thunk_names1034[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07162 = {  "ee07162", // class name
  bases_ee07162, 4,
  &(vtc_ee07162[0]), // expected_vtbl_contents
  &(vtt_ee07162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1034,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17162  : virtual dd7162 {
  int e;
  ~ee17162(); // tgen
  ee17162(); // tgen
};
//SIG(1 ee17162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} Fi}


ee17162 ::~ee17162(){ note_dtor("ee17162", this);} // tgen
ee17162 ::ee17162(){ note_ctor("ee17162", this);} // tgen

static void Test_ee17162()
{
  extern Class_Descriptor cd_ee17162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17162, buf);
    ee17162 *dp, &lv = *(dp=new (buf) ee17162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee17162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee17162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(32,16), "ee17162");
    check_base_class_offset(lv, (dd7162*), ABISELECT(16,8), "ee17162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17162.e");
    test_class_info(&lv, &cd_ee17162);
    dp->~ee17162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17162(Test_ee17162, "ee17162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17162C1Ev();
extern void _ZN7ee17162D1Ev();
Name_Map name_map_ee17162[] = {
  NSPAIR(_ZN7ee17162C1Ev),
  NSPAIR(_ZN7ee17162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee17162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17162[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17162[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
extern VTBL_ENTRY _ZTV7ee17162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee17162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee17162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee17162[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee17162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee17162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee17162[] = {
  {&(_ZTV7ee17162[5]),  5,22},
  {&(_ZTV7ee17162[11]),  11,22},
  {&(_ZTV7ee17162[16]),  16,22},
  {&(_ZTV7ee17162[20]),  20,22},
  {&(_tg__ZTV6dd7162__7ee17162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee17162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee17162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee17162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee17162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17162[];
extern  VTBL_ENTRY _ZTV7ee17162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17162[];
static VTBL_ENTRY alt_thunk_names1035[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17162 = {  "ee17162", // class name
  bases_ee17162, 4,
  &(vtc_ee17162[0]), // expected_vtbl_contents
  &(vtt_ee17162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17162),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1035,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27162  : dd7162 {
  int e;
  virtual void  foo(); // _ZN7ee271623fooEv
  ~ee27162(); // tgen
  ee27162(); // tgen
};
//SIG(1 ee27162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee27162 ::foo(){vfunc_called(this, "_ZN7ee271623fooEv");}
ee27162 ::~ee27162(){ note_dtor("ee27162", this);} // tgen
ee27162 ::ee27162(){ note_ctor("ee27162", this);} // tgen

static void Test_ee27162()
{
  extern Class_Descriptor cd_ee27162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27162, buf);
    ee27162 *dp, &lv = *(dp=new (buf) ee27162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee27162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee27162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(16,12), "ee27162");
    check_base_class_offset(lv, (dd7162*), 0, "ee27162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27162.e");
    test_class_info(&lv, &cd_ee27162);
    dp->~ee27162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27162(Test_ee27162, "ee27162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27162C1Ev();
extern void _ZN7ee27162D1Ev();
Name_Map name_map_ee27162[] = {
  NSPAIR(_ZN7ee27162C1Ev),
  NSPAIR(_ZN7ee27162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee27162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27162[];
extern void _ZN6dd71623barEv();
extern void _ZN7ee271623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee271623fooEv,_ZTv0_n12_N7ee271623fooEv)();
extern void ABISELECT(_ZThn32_N7ee271623fooEv,_ZThn20_N7ee271623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN7ee271623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee271623fooEv,_ZTv0_n12_N7ee271623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
extern VTBL_ENTRY _ZTV7ee27162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee27162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee27162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee27162[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee27162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee27162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee27162[] = {
  {&(_ZTV7ee27162[4]),  4,15},
  {&(_tg__ZTV6dd7162__7ee27162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee27162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee27162[4]),  4,6},
  {&(_ZTV7ee27162[9]),  9,15},
  {&(_ZTV7ee27162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee27162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee27162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27162[];
extern  VTBL_ENTRY _ZTV7ee27162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27162[];
static VTBL_ENTRY alt_thunk_names1036[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee271623fooEv,_ZTv0_n12_N7ee271623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee271623fooEv,_ZThn20_N7ee271623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27162 = {  "ee27162", // class name
  bases_ee27162, 4,
  &(vtc_ee27162[0]), // expected_vtbl_contents
  &(vtt_ee27162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1036,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37162  : virtual dd7162 {
  int e;
  virtual void  foo(); // _ZN7ee371623fooEv
  ~ee37162(); // tgen
  ee37162(); // tgen
};
//SIG(1 ee37162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 Fi}


void  ee37162 ::foo(){vfunc_called(this, "_ZN7ee371623fooEv");}
ee37162 ::~ee37162(){ note_dtor("ee37162", this);} // tgen
ee37162 ::ee37162(){ note_ctor("ee37162", this);} // tgen

static void Test_ee37162()
{
  extern Class_Descriptor cd_ee37162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37162, buf);
    ee37162 *dp, &lv = *(dp=new (buf) ee37162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee37162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee37162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(32,16), "ee37162");
    check_base_class_offset(lv, (dd7162*), ABISELECT(16,8), "ee37162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37162.e");
    test_class_info(&lv, &cd_ee37162);
    dp->~ee37162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37162(Test_ee37162, "ee37162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37162C1Ev();
extern void _ZN7ee37162D1Ev();
Name_Map name_map_ee37162[] = {
  NSPAIR(_ZN7ee37162C1Ev),
  NSPAIR(_ZN7ee37162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee37162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37162[];
extern void _ZN7ee371623fooEv();
extern void _ZN6dd71623barEv();
extern void ABISELECT(_ZTv0_n48_N7ee371623fooEv,_ZTv0_n24_N7ee371623fooEv)();
extern void ABISELECT(_ZThn16_N7ee371623fooEv,_ZThn8_N7ee371623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee371623fooEv,_ZTv0_n12_N7ee371623fooEv)();
extern void ABISELECT(_ZThn48_N7ee371623fooEv,_ZThn24_N7ee371623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37162[0]),
  (VTBL_ENTRY)&_ZN7ee371623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee371623fooEv,_ZTv0_n24_N7ee371623fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37162[0]),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee371623fooEv,_ZTv0_n12_N7ee371623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
extern VTBL_ENTRY _ZTV7ee37162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee37162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee37162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee37162[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee37162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee37162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee37162[] = {
  {&(_ZTV7ee37162[5]),  5,23},
  {&(_ZTV7ee37162[12]),  12,23},
  {&(_ZTV7ee37162[17]),  17,23},
  {&(_ZTV7ee37162[21]),  21,23},
  {&(_tg__ZTV6dd7162__7ee37162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee37162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee37162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee37162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee37162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37162[];
extern  VTBL_ENTRY _ZTV7ee37162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37162[];
static VTBL_ENTRY alt_thunk_names1037[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee371623fooEv,_ZTv0_n12_N7ee371623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee371623fooEv,_ZThn24_N7ee371623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee371623fooEv,_ZTv0_n24_N7ee371623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee371623fooEv,_ZThn8_N7ee371623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37162 = {  "ee37162", // class name
  bases_ee37162, 4,
  &(vtc_ee37162[0]), // expected_vtbl_contents
  &(vtt_ee37162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37162),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1037,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47162  : dd7162 {
  int e;
  virtual void  bar(); // _ZN7ee471623barEv
  ~ee47162(); // tgen
  ee47162(); // tgen
};
//SIG(1 ee47162) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee47162 ::bar(){vfunc_called(this, "_ZN7ee471623barEv");}
ee47162 ::~ee47162(){ note_dtor("ee47162", this);} // tgen
ee47162 ::ee47162(){ note_ctor("ee47162", this);} // tgen

static void Test_ee47162()
{
  extern Class_Descriptor cd_ee47162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47162, buf);
    ee47162 *dp, &lv = *(dp=new (buf) ee47162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee47162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee47162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(16,12), "ee47162");
    check_base_class_offset(lv, (dd7162*), 0, "ee47162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47162.e");
    test_class_info(&lv, &cd_ee47162);
    dp->~ee47162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47162(Test_ee47162, "ee47162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47162C1Ev();
extern void _ZN7ee47162D1Ev();
Name_Map name_map_ee47162[] = {
  NSPAIR(_ZN7ee47162C1Ev),
  NSPAIR(_ZN7ee47162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee47162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47162[];
extern void _ZN7ee471623barEv();
extern void _ZN6dd71623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee471623barEv,_ZTv0_n16_N7ee471623barEv)();
extern void ABISELECT(_ZThn32_N7ee471623barEv,_ZThn20_N7ee471623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47162[0]),
  (VTBL_ENTRY)&_ZN7ee471623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee471623barEv,_ZTv0_n16_N7ee471623barEv),
};
extern VTBL_ENTRY _ZTV7ee47162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee47162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee47162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee47162[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee47162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee47162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee47162[] = {
  {&(_ZTV7ee47162[4]),  4,15},
  {&(_tg__ZTV6dd7162__7ee47162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee47162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee47162[4]),  4,6},
  {&(_ZTV7ee47162[9]),  9,15},
  {&(_ZTV7ee47162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee47162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee47162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47162[];
extern  VTBL_ENTRY _ZTV7ee47162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47162[];
static VTBL_ENTRY alt_thunk_names1038[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee471623barEv,_ZTv0_n16_N7ee471623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee471623barEv,_ZThn20_N7ee471623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47162 = {  "ee47162", // class name
  bases_ee47162, 4,
  &(vtc_ee47162[0]), // expected_vtbl_contents
  &(vtt_ee47162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1038,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57162  : virtual dd7162 {
  int e;
  virtual void  bar(); // _ZN7ee571623barEv
  ~ee57162(); // tgen
  ee57162(); // tgen
};
//SIG(1 ee57162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi} v1 Fi}


void  ee57162 ::bar(){vfunc_called(this, "_ZN7ee571623barEv");}
ee57162 ::~ee57162(){ note_dtor("ee57162", this);} // tgen
ee57162 ::ee57162(){ note_ctor("ee57162", this);} // tgen

static void Test_ee57162()
{
  extern Class_Descriptor cd_ee57162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57162, buf);
    ee57162 *dp, &lv = *(dp=new (buf) ee57162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee57162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee57162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(32,16), "ee57162");
    check_base_class_offset(lv, (dd7162*), ABISELECT(16,8), "ee57162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57162.e");
    test_class_info(&lv, &cd_ee57162);
    dp->~ee57162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57162(Test_ee57162, "ee57162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57162C1Ev();
extern void _ZN7ee57162D1Ev();
Name_Map name_map_ee57162[] = {
  NSPAIR(_ZN7ee57162C1Ev),
  NSPAIR(_ZN7ee57162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee57162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc162,    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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57162[];
extern void _ZN7ee571623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee571623barEv,_ZTv0_n20_N7ee571623barEv)();
extern void ABISELECT(_ZThn16_N7ee571623barEv,_ZThn8_N7ee571623barEv)() __attribute__((weak));
extern void _ZN6dd71623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee571623barEv,_ZTv0_n16_N7ee571623barEv)();
extern void ABISELECT(_ZThn48_N7ee571623barEv,_ZThn24_N7ee571623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57162[0]),
  (VTBL_ENTRY)&_ZN7ee571623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee571623barEv,_ZTv0_n20_N7ee571623barEv),
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57162[0]),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee571623barEv,_ZTv0_n16_N7ee571623barEv),
};
extern VTBL_ENTRY _ZTV7ee57162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee57162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee57162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee57162[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee57162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee57162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee57162[] = {
  {&(_ZTV7ee57162[5]),  5,23},
  {&(_ZTV7ee57162[12]),  12,23},
  {&(_ZTV7ee57162[17]),  17,23},
  {&(_ZTV7ee57162[21]),  21,23},
  {&(_tg__ZTV6dd7162__7ee57162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee57162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee57162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee57162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee57162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57162[];
extern  VTBL_ENTRY _ZTV7ee57162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57162[];
static VTBL_ENTRY alt_thunk_names1039[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee571623barEv,_ZTv0_n16_N7ee571623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee571623barEv,_ZThn24_N7ee571623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee571623barEv,_ZTv0_n20_N7ee571623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee571623barEv,_ZThn8_N7ee571623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57162 = {  "ee57162", // class name
  bases_ee57162, 4,
  &(vtc_ee57162[0]), // expected_vtbl_contents
  &(vtt_ee57162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57162),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1039,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67162  : dd7162 {
  int e;
  virtual void  foo(); // _ZN7ee671623fooEv
  virtual void  bar(); // _ZN7ee671623barEv
  ~ee67162(); // tgen
  ee67162(); // tgen
};
//SIG(1 ee67162) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67162 ::foo(){vfunc_called(this, "_ZN7ee671623fooEv");}
void  ee67162 ::bar(){vfunc_called(this, "_ZN7ee671623barEv");}
ee67162 ::~ee67162(){ note_dtor("ee67162", this);} // tgen
ee67162 ::ee67162(){ note_ctor("ee67162", this);} // tgen

static void Test_ee67162()
{
  extern Class_Descriptor cd_ee67162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67162, buf);
    ee67162 *dp, &lv = *(dp=new (buf) ee67162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee67162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(32,20), "ee67162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(16,12), "ee67162");
    check_base_class_offset(lv, (dd7162*), 0, "ee67162");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67162.e");
    test_class_info(&lv, &cd_ee67162);
    dp->~ee67162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67162(Test_ee67162, "ee67162", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67162C1Ev();
extern void _ZN7ee67162D1Ev();
Name_Map name_map_ee67162[] = {
  NSPAIR(_ZN7ee67162C1Ev),
  NSPAIR(_ZN7ee67162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee67162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc162,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67162[];
extern void _ZN7ee671623barEv();
extern void _ZN7ee671623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee671623fooEv,_ZTv0_n12_N7ee671623fooEv)();
extern void ABISELECT(_ZThn32_N7ee671623fooEv,_ZThn20_N7ee671623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee671623barEv,_ZTv0_n16_N7ee671623barEv)();
extern void ABISELECT(_ZThn32_N7ee671623barEv,_ZThn20_N7ee671623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67162[0]),
  (VTBL_ENTRY)&_ZN7ee671623barEv,
  (VTBL_ENTRY)&_ZN7ee671623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67162[0]),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee671623fooEv,_ZTv0_n12_N7ee671623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee671623barEv,_ZTv0_n16_N7ee671623barEv),
};
extern VTBL_ENTRY _ZTV7ee67162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee67162[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee67162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee67162[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee67162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee67162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee67162[] = {
  {&(_ZTV7ee67162[4]),  4,15},
  {&(_tg__ZTV6dd7162__7ee67162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee67162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee67162[4]),  4,6},
  {&(_ZTV7ee67162[9]),  9,15},
  {&(_ZTV7ee67162[13]),  13,15},
  {&(_tg__ZTV5cc162__7ee67162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee67162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67162[];
extern  VTBL_ENTRY _ZTV7ee67162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67162[];
static VTBL_ENTRY alt_thunk_names1040[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn20_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn20_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee671623barEv,_ZTv0_n16_N7ee671623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee671623barEv,_ZThn20_N7ee671623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee671623fooEv,_ZTv0_n12_N7ee671623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee671623fooEv,_ZThn20_N7ee671623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67162 = {  "ee67162", // class name
  bases_ee67162, 4,
  &(vtc_ee67162[0]), // expected_vtbl_contents
  &(vtt_ee67162[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67162),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67162),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67162),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1040,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77162  : virtual dd7162 {
  int e;
  virtual void  foo(); // _ZN7ee771623fooEv
  virtual void  bar(); // _ZN7ee771623barEv
  ~ee77162(); // tgen
  ee77162(); // tgen
};
//SIG(1 ee77162) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77162 ::foo(){vfunc_called(this, "_ZN7ee771623fooEv");}
void  ee77162 ::bar(){vfunc_called(this, "_ZN7ee771623barEv");}
ee77162 ::~ee77162(){ note_dtor("ee77162", this);} // tgen
ee77162 ::ee77162(){ note_ctor("ee77162", this);} // tgen

static void Test_ee77162()
{
  extern Class_Descriptor cd_ee77162;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77162, buf);
    ee77162 *dp, &lv = *(dp=new (buf) ee77162());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77162)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77162)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee77162");
    check_base_class_offset(lv, (bb62*)(cc162*), ABISELECT(48,24), "ee77162");
    check_base_class_offset(lv, (cc162*)(dd7162*), ABISELECT(32,16), "ee77162");
    check_base_class_offset(lv, (dd7162*), ABISELECT(16,8), "ee77162");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77162.e");
    test_class_info(&lv, &cd_ee77162);
    dp->~ee77162();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77162(Test_ee77162, "ee77162", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77162C1Ev();
extern void _ZN7ee77162D1Ev();
Name_Map name_map_ee77162[] = {
  NSPAIR(_ZN7ee77162C1Ev),
  NSPAIR(_ZN7ee77162D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc162;
extern VTBL_ENTRY _ZTI5cc162[];
extern  VTBL_ENTRY _ZTV5cc162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc162[];
extern Class_Descriptor cd_dd7162;
extern VTBL_ENTRY _ZTI6dd7162[];
extern  VTBL_ENTRY _ZTV6dd7162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7162[];
static Base_Class bases_ee77162[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc162,    ABISELECT(32,16), //bcp->offset
    15, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7162,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77162[];
extern void _ZN7ee771623fooEv();
extern void _ZN7ee771623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee771623barEv,_ZTv0_n20_N7ee771623barEv)();
extern void ABISELECT(_ZThn16_N7ee771623barEv,_ZThn8_N7ee771623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee771623fooEv,_ZTv0_n24_N7ee771623fooEv)();
extern void ABISELECT(_ZThn16_N7ee771623fooEv,_ZThn8_N7ee771623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee771623fooEv,_ZTv0_n12_N7ee771623fooEv)();
extern void ABISELECT(_ZThn48_N7ee771623fooEv,_ZThn24_N7ee771623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee771623barEv,_ZTv0_n16_N7ee771623barEv)();
extern void ABISELECT(_ZThn48_N7ee771623barEv,_ZThn24_N7ee771623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77162[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77162[0]),
  (VTBL_ENTRY)&_ZN7ee771623fooEv,
  (VTBL_ENTRY)&_ZN7ee771623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee771623barEv,_ZTv0_n20_N7ee771623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee771623fooEv,_ZTv0_n24_N7ee771623fooEv),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77162[0]),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee771623fooEv,_ZTv0_n12_N7ee771623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee771623barEv,_ZTv0_n16_N7ee771623barEv),
};
extern VTBL_ENTRY _ZTV7ee77162[];
extern void _ZN6dd71623barEv();
extern void _ZN6dd71623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7162__7ee77162[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&_ZN6dd71623barEv,
  (VTBL_ENTRY)&_ZN6dd71623fooEv,
};
static  VTBL_ENTRY _tg__ZTV5cc162__6dd7162__7ee77162[] = {
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
};
extern void ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv)();
extern void ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv)();
extern void ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7162__7ee77162[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7162[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv),
};
static  VTBL_ENTRY _tg__ZTV5cc162__7ee77162[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc162__7ee77162[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc162[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee77162[] = {
  {&(_ZTV7ee77162[5]),  5,24},
  {&(_ZTV7ee77162[13]),  13,24},
  {&(_ZTV7ee77162[18]),  18,24},
  {&(_ZTV7ee77162[22]),  22,24},
  {&(_tg__ZTV6dd7162__7ee77162[4]),  4,6},
  {&(_tg__ZTV5cc162__6dd7162__7ee77162[3]),  3,3},
  {&(_tg__ZTV4bb62__6dd7162__7ee77162[4]),  4,6},
  {&(_tg__ZTV5cc162__7ee77162[3]),  3,3},
  {&(_tg__ZTV4bb62__5cc162__7ee77162[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77162[];
extern  VTBL_ENTRY _ZTV7ee77162[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77162[];
static VTBL_ENTRY alt_thunk_names1041[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd71623barEv,_ZTv0_n16_N6dd71623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623barEv,_ZThn16_N6dd71623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd71623fooEv,_ZTv0_n12_N6dd71623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd71623fooEv,_ZThn16_N6dd71623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee771623barEv,_ZTv0_n16_N7ee771623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee771623barEv,_ZThn24_N7ee771623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee771623fooEv,_ZTv0_n12_N7ee771623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee771623fooEv,_ZThn24_N7ee771623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee771623fooEv,_ZTv0_n24_N7ee771623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee771623fooEv,_ZThn8_N7ee771623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee771623barEv,_ZTv0_n20_N7ee771623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee771623barEv,_ZThn8_N7ee771623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77162 = {  "ee77162", // class name
  bases_ee77162, 4,
  &(vtc_ee77162[0]), // expected_vtbl_contents
  &(vtt_ee77162[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77162),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77162),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77162),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1041,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc262  : bb62 {
  int c;
  virtual void  foo(); // _ZN5cc2623fooEv
  ~cc262(); // tgen
  cc262(); // tgen
};
//SIG(-1 cc262) C1{ BC2{ BC3{ v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  cc262 ::foo(){vfunc_called(this, "_ZN5cc2623fooEv");}
cc262 ::~cc262(){ note_dtor("cc262", this);} // tgen
cc262 ::cc262(){ note_ctor("cc262", this);} // tgen

static void Test_cc262()
{
  extern Class_Descriptor cd_cc262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc262, buf);
    cc262 *dp, &lv = *(dp=new (buf) cc262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc262)");
    check_base_class_offset(lv, (aa2*)(bb62*), 0, "cc262");
    check_base_class_offset(lv, (bb62*), 0, "cc262");
    check_field_offset(lv, c, ABISELECT(16,12), "cc262.c");
    test_class_info(&lv, &cd_cc262);
    dp->~cc262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc262(Test_cc262, "cc262", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc262C1Ev();
extern void _ZN5cc262D1Ev();
Name_Map name_map_cc262[] = {
  NSPAIR(_ZN5cc262C1Ev),
  NSPAIR(_ZN5cc262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI5cc262[];
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_cc262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
Class_Descriptor cd_cc262 = {  "cc262", // class name
  bases_cc262, 2,
  &(vtc_cc262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc262),4, //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  dd0262  : cc262 {
  int d;
  ~dd0262(); // tgen
  dd0262(); // tgen
};
//SIG(-1 dd0262) C1{ BC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


dd0262 ::~dd0262(){ note_dtor("dd0262", this);} // tgen
dd0262 ::dd0262(){ note_ctor("dd0262", this);} // tgen

static void Test_dd0262()
{
  extern Class_Descriptor cd_dd0262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0262, buf);
    dd0262 *dp, &lv = *(dp=new (buf) dd0262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), 0, "dd0262");
    check_base_class_offset(lv, (bb62*)(cc262*), 0, "dd0262");
    check_base_class_offset(lv, (cc262*), 0, "dd0262");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0262.d");
    test_class_info(&lv, &cd_dd0262);
    dp->~dd0262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0262(Test_dd0262, "dd0262", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0262C1Ev();
extern void _ZN6dd0262D1Ev();
Name_Map name_map_dd0262[] = {
  NSPAIR(_ZN6dd0262C1Ev),
  NSPAIR(_ZN6dd0262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd0262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0262[];
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd0262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
Class_Descriptor cd_dd0262 = {  "dd0262", // class name
  bases_dd0262, 3,
  &(vtc_dd0262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0262),4, //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  ee00262  : dd0262 {
  int e;
  ~ee00262(); // tgen
  ee00262(); // tgen
};
//SIG(1 ee00262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee00262 ::~ee00262(){ note_dtor("ee00262", this);} // tgen
ee00262 ::ee00262(){ note_ctor("ee00262", this);} // tgen

static void Test_ee00262()
{
  extern Class_Descriptor cd_ee00262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00262, buf);
    ee00262 *dp, &lv = *(dp=new (buf) ee00262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), 0, "ee00262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), 0, "ee00262");
    check_base_class_offset(lv, (cc262*)(dd0262*), 0, "ee00262");
    check_base_class_offset(lv, (dd0262*), 0, "ee00262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00262.e");
    test_class_info(&lv, &cd_ee00262);
    dp->~ee00262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00262(Test_ee00262, "ee00262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00262C1Ev();
extern void _ZN7ee00262D1Ev();
Name_Map name_map_ee00262[] = {
  NSPAIR(_ZN7ee00262C1Ev),
  NSPAIR(_ZN7ee00262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee00262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00262[];
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee00262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee00262[];
extern  VTBL_ENTRY _ZTV7ee00262[];
Class_Descriptor cd_ee00262 = {  "ee00262", // class name
  bases_ee00262, 4,
  &(vtc_ee00262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00262),4, //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  ee10262  : virtual dd0262 {
  int e;
  ~ee10262(); // tgen
  ee10262(); // tgen
};
//SIG(1 ee10262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee10262 ::~ee10262(){ note_dtor("ee10262", this);} // tgen
ee10262 ::ee10262(){ note_ctor("ee10262", this);} // tgen

static void Test_ee10262()
{
  extern Class_Descriptor cd_ee10262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10262, buf);
    ee10262 *dp, &lv = *(dp=new (buf) ee10262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee10262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee10262");
    check_base_class_offset(lv, (cc262*)(dd0262*), ABISELECT(16,8), "ee10262");
    check_base_class_offset(lv, (dd0262*), ABISELECT(16,8), "ee10262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10262.e");
    test_class_info(&lv, &cd_ee10262);
    dp->~ee10262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10262(Test_ee10262, "ee10262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10262C1Ev();
extern void _ZN7ee10262D1Ev();
Name_Map name_map_ee10262[] = {
  NSPAIR(_ZN7ee10262C1Ev),
  NSPAIR(_ZN7ee10262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee10262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10262[];
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee10262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10262[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee10262[];
static  VTT_ENTRY vtt_ee10262[] = {
  {&(_ZTV7ee10262[3]),  3,9},
  {&(_ZTV7ee10262[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10262[];
extern  VTBL_ENTRY _ZTV7ee10262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10262[];
Class_Descriptor cd_ee10262 = {  "ee10262", // class name
  bases_ee10262, 4,
  &(vtc_ee10262[0]), // expected_vtbl_contents
  &(vtt_ee10262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10262),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10262),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  ee20262  : dd0262 {
  int e;
  virtual void  foo(); // _ZN7ee202623fooEv
  ~ee20262(); // tgen
  ee20262(); // tgen
};
//SIG(1 ee20262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee20262 ::foo(){vfunc_called(this, "_ZN7ee202623fooEv");}
ee20262 ::~ee20262(){ note_dtor("ee20262", this);} // tgen
ee20262 ::ee20262(){ note_ctor("ee20262", this);} // tgen

static void Test_ee20262()
{
  extern Class_Descriptor cd_ee20262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20262, buf);
    ee20262 *dp, &lv = *(dp=new (buf) ee20262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), 0, "ee20262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), 0, "ee20262");
    check_base_class_offset(lv, (cc262*)(dd0262*), 0, "ee20262");
    check_base_class_offset(lv, (dd0262*), 0, "ee20262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20262.e");
    test_class_info(&lv, &cd_ee20262);
    dp->~ee20262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20262(Test_ee20262, "ee20262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20262C1Ev();
extern void _ZN7ee20262D1Ev();
Name_Map name_map_ee20262[] = {
  NSPAIR(_ZN7ee20262C1Ev),
  NSPAIR(_ZN7ee20262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee20262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20262[];
extern void _ZN7ee202623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee20262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20262[0]),
  (VTBL_ENTRY)&_ZN7ee202623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee20262[];
extern  VTBL_ENTRY _ZTV7ee20262[];
Class_Descriptor cd_ee20262 = {  "ee20262", // class name
  bases_ee20262, 4,
  &(vtc_ee20262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20262),4, //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  ee30262  : virtual dd0262 {
  int e;
  virtual void  foo(); // _ZN7ee302623fooEv
  ~ee30262(); // tgen
  ee30262(); // tgen
};
//SIG(1 ee30262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee30262 ::foo(){vfunc_called(this, "_ZN7ee302623fooEv");}
ee30262 ::~ee30262(){ note_dtor("ee30262", this);} // tgen
ee30262 ::ee30262(){ note_ctor("ee30262", this);} // tgen

static void Test_ee30262()
{
  extern Class_Descriptor cd_ee30262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30262, buf);
    ee30262 *dp, &lv = *(dp=new (buf) ee30262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee30262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee30262");
    check_base_class_offset(lv, (cc262*)(dd0262*), ABISELECT(16,8), "ee30262");
    check_base_class_offset(lv, (dd0262*), ABISELECT(16,8), "ee30262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30262.e");
    test_class_info(&lv, &cd_ee30262);
    dp->~ee30262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30262(Test_ee30262, "ee30262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30262C1Ev();
extern void _ZN7ee30262D1Ev();
Name_Map name_map_ee30262[] = {
  NSPAIR(_ZN7ee30262C1Ev),
  NSPAIR(_ZN7ee30262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee30262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30262[];
extern void _ZN7ee302623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee302623fooEv,_ZTv0_n12_N7ee302623fooEv)();
extern void ABISELECT(_ZThn16_N7ee302623fooEv,_ZThn8_N7ee302623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee30262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30262[0]),
  (VTBL_ENTRY)&_ZN7ee302623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee302623fooEv,_ZTv0_n12_N7ee302623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee30262[];
static  VTT_ENTRY vtt_ee30262[] = {
  {&(_ZTV7ee30262[3]),  3,10},
  {&(_ZTV7ee30262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30262[];
extern  VTBL_ENTRY _ZTV7ee30262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30262[];
static VTBL_ENTRY alt_thunk_names1042[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee302623fooEv,_ZTv0_n12_N7ee302623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee302623fooEv,_ZThn8_N7ee302623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30262 = {  "ee30262", // class name
  bases_ee30262, 4,
  &(vtc_ee30262[0]), // expected_vtbl_contents
  &(vtt_ee30262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1042,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40262  : dd0262 {
  int e;
  virtual void  bar(); // _ZN7ee402623barEv
  ~ee40262(); // tgen
  ee40262(); // tgen
};
//SIG(1 ee40262) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee40262 ::bar(){vfunc_called(this, "_ZN7ee402623barEv");}
ee40262 ::~ee40262(){ note_dtor("ee40262", this);} // tgen
ee40262 ::ee40262(){ note_ctor("ee40262", this);} // tgen

static void Test_ee40262()
{
  extern Class_Descriptor cd_ee40262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40262, buf);
    ee40262 *dp, &lv = *(dp=new (buf) ee40262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), 0, "ee40262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), 0, "ee40262");
    check_base_class_offset(lv, (cc262*)(dd0262*), 0, "ee40262");
    check_base_class_offset(lv, (dd0262*), 0, "ee40262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40262.e");
    test_class_info(&lv, &cd_ee40262);
    dp->~ee40262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40262(Test_ee40262, "ee40262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40262C1Ev();
extern void _ZN7ee40262D1Ev();
Name_Map name_map_ee40262[] = {
  NSPAIR(_ZN7ee40262C1Ev),
  NSPAIR(_ZN7ee40262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee40262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40262[];
extern void _ZN5cc2623fooEv();
extern void _ZN7ee402623barEv();
static  VTBL_ENTRY vtc_ee40262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN7ee402623barEv,
};
extern VTBL_ENTRY _ZTI7ee40262[];
extern  VTBL_ENTRY _ZTV7ee40262[];
Class_Descriptor cd_ee40262 = {  "ee40262", // class name
  bases_ee40262, 4,
  &(vtc_ee40262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40262),4, //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  ee50262  : virtual dd0262 {
  int e;
  virtual void  bar(); // _ZN7ee502623barEv
  ~ee50262(); // tgen
  ee50262(); // tgen
};
//SIG(1 ee50262) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee50262 ::bar(){vfunc_called(this, "_ZN7ee502623barEv");}
ee50262 ::~ee50262(){ note_dtor("ee50262", this);} // tgen
ee50262 ::ee50262(){ note_ctor("ee50262", this);} // tgen

static void Test_ee50262()
{
  extern Class_Descriptor cd_ee50262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50262, buf);
    ee50262 *dp, &lv = *(dp=new (buf) ee50262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee50262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee50262");
    check_base_class_offset(lv, (cc262*)(dd0262*), ABISELECT(16,8), "ee50262");
    check_base_class_offset(lv, (dd0262*), ABISELECT(16,8), "ee50262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50262.e");
    test_class_info(&lv, &cd_ee50262);
    dp->~ee50262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50262(Test_ee50262, "ee50262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50262C1Ev();
extern void _ZN7ee50262D1Ev();
Name_Map name_map_ee50262[] = {
  NSPAIR(_ZN7ee50262C1Ev),
  NSPAIR(_ZN7ee50262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee50262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50262[];
extern void _ZN7ee502623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee502623barEv,_ZTv0_n16_N7ee502623barEv)();
extern void ABISELECT(_ZThn16_N7ee502623barEv,_ZThn8_N7ee502623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50262[0]),
  (VTBL_ENTRY)&_ZN7ee502623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee502623barEv,_ZTv0_n16_N7ee502623barEv),
};
extern VTBL_ENTRY _ZTV7ee50262[];
static  VTT_ENTRY vtt_ee50262[] = {
  {&(_ZTV7ee50262[3]),  3,10},
  {&(_ZTV7ee50262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50262[];
extern  VTBL_ENTRY _ZTV7ee50262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50262[];
static VTBL_ENTRY alt_thunk_names1043[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee502623barEv,_ZTv0_n16_N7ee502623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee502623barEv,_ZThn8_N7ee502623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50262 = {  "ee50262", // class name
  bases_ee50262, 4,
  &(vtc_ee50262[0]), // expected_vtbl_contents
  &(vtt_ee50262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1043,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60262  : dd0262 {
  int e;
  virtual void  foo(); // _ZN7ee602623fooEv
  virtual void  bar(); // _ZN7ee602623barEv
  ~ee60262(); // tgen
  ee60262(); // tgen
};
//SIG(1 ee60262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee60262 ::foo(){vfunc_called(this, "_ZN7ee602623fooEv");}
void  ee60262 ::bar(){vfunc_called(this, "_ZN7ee602623barEv");}
ee60262 ::~ee60262(){ note_dtor("ee60262", this);} // tgen
ee60262 ::ee60262(){ note_ctor("ee60262", this);} // tgen

static void Test_ee60262()
{
  extern Class_Descriptor cd_ee60262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60262, buf);
    ee60262 *dp, &lv = *(dp=new (buf) ee60262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), 0, "ee60262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), 0, "ee60262");
    check_base_class_offset(lv, (cc262*)(dd0262*), 0, "ee60262");
    check_base_class_offset(lv, (dd0262*), 0, "ee60262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60262.e");
    test_class_info(&lv, &cd_ee60262);
    dp->~ee60262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60262(Test_ee60262, "ee60262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60262C1Ev();
extern void _ZN7ee60262D1Ev();
Name_Map name_map_ee60262[] = {
  NSPAIR(_ZN7ee60262C1Ev),
  NSPAIR(_ZN7ee60262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee60262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60262[];
extern void _ZN7ee602623fooEv();
extern void _ZN7ee602623barEv();
static  VTBL_ENTRY vtc_ee60262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60262[0]),
  (VTBL_ENTRY)&_ZN7ee602623fooEv,
  (VTBL_ENTRY)&_ZN7ee602623barEv,
};
extern VTBL_ENTRY _ZTI7ee60262[];
extern  VTBL_ENTRY _ZTV7ee60262[];
Class_Descriptor cd_ee60262 = {  "ee60262", // class name
  bases_ee60262, 4,
  &(vtc_ee60262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60262),4, //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  ee70262  : virtual dd0262 {
  int e;
  virtual void  foo(); // _ZN7ee702623fooEv
  virtual void  bar(); // _ZN7ee702623barEv
  ~ee70262(); // tgen
  ee70262(); // tgen
};
//SIG(1 ee70262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee70262 ::foo(){vfunc_called(this, "_ZN7ee702623fooEv");}
void  ee70262 ::bar(){vfunc_called(this, "_ZN7ee702623barEv");}
ee70262 ::~ee70262(){ note_dtor("ee70262", this);} // tgen
ee70262 ::ee70262(){ note_ctor("ee70262", this);} // tgen

static void Test_ee70262()
{
  extern Class_Descriptor cd_ee70262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70262, buf);
    ee70262 *dp, &lv = *(dp=new (buf) ee70262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee70262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd0262*), ABISELECT(16,8), "ee70262");
    check_base_class_offset(lv, (cc262*)(dd0262*), ABISELECT(16,8), "ee70262");
    check_base_class_offset(lv, (dd0262*), ABISELECT(16,8), "ee70262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70262.e");
    test_class_info(&lv, &cd_ee70262);
    dp->~ee70262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70262(Test_ee70262, "ee70262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70262C1Ev();
extern void _ZN7ee70262D1Ev();
Name_Map name_map_ee70262[] = {
  NSPAIR(_ZN7ee70262C1Ev),
  NSPAIR(_ZN7ee70262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd0262;
extern VTBL_ENTRY _ZTI6dd0262[];
extern  VTBL_ENTRY _ZTV6dd0262[];
static Base_Class bases_ee70262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0262,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70262[];
extern void _ZN7ee702623fooEv();
extern void _ZN7ee702623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee702623fooEv,_ZTv0_n12_N7ee702623fooEv)();
extern void ABISELECT(_ZThn16_N7ee702623fooEv,_ZThn8_N7ee702623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee702623barEv,_ZTv0_n16_N7ee702623barEv)();
extern void ABISELECT(_ZThn16_N7ee702623barEv,_ZThn8_N7ee702623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70262[0]),
  (VTBL_ENTRY)&_ZN7ee702623fooEv,
  (VTBL_ENTRY)&_ZN7ee702623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee702623fooEv,_ZTv0_n12_N7ee702623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee702623barEv,_ZTv0_n16_N7ee702623barEv),
};
extern VTBL_ENTRY _ZTV7ee70262[];
static  VTT_ENTRY vtt_ee70262[] = {
  {&(_ZTV7ee70262[3]),  3,11},
  {&(_ZTV7ee70262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70262[];
extern  VTBL_ENTRY _ZTV7ee70262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70262[];
static VTBL_ENTRY alt_thunk_names1044[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee702623barEv,_ZTv0_n16_N7ee702623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee702623barEv,_ZThn8_N7ee702623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee702623fooEv,_ZTv0_n12_N7ee702623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee702623fooEv,_ZThn8_N7ee702623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70262 = {  "ee70262", // class name
  bases_ee70262, 4,
  &(vtc_ee70262[0]), // expected_vtbl_contents
  &(vtt_ee70262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1044,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1262  : virtual cc262 {
  int d;
  ~dd1262(); // tgen
  dd1262(); // tgen
};
//SIG(-1 dd1262) C1{ VBC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


dd1262 ::~dd1262(){ note_dtor("dd1262", this);} // tgen
dd1262 ::dd1262(){ note_ctor("dd1262", this);} // tgen

static void Test_dd1262()
{
  extern Class_Descriptor cd_dd1262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1262, buf);
    dd1262 *dp, &lv = *(dp=new (buf) dd1262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,8), "dd1262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,8), "dd1262");
    check_base_class_offset(lv, (cc262*), ABISELECT(16,8), "dd1262");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1262.d");
    test_class_info(&lv, &cd_dd1262);
    dp->~dd1262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1262(Test_dd1262, "dd1262", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1262C1Ev();
extern void _ZN6dd1262D1Ev();
Name_Map name_map_dd1262[] = {
  NSPAIR(_ZN6dd1262C1Ev),
  NSPAIR(_ZN6dd1262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd1262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1262[];
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd1262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd1262[];
static  VTT_ENTRY vtt_dd1262[] = {
  {&(_ZTV6dd1262[3]),  3,9},
  {&(_ZTV6dd1262[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
Class_Descriptor cd_dd1262 = {  "dd1262", // class name
  bases_dd1262, 3,
  &(vtc_dd1262[0]), // expected_vtbl_contents
  &(vtt_dd1262[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1262),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1262),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  ee01262  : dd1262 {
  int e;
  ~ee01262(); // tgen
  ee01262(); // tgen
};
//SIG(1 ee01262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee01262 ::~ee01262(){ note_dtor("ee01262", this);} // tgen
ee01262 ::ee01262(){ note_ctor("ee01262", this);} // tgen

static void Test_ee01262()
{
  extern Class_Descriptor cd_ee01262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01262, buf);
    ee01262 *dp, &lv = *(dp=new (buf) ee01262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee01262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee01262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(16,12), "ee01262");
    check_base_class_offset(lv, (dd1262*), 0, "ee01262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01262.e");
    test_class_info(&lv, &cd_ee01262);
    dp->~ee01262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01262(Test_ee01262, "ee01262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01262C1Ev();
extern void _ZN7ee01262D1Ev();
Name_Map name_map_ee01262[] = {
  NSPAIR(_ZN7ee01262C1Ev),
  NSPAIR(_ZN7ee01262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee01262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01262[];
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee01262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01262[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee01262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee01262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee01262[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee01262[] = {
  {&(_ZTV7ee01262[3]),  3,9},
  {&(_tg__ZTV6dd1262__7ee01262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee01262[4]),  4,6},
  {&(_ZTV7ee01262[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01262[];
extern  VTBL_ENTRY _ZTV7ee01262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01262[];
Class_Descriptor cd_ee01262 = {  "ee01262", // class name
  bases_ee01262, 4,
  &(vtc_ee01262[0]), // expected_vtbl_contents
  &(vtt_ee01262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01262),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01262),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  ee11262  : virtual dd1262 {
  int e;
  ~ee11262(); // tgen
  ee11262(); // tgen
};
//SIG(1 ee11262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee11262 ::~ee11262(){ note_dtor("ee11262", this);} // tgen
ee11262 ::ee11262(){ note_ctor("ee11262", this);} // tgen

static void Test_ee11262()
{
  extern Class_Descriptor cd_ee11262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11262, buf);
    ee11262 *dp, &lv = *(dp=new (buf) ee11262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee11262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee11262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(32,16), "ee11262");
    check_base_class_offset(lv, (dd1262*), ABISELECT(16,8), "ee11262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11262.e");
    test_class_info(&lv, &cd_ee11262);
    dp->~ee11262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11262(Test_ee11262, "ee11262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11262C1Ev();
extern void _ZN7ee11262D1Ev();
Name_Map name_map_ee11262[] = {
  NSPAIR(_ZN7ee11262C1Ev),
  NSPAIR(_ZN7ee11262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee11262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11262[];
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee11262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11262[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11262[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee11262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee11262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee11262[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee11262[] = {
  {&(_ZTV7ee11262[4]),  4,13},
  {&(_ZTV7ee11262[7]),  7,13},
  {&(_ZTV7ee11262[11]),  11,13},
  {&(_tg__ZTV6dd1262__7ee11262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee11262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11262[];
extern  VTBL_ENTRY _ZTV7ee11262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11262[];
Class_Descriptor cd_ee11262 = {  "ee11262", // class name
  bases_ee11262, 4,
  &(vtc_ee11262[0]), // expected_vtbl_contents
  &(vtt_ee11262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11262),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11262),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  ee21262  : dd1262 {
  int e;
  virtual void  foo(); // _ZN7ee212623fooEv
  ~ee21262(); // tgen
  ee21262(); // tgen
};
//SIG(1 ee21262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee21262 ::foo(){vfunc_called(this, "_ZN7ee212623fooEv");}
ee21262 ::~ee21262(){ note_dtor("ee21262", this);} // tgen
ee21262 ::ee21262(){ note_ctor("ee21262", this);} // tgen

static void Test_ee21262()
{
  extern Class_Descriptor cd_ee21262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21262, buf);
    ee21262 *dp, &lv = *(dp=new (buf) ee21262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee21262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee21262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(16,12), "ee21262");
    check_base_class_offset(lv, (dd1262*), 0, "ee21262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21262.e");
    test_class_info(&lv, &cd_ee21262);
    dp->~ee21262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21262(Test_ee21262, "ee21262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21262C1Ev();
extern void _ZN7ee21262D1Ev();
Name_Map name_map_ee21262[] = {
  NSPAIR(_ZN7ee21262C1Ev),
  NSPAIR(_ZN7ee21262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee21262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21262[];
extern void _ZN7ee212623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee212623fooEv,_ZTv0_n12_N7ee212623fooEv)();
extern void ABISELECT(_ZThn16_N7ee212623fooEv,_ZThn12_N7ee212623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee21262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21262[0]),
  (VTBL_ENTRY)&_ZN7ee212623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee212623fooEv,_ZTv0_n12_N7ee212623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee21262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee21262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee21262[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee21262[] = {
  {&(_ZTV7ee21262[3]),  3,10},
  {&(_tg__ZTV6dd1262__7ee21262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee21262[4]),  4,6},
  {&(_ZTV7ee21262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21262[];
extern  VTBL_ENTRY _ZTV7ee21262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21262[];
static VTBL_ENTRY alt_thunk_names1045[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee212623fooEv,_ZTv0_n12_N7ee212623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee212623fooEv,_ZThn12_N7ee212623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21262 = {  "ee21262", // class name
  bases_ee21262, 4,
  &(vtc_ee21262[0]), // expected_vtbl_contents
  &(vtt_ee21262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1045,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31262  : virtual dd1262 {
  int e;
  virtual void  foo(); // _ZN7ee312623fooEv
  ~ee31262(); // tgen
  ee31262(); // tgen
};
//SIG(1 ee31262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee31262 ::foo(){vfunc_called(this, "_ZN7ee312623fooEv");}
ee31262 ::~ee31262(){ note_dtor("ee31262", this);} // tgen
ee31262 ::ee31262(){ note_ctor("ee31262", this);} // tgen

static void Test_ee31262()
{
  extern Class_Descriptor cd_ee31262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31262, buf);
    ee31262 *dp, &lv = *(dp=new (buf) ee31262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee31262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee31262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(32,16), "ee31262");
    check_base_class_offset(lv, (dd1262*), ABISELECT(16,8), "ee31262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31262.e");
    test_class_info(&lv, &cd_ee31262);
    dp->~ee31262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31262(Test_ee31262, "ee31262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31262C1Ev();
extern void _ZN7ee31262D1Ev();
Name_Map name_map_ee31262[] = {
  NSPAIR(_ZN7ee31262C1Ev),
  NSPAIR(_ZN7ee31262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee31262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31262[];
extern void _ZN7ee312623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee312623fooEv,_ZTv0_n12_N7ee312623fooEv)();
extern void ABISELECT(_ZThn32_N7ee312623fooEv,_ZThn16_N7ee312623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee31262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31262[0]),
  (VTBL_ENTRY)&_ZN7ee312623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31262[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee312623fooEv,_ZTv0_n12_N7ee312623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee31262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee31262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee31262[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee31262[] = {
  {&(_ZTV7ee31262[4]),  4,14},
  {&(_ZTV7ee31262[8]),  8,14},
  {&(_ZTV7ee31262[12]),  12,14},
  {&(_tg__ZTV6dd1262__7ee31262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee31262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31262[];
extern  VTBL_ENTRY _ZTV7ee31262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31262[];
static VTBL_ENTRY alt_thunk_names1046[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee312623fooEv,_ZTv0_n12_N7ee312623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee312623fooEv,_ZThn16_N7ee312623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31262 = {  "ee31262", // class name
  bases_ee31262, 4,
  &(vtc_ee31262[0]), // expected_vtbl_contents
  &(vtt_ee31262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31262),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1046,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41262  : dd1262 {
  int e;
  virtual void  bar(); // _ZN7ee412623barEv
  ~ee41262(); // tgen
  ee41262(); // tgen
};
//SIG(1 ee41262) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee41262 ::bar(){vfunc_called(this, "_ZN7ee412623barEv");}
ee41262 ::~ee41262(){ note_dtor("ee41262", this);} // tgen
ee41262 ::ee41262(){ note_ctor("ee41262", this);} // tgen

static void Test_ee41262()
{
  extern Class_Descriptor cd_ee41262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41262, buf);
    ee41262 *dp, &lv = *(dp=new (buf) ee41262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee41262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee41262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(16,12), "ee41262");
    check_base_class_offset(lv, (dd1262*), 0, "ee41262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41262.e");
    test_class_info(&lv, &cd_ee41262);
    dp->~ee41262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41262(Test_ee41262, "ee41262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41262C1Ev();
extern void _ZN7ee41262D1Ev();
Name_Map name_map_ee41262[] = {
  NSPAIR(_ZN7ee41262C1Ev),
  NSPAIR(_ZN7ee41262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee41262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41262[];
extern void _ZN7ee412623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee412623barEv,_ZTv0_n16_N7ee412623barEv)();
extern void ABISELECT(_ZThn16_N7ee412623barEv,_ZThn12_N7ee412623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41262[0]),
  (VTBL_ENTRY)&_ZN7ee412623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee412623barEv,_ZTv0_n16_N7ee412623barEv),
};
extern VTBL_ENTRY _ZTV7ee41262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee41262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee41262[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee41262[] = {
  {&(_ZTV7ee41262[3]),  3,10},
  {&(_tg__ZTV6dd1262__7ee41262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee41262[4]),  4,6},
  {&(_ZTV7ee41262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41262[];
extern  VTBL_ENTRY _ZTV7ee41262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41262[];
static VTBL_ENTRY alt_thunk_names1047[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee412623barEv,_ZTv0_n16_N7ee412623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee412623barEv,_ZThn12_N7ee412623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41262 = {  "ee41262", // class name
  bases_ee41262, 4,
  &(vtc_ee41262[0]), // expected_vtbl_contents
  &(vtt_ee41262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1047,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51262  : virtual dd1262 {
  int e;
  virtual void  bar(); // _ZN7ee512623barEv
  ~ee51262(); // tgen
  ee51262(); // tgen
};
//SIG(1 ee51262) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee51262 ::bar(){vfunc_called(this, "_ZN7ee512623barEv");}
ee51262 ::~ee51262(){ note_dtor("ee51262", this);} // tgen
ee51262 ::ee51262(){ note_ctor("ee51262", this);} // tgen

static void Test_ee51262()
{
  extern Class_Descriptor cd_ee51262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51262, buf);
    ee51262 *dp, &lv = *(dp=new (buf) ee51262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee51262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee51262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(32,16), "ee51262");
    check_base_class_offset(lv, (dd1262*), ABISELECT(16,8), "ee51262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51262.e");
    test_class_info(&lv, &cd_ee51262);
    dp->~ee51262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51262(Test_ee51262, "ee51262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51262C1Ev();
extern void _ZN7ee51262D1Ev();
Name_Map name_map_ee51262[] = {
  NSPAIR(_ZN7ee51262C1Ev),
  NSPAIR(_ZN7ee51262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee51262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51262[];
extern void _ZN7ee512623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee512623barEv,_ZTv0_n16_N7ee512623barEv)();
extern void ABISELECT(_ZThn32_N7ee512623barEv,_ZThn16_N7ee512623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51262[0]),
  (VTBL_ENTRY)&_ZN7ee512623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51262[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee512623barEv,_ZTv0_n16_N7ee512623barEv),
};
extern VTBL_ENTRY _ZTV7ee51262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee51262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee51262[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee51262[] = {
  {&(_ZTV7ee51262[4]),  4,14},
  {&(_ZTV7ee51262[8]),  8,14},
  {&(_ZTV7ee51262[12]),  12,14},
  {&(_tg__ZTV6dd1262__7ee51262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee51262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51262[];
extern  VTBL_ENTRY _ZTV7ee51262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51262[];
static VTBL_ENTRY alt_thunk_names1048[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee512623barEv,_ZTv0_n16_N7ee512623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee512623barEv,_ZThn16_N7ee512623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51262 = {  "ee51262", // class name
  bases_ee51262, 4,
  &(vtc_ee51262[0]), // expected_vtbl_contents
  &(vtt_ee51262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51262),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1048,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61262  : dd1262 {
  int e;
  virtual void  foo(); // _ZN7ee612623fooEv
  virtual void  bar(); // _ZN7ee612623barEv
  ~ee61262(); // tgen
  ee61262(); // tgen
};
//SIG(1 ee61262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee61262 ::foo(){vfunc_called(this, "_ZN7ee612623fooEv");}
void  ee61262 ::bar(){vfunc_called(this, "_ZN7ee612623barEv");}
ee61262 ::~ee61262(){ note_dtor("ee61262", this);} // tgen
ee61262 ::ee61262(){ note_ctor("ee61262", this);} // tgen

static void Test_ee61262()
{
  extern Class_Descriptor cd_ee61262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61262, buf);
    ee61262 *dp, &lv = *(dp=new (buf) ee61262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee61262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee61262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(16,12), "ee61262");
    check_base_class_offset(lv, (dd1262*), 0, "ee61262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61262.e");
    test_class_info(&lv, &cd_ee61262);
    dp->~ee61262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61262(Test_ee61262, "ee61262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61262C1Ev();
extern void _ZN7ee61262D1Ev();
Name_Map name_map_ee61262[] = {
  NSPAIR(_ZN7ee61262C1Ev),
  NSPAIR(_ZN7ee61262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee61262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61262[];
extern void _ZN7ee612623fooEv();
extern void _ZN7ee612623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee612623fooEv,_ZTv0_n12_N7ee612623fooEv)();
extern void ABISELECT(_ZThn16_N7ee612623fooEv,_ZThn12_N7ee612623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee612623barEv,_ZTv0_n16_N7ee612623barEv)();
extern void ABISELECT(_ZThn16_N7ee612623barEv,_ZThn12_N7ee612623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61262[0]),
  (VTBL_ENTRY)&_ZN7ee612623fooEv,
  (VTBL_ENTRY)&_ZN7ee612623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee612623fooEv,_ZTv0_n12_N7ee612623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee612623barEv,_ZTv0_n16_N7ee612623barEv),
};
extern VTBL_ENTRY _ZTV7ee61262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee61262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee61262[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee61262[] = {
  {&(_ZTV7ee61262[3]),  3,11},
  {&(_tg__ZTV6dd1262__7ee61262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee61262[4]),  4,6},
  {&(_ZTV7ee61262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61262[];
extern  VTBL_ENTRY _ZTV7ee61262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61262[];
static VTBL_ENTRY alt_thunk_names1049[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee612623barEv,_ZTv0_n16_N7ee612623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee612623barEv,_ZThn12_N7ee612623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee612623fooEv,_ZTv0_n12_N7ee612623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee612623fooEv,_ZThn12_N7ee612623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61262 = {  "ee61262", // class name
  bases_ee61262, 4,
  &(vtc_ee61262[0]), // expected_vtbl_contents
  &(vtt_ee61262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1049,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71262  : virtual dd1262 {
  int e;
  virtual void  foo(); // _ZN7ee712623fooEv
  virtual void  bar(); // _ZN7ee712623barEv
  ~ee71262(); // tgen
  ee71262(); // tgen
};
//SIG(1 ee71262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee71262 ::foo(){vfunc_called(this, "_ZN7ee712623fooEv");}
void  ee71262 ::bar(){vfunc_called(this, "_ZN7ee712623barEv");}
ee71262 ::~ee71262(){ note_dtor("ee71262", this);} // tgen
ee71262 ::ee71262(){ note_ctor("ee71262", this);} // tgen

static void Test_ee71262()
{
  extern Class_Descriptor cd_ee71262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71262, buf);
    ee71262 *dp, &lv = *(dp=new (buf) ee71262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee71262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee71262");
    check_base_class_offset(lv, (cc262*)(dd1262*), ABISELECT(32,16), "ee71262");
    check_base_class_offset(lv, (dd1262*), ABISELECT(16,8), "ee71262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71262.e");
    test_class_info(&lv, &cd_ee71262);
    dp->~ee71262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71262(Test_ee71262, "ee71262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71262C1Ev();
extern void _ZN7ee71262D1Ev();
Name_Map name_map_ee71262[] = {
  NSPAIR(_ZN7ee71262C1Ev),
  NSPAIR(_ZN7ee71262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd1262;
extern VTBL_ENTRY _ZTI6dd1262[];
extern  VTBL_ENTRY _ZTV6dd1262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1262[];
static Base_Class bases_ee71262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1262,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71262[];
extern void _ZN7ee712623fooEv();
extern void _ZN7ee712623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee712623fooEv,_ZTv0_n12_N7ee712623fooEv)();
extern void ABISELECT(_ZThn32_N7ee712623fooEv,_ZThn16_N7ee712623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee712623barEv,_ZTv0_n16_N7ee712623barEv)();
extern void ABISELECT(_ZThn32_N7ee712623barEv,_ZThn16_N7ee712623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71262[0]),
  (VTBL_ENTRY)&_ZN7ee712623fooEv,
  (VTBL_ENTRY)&_ZN7ee712623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71262[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee712623fooEv,_ZTv0_n12_N7ee712623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee712623barEv,_ZTv0_n16_N7ee712623barEv),
};
extern VTBL_ENTRY _ZTV7ee71262[];
static  VTBL_ENTRY _tg__ZTV6dd1262__7ee71262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
};
extern void _ZN5cc2623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd1262__7ee71262[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee71262[] = {
  {&(_ZTV7ee71262[4]),  4,15},
  {&(_ZTV7ee71262[9]),  9,15},
  {&(_ZTV7ee71262[13]),  13,15},
  {&(_tg__ZTV6dd1262__7ee71262[3]),  3,3},
  {&(_tg__ZTV5cc262__6dd1262__7ee71262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71262[];
extern  VTBL_ENTRY _ZTV7ee71262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71262[];
static VTBL_ENTRY alt_thunk_names1050[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee712623barEv,_ZTv0_n16_N7ee712623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee712623barEv,_ZThn16_N7ee712623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee712623fooEv,_ZTv0_n12_N7ee712623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee712623fooEv,_ZThn16_N7ee712623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71262 = {  "ee71262", // class name
  bases_ee71262, 4,
  &(vtc_ee71262[0]), // expected_vtbl_contents
  &(vtt_ee71262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71262),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1050,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2262  : cc262 {
  int d;
  virtual void  foo(); // _ZN6dd22623fooEv
  ~dd2262(); // tgen
  dd2262(); // tgen
};
//SIG(-1 dd2262) C1{ BC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd2262 ::foo(){vfunc_called(this, "_ZN6dd22623fooEv");}
dd2262 ::~dd2262(){ note_dtor("dd2262", this);} // tgen
dd2262 ::dd2262(){ note_ctor("dd2262", this);} // tgen

static void Test_dd2262()
{
  extern Class_Descriptor cd_dd2262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2262, buf);
    dd2262 *dp, &lv = *(dp=new (buf) dd2262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), 0, "dd2262");
    check_base_class_offset(lv, (bb62*)(cc262*), 0, "dd2262");
    check_base_class_offset(lv, (cc262*), 0, "dd2262");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2262.d");
    test_class_info(&lv, &cd_dd2262);
    dp->~dd2262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2262(Test_dd2262, "dd2262", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2262C1Ev();
extern void _ZN6dd2262D1Ev();
Name_Map name_map_dd2262[] = {
  NSPAIR(_ZN6dd2262C1Ev),
  NSPAIR(_ZN6dd2262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd2262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2262[];
extern void _ZN6dd22623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd2262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2262[0]),
  (VTBL_ENTRY)&_ZN6dd22623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
Class_Descriptor cd_dd2262 = {  "dd2262", // class name
  bases_dd2262, 3,
  &(vtc_dd2262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2262),4, //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  ee02262  : dd2262 {
  int e;
  ~ee02262(); // tgen
  ee02262(); // tgen
};
//SIG(1 ee02262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee02262 ::~ee02262(){ note_dtor("ee02262", this);} // tgen
ee02262 ::ee02262(){ note_ctor("ee02262", this);} // tgen

static void Test_ee02262()
{
  extern Class_Descriptor cd_ee02262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02262, buf);
    ee02262 *dp, &lv = *(dp=new (buf) ee02262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), 0, "ee02262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), 0, "ee02262");
    check_base_class_offset(lv, (cc262*)(dd2262*), 0, "ee02262");
    check_base_class_offset(lv, (dd2262*), 0, "ee02262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02262.e");
    test_class_info(&lv, &cd_ee02262);
    dp->~ee02262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02262(Test_ee02262, "ee02262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02262C1Ev();
extern void _ZN7ee02262D1Ev();
Name_Map name_map_ee02262[] = {
  NSPAIR(_ZN7ee02262C1Ev),
  NSPAIR(_ZN7ee02262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee02262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02262[];
extern void _ZN6dd22623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee02262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02262[0]),
  (VTBL_ENTRY)&_ZN6dd22623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee02262[];
extern  VTBL_ENTRY _ZTV7ee02262[];
Class_Descriptor cd_ee02262 = {  "ee02262", // class name
  bases_ee02262, 4,
  &(vtc_ee02262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02262),4, //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  ee12262  : virtual dd2262 {
  int e;
  ~ee12262(); // tgen
  ee12262(); // tgen
};
//SIG(1 ee12262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee12262 ::~ee12262(){ note_dtor("ee12262", this);} // tgen
ee12262 ::ee12262(){ note_ctor("ee12262", this);} // tgen

static void Test_ee12262()
{
  extern Class_Descriptor cd_ee12262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12262, buf);
    ee12262 *dp, &lv = *(dp=new (buf) ee12262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee12262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee12262");
    check_base_class_offset(lv, (cc262*)(dd2262*), ABISELECT(16,8), "ee12262");
    check_base_class_offset(lv, (dd2262*), ABISELECT(16,8), "ee12262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12262.e");
    test_class_info(&lv, &cd_ee12262);
    dp->~ee12262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12262(Test_ee12262, "ee12262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12262C1Ev();
extern void _ZN7ee12262D1Ev();
Name_Map name_map_ee12262[] = {
  NSPAIR(_ZN7ee12262C1Ev),
  NSPAIR(_ZN7ee12262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee12262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12262[];
extern void _ZN6dd22623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee12262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12262[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12262[0]),
  (VTBL_ENTRY)&_ZN6dd22623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee12262[];
static  VTT_ENTRY vtt_ee12262[] = {
  {&(_ZTV7ee12262[3]),  3,9},
  {&(_ZTV7ee12262[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12262[];
extern  VTBL_ENTRY _ZTV7ee12262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12262[];
Class_Descriptor cd_ee12262 = {  "ee12262", // class name
  bases_ee12262, 4,
  &(vtc_ee12262[0]), // expected_vtbl_contents
  &(vtt_ee12262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12262),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12262),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  ee22262  : dd2262 {
  int e;
  virtual void  foo(); // _ZN7ee222623fooEv
  ~ee22262(); // tgen
  ee22262(); // tgen
};
//SIG(1 ee22262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee22262 ::foo(){vfunc_called(this, "_ZN7ee222623fooEv");}
ee22262 ::~ee22262(){ note_dtor("ee22262", this);} // tgen
ee22262 ::ee22262(){ note_ctor("ee22262", this);} // tgen

static void Test_ee22262()
{
  extern Class_Descriptor cd_ee22262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22262, buf);
    ee22262 *dp, &lv = *(dp=new (buf) ee22262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), 0, "ee22262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), 0, "ee22262");
    check_base_class_offset(lv, (cc262*)(dd2262*), 0, "ee22262");
    check_base_class_offset(lv, (dd2262*), 0, "ee22262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22262.e");
    test_class_info(&lv, &cd_ee22262);
    dp->~ee22262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22262(Test_ee22262, "ee22262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22262C1Ev();
extern void _ZN7ee22262D1Ev();
Name_Map name_map_ee22262[] = {
  NSPAIR(_ZN7ee22262C1Ev),
  NSPAIR(_ZN7ee22262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee22262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22262[];
extern void _ZN7ee222623fooEv();
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee22262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22262[0]),
  (VTBL_ENTRY)&_ZN7ee222623fooEv,
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTI7ee22262[];
extern  VTBL_ENTRY _ZTV7ee22262[];
Class_Descriptor cd_ee22262 = {  "ee22262", // class name
  bases_ee22262, 4,
  &(vtc_ee22262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22262),4, //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  ee32262  : virtual dd2262 {
  int e;
  virtual void  foo(); // _ZN7ee322623fooEv
  ~ee32262(); // tgen
  ee32262(); // tgen
};
//SIG(1 ee32262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee32262 ::foo(){vfunc_called(this, "_ZN7ee322623fooEv");}
ee32262 ::~ee32262(){ note_dtor("ee32262", this);} // tgen
ee32262 ::ee32262(){ note_ctor("ee32262", this);} // tgen

static void Test_ee32262()
{
  extern Class_Descriptor cd_ee32262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32262, buf);
    ee32262 *dp, &lv = *(dp=new (buf) ee32262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee32262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee32262");
    check_base_class_offset(lv, (cc262*)(dd2262*), ABISELECT(16,8), "ee32262");
    check_base_class_offset(lv, (dd2262*), ABISELECT(16,8), "ee32262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32262.e");
    test_class_info(&lv, &cd_ee32262);
    dp->~ee32262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32262(Test_ee32262, "ee32262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32262C1Ev();
extern void _ZN7ee32262D1Ev();
Name_Map name_map_ee32262[] = {
  NSPAIR(_ZN7ee32262C1Ev),
  NSPAIR(_ZN7ee32262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee32262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32262[];
extern void _ZN7ee322623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee322623fooEv,_ZTv0_n12_N7ee322623fooEv)();
extern void ABISELECT(_ZThn16_N7ee322623fooEv,_ZThn8_N7ee322623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee32262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32262[0]),
  (VTBL_ENTRY)&_ZN7ee322623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee322623fooEv,_ZTv0_n12_N7ee322623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee32262[];
static  VTT_ENTRY vtt_ee32262[] = {
  {&(_ZTV7ee32262[3]),  3,10},
  {&(_ZTV7ee32262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32262[];
extern  VTBL_ENTRY _ZTV7ee32262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32262[];
static VTBL_ENTRY alt_thunk_names1051[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee322623fooEv,_ZTv0_n12_N7ee322623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee322623fooEv,_ZThn8_N7ee322623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32262 = {  "ee32262", // class name
  bases_ee32262, 4,
  &(vtc_ee32262[0]), // expected_vtbl_contents
  &(vtt_ee32262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1051,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42262  : dd2262 {
  int e;
  virtual void  bar(); // _ZN7ee422623barEv
  ~ee42262(); // tgen
  ee42262(); // tgen
};
//SIG(1 ee42262) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee42262 ::bar(){vfunc_called(this, "_ZN7ee422623barEv");}
ee42262 ::~ee42262(){ note_dtor("ee42262", this);} // tgen
ee42262 ::ee42262(){ note_ctor("ee42262", this);} // tgen

static void Test_ee42262()
{
  extern Class_Descriptor cd_ee42262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42262, buf);
    ee42262 *dp, &lv = *(dp=new (buf) ee42262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), 0, "ee42262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), 0, "ee42262");
    check_base_class_offset(lv, (cc262*)(dd2262*), 0, "ee42262");
    check_base_class_offset(lv, (dd2262*), 0, "ee42262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42262.e");
    test_class_info(&lv, &cd_ee42262);
    dp->~ee42262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42262(Test_ee42262, "ee42262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42262C1Ev();
extern void _ZN7ee42262D1Ev();
Name_Map name_map_ee42262[] = {
  NSPAIR(_ZN7ee42262C1Ev),
  NSPAIR(_ZN7ee42262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee42262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42262[];
extern void _ZN6dd22623fooEv();
extern void _ZN7ee422623barEv();
static  VTBL_ENTRY vtc_ee42262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42262[0]),
  (VTBL_ENTRY)&_ZN6dd22623fooEv,
  (VTBL_ENTRY)&_ZN7ee422623barEv,
};
extern VTBL_ENTRY _ZTI7ee42262[];
extern  VTBL_ENTRY _ZTV7ee42262[];
Class_Descriptor cd_ee42262 = {  "ee42262", // class name
  bases_ee42262, 4,
  &(vtc_ee42262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42262),4, //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  ee52262  : virtual dd2262 {
  int e;
  virtual void  bar(); // _ZN7ee522623barEv
  ~ee52262(); // tgen
  ee52262(); // tgen
};
//SIG(1 ee52262) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee52262 ::bar(){vfunc_called(this, "_ZN7ee522623barEv");}
ee52262 ::~ee52262(){ note_dtor("ee52262", this);} // tgen
ee52262 ::ee52262(){ note_ctor("ee52262", this);} // tgen

static void Test_ee52262()
{
  extern Class_Descriptor cd_ee52262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52262, buf);
    ee52262 *dp, &lv = *(dp=new (buf) ee52262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee52262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee52262");
    check_base_class_offset(lv, (cc262*)(dd2262*), ABISELECT(16,8), "ee52262");
    check_base_class_offset(lv, (dd2262*), ABISELECT(16,8), "ee52262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52262.e");
    test_class_info(&lv, &cd_ee52262);
    dp->~ee52262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52262(Test_ee52262, "ee52262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52262C1Ev();
extern void _ZN7ee52262D1Ev();
Name_Map name_map_ee52262[] = {
  NSPAIR(_ZN7ee52262C1Ev),
  NSPAIR(_ZN7ee52262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee52262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52262[];
extern void _ZN7ee522623barEv();
extern void _ZN6dd22623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee522623barEv,_ZTv0_n16_N7ee522623barEv)();
extern void ABISELECT(_ZThn16_N7ee522623barEv,_ZThn8_N7ee522623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52262[0]),
  (VTBL_ENTRY)&_ZN7ee522623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52262[0]),
  (VTBL_ENTRY)&_ZN6dd22623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee522623barEv,_ZTv0_n16_N7ee522623barEv),
};
extern VTBL_ENTRY _ZTV7ee52262[];
static  VTT_ENTRY vtt_ee52262[] = {
  {&(_ZTV7ee52262[3]),  3,10},
  {&(_ZTV7ee52262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52262[];
extern  VTBL_ENTRY _ZTV7ee52262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52262[];
static VTBL_ENTRY alt_thunk_names1052[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee522623barEv,_ZTv0_n16_N7ee522623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee522623barEv,_ZThn8_N7ee522623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52262 = {  "ee52262", // class name
  bases_ee52262, 4,
  &(vtc_ee52262[0]), // expected_vtbl_contents
  &(vtt_ee52262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1052,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62262  : dd2262 {
  int e;
  virtual void  foo(); // _ZN7ee622623fooEv
  virtual void  bar(); // _ZN7ee622623barEv
  ~ee62262(); // tgen
  ee62262(); // tgen
};
//SIG(1 ee62262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee62262 ::foo(){vfunc_called(this, "_ZN7ee622623fooEv");}
void  ee62262 ::bar(){vfunc_called(this, "_ZN7ee622623barEv");}
ee62262 ::~ee62262(){ note_dtor("ee62262", this);} // tgen
ee62262 ::ee62262(){ note_ctor("ee62262", this);} // tgen

static void Test_ee62262()
{
  extern Class_Descriptor cd_ee62262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62262, buf);
    ee62262 *dp, &lv = *(dp=new (buf) ee62262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), 0, "ee62262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), 0, "ee62262");
    check_base_class_offset(lv, (cc262*)(dd2262*), 0, "ee62262");
    check_base_class_offset(lv, (dd2262*), 0, "ee62262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62262.e");
    test_class_info(&lv, &cd_ee62262);
    dp->~ee62262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62262(Test_ee62262, "ee62262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62262C1Ev();
extern void _ZN7ee62262D1Ev();
Name_Map name_map_ee62262[] = {
  NSPAIR(_ZN7ee62262C1Ev),
  NSPAIR(_ZN7ee62262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee62262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62262[];
extern void _ZN7ee622623fooEv();
extern void _ZN7ee622623barEv();
static  VTBL_ENTRY vtc_ee62262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62262[0]),
  (VTBL_ENTRY)&_ZN7ee622623fooEv,
  (VTBL_ENTRY)&_ZN7ee622623barEv,
};
extern VTBL_ENTRY _ZTI7ee62262[];
extern  VTBL_ENTRY _ZTV7ee62262[];
Class_Descriptor cd_ee62262 = {  "ee62262", // class name
  bases_ee62262, 4,
  &(vtc_ee62262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62262),4, //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  ee72262  : virtual dd2262 {
  int e;
  virtual void  foo(); // _ZN7ee722623fooEv
  virtual void  bar(); // _ZN7ee722623barEv
  ~ee72262(); // tgen
  ee72262(); // tgen
};
//SIG(1 ee72262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee72262 ::foo(){vfunc_called(this, "_ZN7ee722623fooEv");}
void  ee72262 ::bar(){vfunc_called(this, "_ZN7ee722623barEv");}
ee72262 ::~ee72262(){ note_dtor("ee72262", this);} // tgen
ee72262 ::ee72262(){ note_ctor("ee72262", this);} // tgen

static void Test_ee72262()
{
  extern Class_Descriptor cd_ee72262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72262, buf);
    ee72262 *dp, &lv = *(dp=new (buf) ee72262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee72262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd2262*), ABISELECT(16,8), "ee72262");
    check_base_class_offset(lv, (cc262*)(dd2262*), ABISELECT(16,8), "ee72262");
    check_base_class_offset(lv, (dd2262*), ABISELECT(16,8), "ee72262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72262.e");
    test_class_info(&lv, &cd_ee72262);
    dp->~ee72262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72262(Test_ee72262, "ee72262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72262C1Ev();
extern void _ZN7ee72262D1Ev();
Name_Map name_map_ee72262[] = {
  NSPAIR(_ZN7ee72262C1Ev),
  NSPAIR(_ZN7ee72262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd2262;
extern VTBL_ENTRY _ZTI6dd2262[];
extern  VTBL_ENTRY _ZTV6dd2262[];
static Base_Class bases_ee72262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2262,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72262[];
extern void _ZN7ee722623fooEv();
extern void _ZN7ee722623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee722623fooEv,_ZTv0_n12_N7ee722623fooEv)();
extern void ABISELECT(_ZThn16_N7ee722623fooEv,_ZThn8_N7ee722623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee722623barEv,_ZTv0_n16_N7ee722623barEv)();
extern void ABISELECT(_ZThn16_N7ee722623barEv,_ZThn8_N7ee722623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72262[0]),
  (VTBL_ENTRY)&_ZN7ee722623fooEv,
  (VTBL_ENTRY)&_ZN7ee722623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee722623fooEv,_ZTv0_n12_N7ee722623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee722623barEv,_ZTv0_n16_N7ee722623barEv),
};
extern VTBL_ENTRY _ZTV7ee72262[];
static  VTT_ENTRY vtt_ee72262[] = {
  {&(_ZTV7ee72262[3]),  3,11},
  {&(_ZTV7ee72262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72262[];
extern  VTBL_ENTRY _ZTV7ee72262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72262[];
static VTBL_ENTRY alt_thunk_names1053[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee722623barEv,_ZTv0_n16_N7ee722623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee722623barEv,_ZThn8_N7ee722623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee722623fooEv,_ZTv0_n12_N7ee722623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee722623fooEv,_ZThn8_N7ee722623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72262 = {  "ee72262", // class name
  bases_ee72262, 4,
  &(vtc_ee72262[0]), // expected_vtbl_contents
  &(vtt_ee72262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1053,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3262  : virtual cc262 {
  int d;
  virtual void  foo(); // _ZN6dd32623fooEv
  ~dd3262(); // tgen
  dd3262(); // tgen
};
//SIG(-1 dd3262) C1{ VBC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd3262 ::foo(){vfunc_called(this, "_ZN6dd32623fooEv");}
dd3262 ::~dd3262(){ note_dtor("dd3262", this);} // tgen
dd3262 ::dd3262(){ note_ctor("dd3262", this);} // tgen

static void Test_dd3262()
{
  extern Class_Descriptor cd_dd3262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3262, buf);
    dd3262 *dp, &lv = *(dp=new (buf) dd3262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,8), "dd3262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,8), "dd3262");
    check_base_class_offset(lv, (cc262*), ABISELECT(16,8), "dd3262");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3262.d");
    test_class_info(&lv, &cd_dd3262);
    dp->~dd3262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3262(Test_dd3262, "dd3262", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3262C1Ev();
extern void _ZN6dd3262D1Ev();
Name_Map name_map_dd3262[] = {
  NSPAIR(_ZN6dd3262C1Ev),
  NSPAIR(_ZN6dd3262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd3262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3262[];
extern void _ZN6dd32623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd3262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd3262[];
static  VTT_ENTRY vtt_dd3262[] = {
  {&(_ZTV6dd3262[3]),  3,10},
  {&(_ZTV6dd3262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static VTBL_ENTRY alt_thunk_names1054[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3262 = {  "dd3262", // class name
  bases_dd3262, 3,
  &(vtc_dd3262[0]), // expected_vtbl_contents
  &(vtt_dd3262[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3262),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1054,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03262  : dd3262 {
  int e;
  ~ee03262(); // tgen
  ee03262(); // tgen
};
//SIG(1 ee03262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee03262 ::~ee03262(){ note_dtor("ee03262", this);} // tgen
ee03262 ::ee03262(){ note_ctor("ee03262", this);} // tgen

static void Test_ee03262()
{
  extern Class_Descriptor cd_ee03262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03262, buf);
    ee03262 *dp, &lv = *(dp=new (buf) ee03262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee03262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee03262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(16,12), "ee03262");
    check_base_class_offset(lv, (dd3262*), 0, "ee03262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03262.e");
    test_class_info(&lv, &cd_ee03262);
    dp->~ee03262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03262(Test_ee03262, "ee03262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03262C1Ev();
extern void _ZN7ee03262D1Ev();
Name_Map name_map_ee03262[] = {
  NSPAIR(_ZN7ee03262C1Ev),
  NSPAIR(_ZN7ee03262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee03262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03262[];
extern void _ZN6dd32623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee03262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee03262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee03262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee03262[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee03262[] = {
  {&(_ZTV7ee03262[3]),  3,10},
  {&(_tg__ZTV6dd3262__7ee03262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee03262[4]),  4,6},
  {&(_ZTV7ee03262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03262[];
extern  VTBL_ENTRY _ZTV7ee03262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03262[];
static VTBL_ENTRY alt_thunk_names1055[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03262 = {  "ee03262", // class name
  bases_ee03262, 4,
  &(vtc_ee03262[0]), // expected_vtbl_contents
  &(vtt_ee03262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1055,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13262  : virtual dd3262 {
  int e;
  ~ee13262(); // tgen
  ee13262(); // tgen
};
//SIG(1 ee13262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee13262 ::~ee13262(){ note_dtor("ee13262", this);} // tgen
ee13262 ::ee13262(){ note_ctor("ee13262", this);} // tgen

static void Test_ee13262()
{
  extern Class_Descriptor cd_ee13262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13262, buf);
    ee13262 *dp, &lv = *(dp=new (buf) ee13262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee13262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee13262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(32,16), "ee13262");
    check_base_class_offset(lv, (dd3262*), ABISELECT(16,8), "ee13262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13262.e");
    test_class_info(&lv, &cd_ee13262);
    dp->~ee13262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13262(Test_ee13262, "ee13262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13262C1Ev();
extern void _ZN7ee13262D1Ev();
Name_Map name_map_ee13262[] = {
  NSPAIR(_ZN7ee13262C1Ev),
  NSPAIR(_ZN7ee13262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee13262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13262[];
extern void _ZN6dd32623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee13262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13262[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee13262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee13262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee13262[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee13262[] = {
  {&(_ZTV7ee13262[4]),  4,15},
  {&(_ZTV7ee13262[8]),  8,15},
  {&(_ZTV7ee13262[13]),  13,15},
  {&(_tg__ZTV6dd3262__7ee13262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee13262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13262[];
extern  VTBL_ENTRY _ZTV7ee13262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13262[];
static VTBL_ENTRY alt_thunk_names1056[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13262 = {  "ee13262", // class name
  bases_ee13262, 4,
  &(vtc_ee13262[0]), // expected_vtbl_contents
  &(vtt_ee13262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13262),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1056,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23262  : dd3262 {
  int e;
  virtual void  foo(); // _ZN7ee232623fooEv
  ~ee23262(); // tgen
  ee23262(); // tgen
};
//SIG(1 ee23262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee23262 ::foo(){vfunc_called(this, "_ZN7ee232623fooEv");}
ee23262 ::~ee23262(){ note_dtor("ee23262", this);} // tgen
ee23262 ::ee23262(){ note_ctor("ee23262", this);} // tgen

static void Test_ee23262()
{
  extern Class_Descriptor cd_ee23262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23262, buf);
    ee23262 *dp, &lv = *(dp=new (buf) ee23262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee23262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee23262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(16,12), "ee23262");
    check_base_class_offset(lv, (dd3262*), 0, "ee23262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23262.e");
    test_class_info(&lv, &cd_ee23262);
    dp->~ee23262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23262(Test_ee23262, "ee23262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23262C1Ev();
extern void _ZN7ee23262D1Ev();
Name_Map name_map_ee23262[] = {
  NSPAIR(_ZN7ee23262C1Ev),
  NSPAIR(_ZN7ee23262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee23262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23262[];
extern void _ZN7ee232623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee232623fooEv,_ZTv0_n12_N7ee232623fooEv)();
extern void ABISELECT(_ZThn16_N7ee232623fooEv,_ZThn12_N7ee232623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee23262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23262[0]),
  (VTBL_ENTRY)&_ZN7ee232623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee232623fooEv,_ZTv0_n12_N7ee232623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee23262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee23262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee23262[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee23262[] = {
  {&(_ZTV7ee23262[3]),  3,10},
  {&(_tg__ZTV6dd3262__7ee23262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee23262[4]),  4,6},
  {&(_ZTV7ee23262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23262[];
extern  VTBL_ENTRY _ZTV7ee23262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23262[];
static VTBL_ENTRY alt_thunk_names1057[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee232623fooEv,_ZTv0_n12_N7ee232623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee232623fooEv,_ZThn12_N7ee232623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23262 = {  "ee23262", // class name
  bases_ee23262, 4,
  &(vtc_ee23262[0]), // expected_vtbl_contents
  &(vtt_ee23262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1057,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33262  : virtual dd3262 {
  int e;
  virtual void  foo(); // _ZN7ee332623fooEv
  ~ee33262(); // tgen
  ee33262(); // tgen
};
//SIG(1 ee33262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee33262 ::foo(){vfunc_called(this, "_ZN7ee332623fooEv");}
ee33262 ::~ee33262(){ note_dtor("ee33262", this);} // tgen
ee33262 ::ee33262(){ note_ctor("ee33262", this);} // tgen

static void Test_ee33262()
{
  extern Class_Descriptor cd_ee33262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33262, buf);
    ee33262 *dp, &lv = *(dp=new (buf) ee33262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee33262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee33262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(32,16), "ee33262");
    check_base_class_offset(lv, (dd3262*), ABISELECT(16,8), "ee33262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33262.e");
    test_class_info(&lv, &cd_ee33262);
    dp->~ee33262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33262(Test_ee33262, "ee33262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33262C1Ev();
extern void _ZN7ee33262D1Ev();
Name_Map name_map_ee33262[] = {
  NSPAIR(_ZN7ee33262C1Ev),
  NSPAIR(_ZN7ee33262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee33262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33262[];
extern void _ZN7ee332623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee332623fooEv,_ZTv0_n16_N7ee332623fooEv)();
extern void ABISELECT(_ZThn16_N7ee332623fooEv,_ZThn8_N7ee332623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee332623fooEv,_ZTv0_n12_N7ee332623fooEv)();
extern void ABISELECT(_ZThn32_N7ee332623fooEv,_ZThn16_N7ee332623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee33262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33262[0]),
  (VTBL_ENTRY)&_ZN7ee332623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee332623fooEv,_ZTv0_n16_N7ee332623fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee332623fooEv,_ZTv0_n12_N7ee332623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee33262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee33262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee33262[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee33262[] = {
  {&(_ZTV7ee33262[4]),  4,16},
  {&(_ZTV7ee33262[9]),  9,16},
  {&(_ZTV7ee33262[14]),  14,16},
  {&(_tg__ZTV6dd3262__7ee33262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee33262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33262[];
extern  VTBL_ENTRY _ZTV7ee33262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33262[];
static VTBL_ENTRY alt_thunk_names1058[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee332623fooEv,_ZTv0_n12_N7ee332623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee332623fooEv,_ZThn16_N7ee332623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee332623fooEv,_ZTv0_n16_N7ee332623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee332623fooEv,_ZThn8_N7ee332623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33262 = {  "ee33262", // class name
  bases_ee33262, 4,
  &(vtc_ee33262[0]), // expected_vtbl_contents
  &(vtt_ee33262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33262),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1058,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43262  : dd3262 {
  int e;
  virtual void  bar(); // _ZN7ee432623barEv
  ~ee43262(); // tgen
  ee43262(); // tgen
};
//SIG(1 ee43262) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee43262 ::bar(){vfunc_called(this, "_ZN7ee432623barEv");}
ee43262 ::~ee43262(){ note_dtor("ee43262", this);} // tgen
ee43262 ::ee43262(){ note_ctor("ee43262", this);} // tgen

static void Test_ee43262()
{
  extern Class_Descriptor cd_ee43262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43262, buf);
    ee43262 *dp, &lv = *(dp=new (buf) ee43262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee43262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee43262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(16,12), "ee43262");
    check_base_class_offset(lv, (dd3262*), 0, "ee43262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43262.e");
    test_class_info(&lv, &cd_ee43262);
    dp->~ee43262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43262(Test_ee43262, "ee43262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43262C1Ev();
extern void _ZN7ee43262D1Ev();
Name_Map name_map_ee43262[] = {
  NSPAIR(_ZN7ee43262C1Ev),
  NSPAIR(_ZN7ee43262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee43262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43262[];
extern void _ZN6dd32623fooEv();
extern void _ZN7ee432623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee432623barEv,_ZTv0_n16_N7ee432623barEv)();
extern void ABISELECT(_ZThn16_N7ee432623barEv,_ZThn12_N7ee432623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
  (VTBL_ENTRY)&_ZN7ee432623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee432623barEv,_ZTv0_n16_N7ee432623barEv),
};
extern VTBL_ENTRY _ZTV7ee43262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee43262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee43262[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee43262[] = {
  {&(_ZTV7ee43262[3]),  3,11},
  {&(_tg__ZTV6dd3262__7ee43262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee43262[4]),  4,6},
  {&(_ZTV7ee43262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43262[];
extern  VTBL_ENTRY _ZTV7ee43262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43262[];
static VTBL_ENTRY alt_thunk_names1059[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee432623barEv,_ZTv0_n16_N7ee432623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee432623barEv,_ZThn12_N7ee432623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43262 = {  "ee43262", // class name
  bases_ee43262, 4,
  &(vtc_ee43262[0]), // expected_vtbl_contents
  &(vtt_ee43262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1059,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53262  : virtual dd3262 {
  int e;
  virtual void  bar(); // _ZN7ee532623barEv
  ~ee53262(); // tgen
  ee53262(); // tgen
};
//SIG(1 ee53262) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee53262 ::bar(){vfunc_called(this, "_ZN7ee532623barEv");}
ee53262 ::~ee53262(){ note_dtor("ee53262", this);} // tgen
ee53262 ::ee53262(){ note_ctor("ee53262", this);} // tgen

static void Test_ee53262()
{
  extern Class_Descriptor cd_ee53262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53262, buf);
    ee53262 *dp, &lv = *(dp=new (buf) ee53262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee53262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee53262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(32,16), "ee53262");
    check_base_class_offset(lv, (dd3262*), ABISELECT(16,8), "ee53262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53262.e");
    test_class_info(&lv, &cd_ee53262);
    dp->~ee53262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53262(Test_ee53262, "ee53262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53262C1Ev();
extern void _ZN7ee53262D1Ev();
Name_Map name_map_ee53262[] = {
  NSPAIR(_ZN7ee53262C1Ev),
  NSPAIR(_ZN7ee53262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee53262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53262[];
extern void _ZN7ee532623barEv();
extern void _ZN6dd32623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee532623barEv,_ZTv0_n16_N7ee532623barEv)();
extern void ABISELECT(_ZThn32_N7ee532623barEv,_ZThn16_N7ee532623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53262[0]),
  (VTBL_ENTRY)&_ZN7ee532623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee532623barEv,_ZTv0_n16_N7ee532623barEv),
};
extern VTBL_ENTRY _ZTV7ee53262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee53262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee53262[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee53262[] = {
  {&(_ZTV7ee53262[4]),  4,16},
  {&(_ZTV7ee53262[9]),  9,16},
  {&(_ZTV7ee53262[14]),  14,16},
  {&(_tg__ZTV6dd3262__7ee53262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee53262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53262[];
extern  VTBL_ENTRY _ZTV7ee53262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53262[];
static VTBL_ENTRY alt_thunk_names1060[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee532623barEv,_ZTv0_n16_N7ee532623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee532623barEv,_ZThn16_N7ee532623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53262 = {  "ee53262", // class name
  bases_ee53262, 4,
  &(vtc_ee53262[0]), // expected_vtbl_contents
  &(vtt_ee53262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53262),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1060,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63262  : dd3262 {
  int e;
  virtual void  foo(); // _ZN7ee632623fooEv
  virtual void  bar(); // _ZN7ee632623barEv
  ~ee63262(); // tgen
  ee63262(); // tgen
};
//SIG(1 ee63262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee63262 ::foo(){vfunc_called(this, "_ZN7ee632623fooEv");}
void  ee63262 ::bar(){vfunc_called(this, "_ZN7ee632623barEv");}
ee63262 ::~ee63262(){ note_dtor("ee63262", this);} // tgen
ee63262 ::ee63262(){ note_ctor("ee63262", this);} // tgen

static void Test_ee63262()
{
  extern Class_Descriptor cd_ee63262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63262, buf);
    ee63262 *dp, &lv = *(dp=new (buf) ee63262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee63262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee63262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(16,12), "ee63262");
    check_base_class_offset(lv, (dd3262*), 0, "ee63262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63262.e");
    test_class_info(&lv, &cd_ee63262);
    dp->~ee63262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63262(Test_ee63262, "ee63262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63262C1Ev();
extern void _ZN7ee63262D1Ev();
Name_Map name_map_ee63262[] = {
  NSPAIR(_ZN7ee63262C1Ev),
  NSPAIR(_ZN7ee63262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee63262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63262[];
extern void _ZN7ee632623fooEv();
extern void _ZN7ee632623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee632623fooEv,_ZTv0_n12_N7ee632623fooEv)();
extern void ABISELECT(_ZThn16_N7ee632623fooEv,_ZThn12_N7ee632623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee632623barEv,_ZTv0_n16_N7ee632623barEv)();
extern void ABISELECT(_ZThn16_N7ee632623barEv,_ZThn12_N7ee632623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63262[0]),
  (VTBL_ENTRY)&_ZN7ee632623fooEv,
  (VTBL_ENTRY)&_ZN7ee632623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee632623fooEv,_ZTv0_n12_N7ee632623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee632623barEv,_ZTv0_n16_N7ee632623barEv),
};
extern VTBL_ENTRY _ZTV7ee63262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee63262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee63262[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee63262[] = {
  {&(_ZTV7ee63262[3]),  3,11},
  {&(_tg__ZTV6dd3262__7ee63262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee63262[4]),  4,6},
  {&(_ZTV7ee63262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63262[];
extern  VTBL_ENTRY _ZTV7ee63262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63262[];
static VTBL_ENTRY alt_thunk_names1061[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn12_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee632623barEv,_ZTv0_n16_N7ee632623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee632623barEv,_ZThn12_N7ee632623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee632623fooEv,_ZTv0_n12_N7ee632623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee632623fooEv,_ZThn12_N7ee632623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63262 = {  "ee63262", // class name
  bases_ee63262, 4,
  &(vtc_ee63262[0]), // expected_vtbl_contents
  &(vtt_ee63262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1061,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73262  : virtual dd3262 {
  int e;
  virtual void  foo(); // _ZN7ee732623fooEv
  virtual void  bar(); // _ZN7ee732623barEv
  ~ee73262(); // tgen
  ee73262(); // tgen
};
//SIG(1 ee73262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee73262 ::foo(){vfunc_called(this, "_ZN7ee732623fooEv");}
void  ee73262 ::bar(){vfunc_called(this, "_ZN7ee732623barEv");}
ee73262 ::~ee73262(){ note_dtor("ee73262", this);} // tgen
ee73262 ::ee73262(){ note_ctor("ee73262", this);} // tgen

static void Test_ee73262()
{
  extern Class_Descriptor cd_ee73262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73262, buf);
    ee73262 *dp, &lv = *(dp=new (buf) ee73262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee73262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee73262");
    check_base_class_offset(lv, (cc262*)(dd3262*), ABISELECT(32,16), "ee73262");
    check_base_class_offset(lv, (dd3262*), ABISELECT(16,8), "ee73262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73262.e");
    test_class_info(&lv, &cd_ee73262);
    dp->~ee73262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73262(Test_ee73262, "ee73262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73262C1Ev();
extern void _ZN7ee73262D1Ev();
Name_Map name_map_ee73262[] = {
  NSPAIR(_ZN7ee73262C1Ev),
  NSPAIR(_ZN7ee73262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd3262;
extern VTBL_ENTRY _ZTI6dd3262[];
extern  VTBL_ENTRY _ZTV6dd3262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3262[];
static Base_Class bases_ee73262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3262,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73262[];
extern void _ZN7ee732623fooEv();
extern void _ZN7ee732623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee732623fooEv,_ZTv0_n16_N7ee732623fooEv)();
extern void ABISELECT(_ZThn16_N7ee732623fooEv,_ZThn8_N7ee732623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee732623fooEv,_ZTv0_n12_N7ee732623fooEv)();
extern void ABISELECT(_ZThn32_N7ee732623fooEv,_ZThn16_N7ee732623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee732623barEv,_ZTv0_n16_N7ee732623barEv)();
extern void ABISELECT(_ZThn32_N7ee732623barEv,_ZThn16_N7ee732623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73262[0]),
  (VTBL_ENTRY)&_ZN7ee732623fooEv,
  (VTBL_ENTRY)&_ZN7ee732623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee732623fooEv,_ZTv0_n16_N7ee732623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee732623fooEv,_ZTv0_n12_N7ee732623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee732623barEv,_ZTv0_n16_N7ee732623barEv),
};
extern VTBL_ENTRY _ZTV7ee73262[];
extern void _ZN6dd32623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3262__7ee73262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&_ZN6dd32623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv)();
extern void ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV5cc262__6dd3262__7ee73262[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee73262[] = {
  {&(_ZTV7ee73262[4]),  4,17},
  {&(_ZTV7ee73262[10]),  10,17},
  {&(_ZTV7ee73262[15]),  15,17},
  {&(_tg__ZTV6dd3262__7ee73262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd3262__7ee73262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73262[];
extern  VTBL_ENTRY _ZTV7ee73262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73262[];
static VTBL_ENTRY alt_thunk_names1062[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd32623fooEv,_ZTv0_n12_N6dd32623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd32623fooEv,_ZThn8_N6dd32623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee732623barEv,_ZTv0_n16_N7ee732623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee732623barEv,_ZThn16_N7ee732623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee732623fooEv,_ZTv0_n12_N7ee732623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee732623fooEv,_ZThn16_N7ee732623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee732623fooEv,_ZTv0_n16_N7ee732623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee732623fooEv,_ZThn8_N7ee732623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73262 = {  "ee73262", // class name
  bases_ee73262, 4,
  &(vtc_ee73262[0]), // expected_vtbl_contents
  &(vtt_ee73262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73262),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1062,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4262  : cc262 {
  int d;
  virtual void  bar(); // _ZN6dd42623barEv
  ~dd4262(); // tgen
  dd4262(); // tgen
};
//SIG(-1 dd4262) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd4262 ::bar(){vfunc_called(this, "_ZN6dd42623barEv");}
dd4262 ::~dd4262(){ note_dtor("dd4262", this);} // tgen
dd4262 ::dd4262(){ note_ctor("dd4262", this);} // tgen

static void Test_dd4262()
{
  extern Class_Descriptor cd_dd4262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4262, buf);
    dd4262 *dp, &lv = *(dp=new (buf) dd4262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), 0, "dd4262");
    check_base_class_offset(lv, (bb62*)(cc262*), 0, "dd4262");
    check_base_class_offset(lv, (cc262*), 0, "dd4262");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4262.d");
    test_class_info(&lv, &cd_dd4262);
    dp->~dd4262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4262(Test_dd4262, "dd4262", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4262C1Ev();
extern void _ZN6dd4262D1Ev();
Name_Map name_map_dd4262[] = {
  NSPAIR(_ZN6dd4262C1Ev),
  NSPAIR(_ZN6dd4262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd4262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4262[];
extern void _ZN5cc2623fooEv();
extern void _ZN6dd42623barEv();
static  VTBL_ENTRY vtc_dd4262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN6dd42623barEv,
};
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
Class_Descriptor cd_dd4262 = {  "dd4262", // class name
  bases_dd4262, 3,
  &(vtc_dd4262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4262),4, //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  ee04262  : dd4262 {
  int e;
  ~ee04262(); // tgen
  ee04262(); // tgen
};
//SIG(1 ee04262) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee04262 ::~ee04262(){ note_dtor("ee04262", this);} // tgen
ee04262 ::ee04262(){ note_ctor("ee04262", this);} // tgen

static void Test_ee04262()
{
  extern Class_Descriptor cd_ee04262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04262, buf);
    ee04262 *dp, &lv = *(dp=new (buf) ee04262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), 0, "ee04262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), 0, "ee04262");
    check_base_class_offset(lv, (cc262*)(dd4262*), 0, "ee04262");
    check_base_class_offset(lv, (dd4262*), 0, "ee04262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04262.e");
    test_class_info(&lv, &cd_ee04262);
    dp->~ee04262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04262(Test_ee04262, "ee04262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04262C1Ev();
extern void _ZN7ee04262D1Ev();
Name_Map name_map_ee04262[] = {
  NSPAIR(_ZN7ee04262C1Ev),
  NSPAIR(_ZN7ee04262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee04262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04262[];
extern void _ZN5cc2623fooEv();
extern void _ZN6dd42623barEv();
static  VTBL_ENTRY vtc_ee04262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN6dd42623barEv,
};
extern VTBL_ENTRY _ZTI7ee04262[];
extern  VTBL_ENTRY _ZTV7ee04262[];
Class_Descriptor cd_ee04262 = {  "ee04262", // class name
  bases_ee04262, 4,
  &(vtc_ee04262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04262),4, //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  ee14262  : virtual dd4262 {
  int e;
  ~ee14262(); // tgen
  ee14262(); // tgen
};
//SIG(1 ee14262) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee14262 ::~ee14262(){ note_dtor("ee14262", this);} // tgen
ee14262 ::ee14262(){ note_ctor("ee14262", this);} // tgen

static void Test_ee14262()
{
  extern Class_Descriptor cd_ee14262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14262, buf);
    ee14262 *dp, &lv = *(dp=new (buf) ee14262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee14262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee14262");
    check_base_class_offset(lv, (cc262*)(dd4262*), ABISELECT(16,8), "ee14262");
    check_base_class_offset(lv, (dd4262*), ABISELECT(16,8), "ee14262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14262.e");
    test_class_info(&lv, &cd_ee14262);
    dp->~ee14262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14262(Test_ee14262, "ee14262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14262C1Ev();
extern void _ZN7ee14262D1Ev();
Name_Map name_map_ee14262[] = {
  NSPAIR(_ZN7ee14262C1Ev),
  NSPAIR(_ZN7ee14262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee14262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14262[];
extern void _ZN5cc2623fooEv();
extern void _ZN6dd42623barEv();
static  VTBL_ENTRY vtc_ee14262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14262[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN6dd42623barEv,
};
extern VTBL_ENTRY _ZTV7ee14262[];
static  VTT_ENTRY vtt_ee14262[] = {
  {&(_ZTV7ee14262[3]),  3,9},
  {&(_ZTV7ee14262[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14262[];
extern  VTBL_ENTRY _ZTV7ee14262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14262[];
Class_Descriptor cd_ee14262 = {  "ee14262", // class name
  bases_ee14262, 4,
  &(vtc_ee14262[0]), // expected_vtbl_contents
  &(vtt_ee14262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14262),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14262),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  ee24262  : dd4262 {
  int e;
  virtual void  foo(); // _ZN7ee242623fooEv
  ~ee24262(); // tgen
  ee24262(); // tgen
};
//SIG(1 ee24262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee24262 ::foo(){vfunc_called(this, "_ZN7ee242623fooEv");}
ee24262 ::~ee24262(){ note_dtor("ee24262", this);} // tgen
ee24262 ::ee24262(){ note_ctor("ee24262", this);} // tgen

static void Test_ee24262()
{
  extern Class_Descriptor cd_ee24262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24262, buf);
    ee24262 *dp, &lv = *(dp=new (buf) ee24262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), 0, "ee24262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), 0, "ee24262");
    check_base_class_offset(lv, (cc262*)(dd4262*), 0, "ee24262");
    check_base_class_offset(lv, (dd4262*), 0, "ee24262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24262.e");
    test_class_info(&lv, &cd_ee24262);
    dp->~ee24262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24262(Test_ee24262, "ee24262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24262C1Ev();
extern void _ZN7ee24262D1Ev();
Name_Map name_map_ee24262[] = {
  NSPAIR(_ZN7ee24262C1Ev),
  NSPAIR(_ZN7ee24262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee24262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24262[];
extern void _ZN7ee242623fooEv();
extern void _ZN6dd42623barEv();
static  VTBL_ENTRY vtc_ee24262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24262[0]),
  (VTBL_ENTRY)&_ZN7ee242623fooEv,
  (VTBL_ENTRY)&_ZN6dd42623barEv,
};
extern VTBL_ENTRY _ZTI7ee24262[];
extern  VTBL_ENTRY _ZTV7ee24262[];
Class_Descriptor cd_ee24262 = {  "ee24262", // class name
  bases_ee24262, 4,
  &(vtc_ee24262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24262),4, //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  ee34262  : virtual dd4262 {
  int e;
  virtual void  foo(); // _ZN7ee342623fooEv
  ~ee34262(); // tgen
  ee34262(); // tgen
};
//SIG(1 ee34262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee34262 ::foo(){vfunc_called(this, "_ZN7ee342623fooEv");}
ee34262 ::~ee34262(){ note_dtor("ee34262", this);} // tgen
ee34262 ::ee34262(){ note_ctor("ee34262", this);} // tgen

static void Test_ee34262()
{
  extern Class_Descriptor cd_ee34262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34262, buf);
    ee34262 *dp, &lv = *(dp=new (buf) ee34262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee34262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee34262");
    check_base_class_offset(lv, (cc262*)(dd4262*), ABISELECT(16,8), "ee34262");
    check_base_class_offset(lv, (dd4262*), ABISELECT(16,8), "ee34262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34262.e");
    test_class_info(&lv, &cd_ee34262);
    dp->~ee34262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34262(Test_ee34262, "ee34262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34262C1Ev();
extern void _ZN7ee34262D1Ev();
Name_Map name_map_ee34262[] = {
  NSPAIR(_ZN7ee34262C1Ev),
  NSPAIR(_ZN7ee34262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee34262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34262[];
extern void _ZN7ee342623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee342623fooEv,_ZTv0_n12_N7ee342623fooEv)();
extern void ABISELECT(_ZThn16_N7ee342623fooEv,_ZThn8_N7ee342623fooEv)() __attribute__((weak));
extern void _ZN6dd42623barEv();
static  VTBL_ENTRY vtc_ee34262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34262[0]),
  (VTBL_ENTRY)&_ZN7ee342623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee342623fooEv,_ZTv0_n12_N7ee342623fooEv),
  (VTBL_ENTRY)&_ZN6dd42623barEv,
};
extern VTBL_ENTRY _ZTV7ee34262[];
static  VTT_ENTRY vtt_ee34262[] = {
  {&(_ZTV7ee34262[3]),  3,10},
  {&(_ZTV7ee34262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34262[];
extern  VTBL_ENTRY _ZTV7ee34262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34262[];
static VTBL_ENTRY alt_thunk_names1063[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee342623fooEv,_ZTv0_n12_N7ee342623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee342623fooEv,_ZThn8_N7ee342623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34262 = {  "ee34262", // class name
  bases_ee34262, 4,
  &(vtc_ee34262[0]), // expected_vtbl_contents
  &(vtt_ee34262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1063,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44262  : dd4262 {
  int e;
  virtual void  bar(); // _ZN7ee442623barEv
  ~ee44262(); // tgen
  ee44262(); // tgen
};
//SIG(1 ee44262) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee44262 ::bar(){vfunc_called(this, "_ZN7ee442623barEv");}
ee44262 ::~ee44262(){ note_dtor("ee44262", this);} // tgen
ee44262 ::ee44262(){ note_ctor("ee44262", this);} // tgen

static void Test_ee44262()
{
  extern Class_Descriptor cd_ee44262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44262, buf);
    ee44262 *dp, &lv = *(dp=new (buf) ee44262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), 0, "ee44262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), 0, "ee44262");
    check_base_class_offset(lv, (cc262*)(dd4262*), 0, "ee44262");
    check_base_class_offset(lv, (dd4262*), 0, "ee44262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44262.e");
    test_class_info(&lv, &cd_ee44262);
    dp->~ee44262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44262(Test_ee44262, "ee44262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44262C1Ev();
extern void _ZN7ee44262D1Ev();
Name_Map name_map_ee44262[] = {
  NSPAIR(_ZN7ee44262C1Ev),
  NSPAIR(_ZN7ee44262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee44262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44262[];
extern void _ZN5cc2623fooEv();
extern void _ZN7ee442623barEv();
static  VTBL_ENTRY vtc_ee44262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&_ZN7ee442623barEv,
};
extern VTBL_ENTRY _ZTI7ee44262[];
extern  VTBL_ENTRY _ZTV7ee44262[];
Class_Descriptor cd_ee44262 = {  "ee44262", // class name
  bases_ee44262, 4,
  &(vtc_ee44262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44262),4, //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  ee54262  : virtual dd4262 {
  int e;
  virtual void  bar(); // _ZN7ee542623barEv
  ~ee54262(); // tgen
  ee54262(); // tgen
};
//SIG(1 ee54262) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee54262 ::bar(){vfunc_called(this, "_ZN7ee542623barEv");}
ee54262 ::~ee54262(){ note_dtor("ee54262", this);} // tgen
ee54262 ::ee54262(){ note_ctor("ee54262", this);} // tgen

static void Test_ee54262()
{
  extern Class_Descriptor cd_ee54262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54262, buf);
    ee54262 *dp, &lv = *(dp=new (buf) ee54262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee54262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee54262");
    check_base_class_offset(lv, (cc262*)(dd4262*), ABISELECT(16,8), "ee54262");
    check_base_class_offset(lv, (dd4262*), ABISELECT(16,8), "ee54262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54262.e");
    test_class_info(&lv, &cd_ee54262);
    dp->~ee54262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54262(Test_ee54262, "ee54262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54262C1Ev();
extern void _ZN7ee54262D1Ev();
Name_Map name_map_ee54262[] = {
  NSPAIR(_ZN7ee54262C1Ev),
  NSPAIR(_ZN7ee54262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee54262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54262[];
extern void _ZN7ee542623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee542623barEv,_ZTv0_n16_N7ee542623barEv)();
extern void ABISELECT(_ZThn16_N7ee542623barEv,_ZThn8_N7ee542623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54262[0]),
  (VTBL_ENTRY)&_ZN7ee542623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee542623barEv,_ZTv0_n16_N7ee542623barEv),
};
extern VTBL_ENTRY _ZTV7ee54262[];
static  VTT_ENTRY vtt_ee54262[] = {
  {&(_ZTV7ee54262[3]),  3,10},
  {&(_ZTV7ee54262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54262[];
extern  VTBL_ENTRY _ZTV7ee54262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54262[];
static VTBL_ENTRY alt_thunk_names1064[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee542623barEv,_ZTv0_n16_N7ee542623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee542623barEv,_ZThn8_N7ee542623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54262 = {  "ee54262", // class name
  bases_ee54262, 4,
  &(vtc_ee54262[0]), // expected_vtbl_contents
  &(vtt_ee54262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1064,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64262  : dd4262 {
  int e;
  virtual void  foo(); // _ZN7ee642623fooEv
  virtual void  bar(); // _ZN7ee642623barEv
  ~ee64262(); // tgen
  ee64262(); // tgen
};
//SIG(1 ee64262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee64262 ::foo(){vfunc_called(this, "_ZN7ee642623fooEv");}
void  ee64262 ::bar(){vfunc_called(this, "_ZN7ee642623barEv");}
ee64262 ::~ee64262(){ note_dtor("ee64262", this);} // tgen
ee64262 ::ee64262(){ note_ctor("ee64262", this);} // tgen

static void Test_ee64262()
{
  extern Class_Descriptor cd_ee64262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64262, buf);
    ee64262 *dp, &lv = *(dp=new (buf) ee64262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), 0, "ee64262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), 0, "ee64262");
    check_base_class_offset(lv, (cc262*)(dd4262*), 0, "ee64262");
    check_base_class_offset(lv, (dd4262*), 0, "ee64262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64262.e");
    test_class_info(&lv, &cd_ee64262);
    dp->~ee64262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64262(Test_ee64262, "ee64262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64262C1Ev();
extern void _ZN7ee64262D1Ev();
Name_Map name_map_ee64262[] = {
  NSPAIR(_ZN7ee64262C1Ev),
  NSPAIR(_ZN7ee64262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee64262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64262[];
extern void _ZN7ee642623fooEv();
extern void _ZN7ee642623barEv();
static  VTBL_ENTRY vtc_ee64262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64262[0]),
  (VTBL_ENTRY)&_ZN7ee642623fooEv,
  (VTBL_ENTRY)&_ZN7ee642623barEv,
};
extern VTBL_ENTRY _ZTI7ee64262[];
extern  VTBL_ENTRY _ZTV7ee64262[];
Class_Descriptor cd_ee64262 = {  "ee64262", // class name
  bases_ee64262, 4,
  &(vtc_ee64262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64262),4, //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  ee74262  : virtual dd4262 {
  int e;
  virtual void  foo(); // _ZN7ee742623fooEv
  virtual void  bar(); // _ZN7ee742623barEv
  ~ee74262(); // tgen
  ee74262(); // tgen
};
//SIG(1 ee74262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee74262 ::foo(){vfunc_called(this, "_ZN7ee742623fooEv");}
void  ee74262 ::bar(){vfunc_called(this, "_ZN7ee742623barEv");}
ee74262 ::~ee74262(){ note_dtor("ee74262", this);} // tgen
ee74262 ::ee74262(){ note_ctor("ee74262", this);} // tgen

static void Test_ee74262()
{
  extern Class_Descriptor cd_ee74262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74262, buf);
    ee74262 *dp, &lv = *(dp=new (buf) ee74262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee74262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd4262*), ABISELECT(16,8), "ee74262");
    check_base_class_offset(lv, (cc262*)(dd4262*), ABISELECT(16,8), "ee74262");
    check_base_class_offset(lv, (dd4262*), ABISELECT(16,8), "ee74262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74262.e");
    test_class_info(&lv, &cd_ee74262);
    dp->~ee74262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74262(Test_ee74262, "ee74262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74262C1Ev();
extern void _ZN7ee74262D1Ev();
Name_Map name_map_ee74262[] = {
  NSPAIR(_ZN7ee74262C1Ev),
  NSPAIR(_ZN7ee74262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd4262;
extern VTBL_ENTRY _ZTI6dd4262[];
extern  VTBL_ENTRY _ZTV6dd4262[];
static Base_Class bases_ee74262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4262,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74262[];
extern void _ZN7ee742623fooEv();
extern void _ZN7ee742623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee742623fooEv,_ZTv0_n12_N7ee742623fooEv)();
extern void ABISELECT(_ZThn16_N7ee742623fooEv,_ZThn8_N7ee742623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee742623barEv,_ZTv0_n16_N7ee742623barEv)();
extern void ABISELECT(_ZThn16_N7ee742623barEv,_ZThn8_N7ee742623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74262[0]),
  (VTBL_ENTRY)&_ZN7ee742623fooEv,
  (VTBL_ENTRY)&_ZN7ee742623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee742623fooEv,_ZTv0_n12_N7ee742623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee742623barEv,_ZTv0_n16_N7ee742623barEv),
};
extern VTBL_ENTRY _ZTV7ee74262[];
static  VTT_ENTRY vtt_ee74262[] = {
  {&(_ZTV7ee74262[3]),  3,11},
  {&(_ZTV7ee74262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74262[];
extern  VTBL_ENTRY _ZTV7ee74262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74262[];
static VTBL_ENTRY alt_thunk_names1065[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee742623barEv,_ZTv0_n16_N7ee742623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee742623barEv,_ZThn8_N7ee742623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee742623fooEv,_ZTv0_n12_N7ee742623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee742623fooEv,_ZThn8_N7ee742623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74262 = {  "ee74262", // class name
  bases_ee74262, 4,
  &(vtc_ee74262[0]), // expected_vtbl_contents
  &(vtt_ee74262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1065,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5262  : virtual cc262 {
  int d;
  virtual void  bar(); // _ZN6dd52623barEv
  ~dd5262(); // tgen
  dd5262(); // tgen
};
//SIG(-1 dd5262) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd5262 ::bar(){vfunc_called(this, "_ZN6dd52623barEv");}
dd5262 ::~dd5262(){ note_dtor("dd5262", this);} // tgen
dd5262 ::dd5262(){ note_ctor("dd5262", this);} // tgen

static void Test_dd5262()
{
  extern Class_Descriptor cd_dd5262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5262, buf);
    dd5262 *dp, &lv = *(dp=new (buf) dd5262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,8), "dd5262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,8), "dd5262");
    check_base_class_offset(lv, (cc262*), ABISELECT(16,8), "dd5262");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5262.d");
    test_class_info(&lv, &cd_dd5262);
    dp->~dd5262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5262(Test_dd5262, "dd5262", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5262C1Ev();
extern void _ZN6dd5262D1Ev();
Name_Map name_map_dd5262[] = {
  NSPAIR(_ZN6dd5262C1Ev),
  NSPAIR(_ZN6dd5262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd5262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5262[];
extern void _ZN6dd52623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
extern VTBL_ENTRY _ZTV6dd5262[];
static  VTT_ENTRY vtt_dd5262[] = {
  {&(_ZTV6dd5262[3]),  3,10},
  {&(_ZTV6dd5262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static VTBL_ENTRY alt_thunk_names1066[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5262 = {  "dd5262", // class name
  bases_dd5262, 3,
  &(vtc_dd5262[0]), // expected_vtbl_contents
  &(vtt_dd5262[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5262),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1066,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05262  : dd5262 {
  int e;
  ~ee05262(); // tgen
  ee05262(); // tgen
};
//SIG(1 ee05262) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee05262 ::~ee05262(){ note_dtor("ee05262", this);} // tgen
ee05262 ::ee05262(){ note_ctor("ee05262", this);} // tgen

static void Test_ee05262()
{
  extern Class_Descriptor cd_ee05262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05262, buf);
    ee05262 *dp, &lv = *(dp=new (buf) ee05262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee05262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee05262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(16,12), "ee05262");
    check_base_class_offset(lv, (dd5262*), 0, "ee05262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05262.e");
    test_class_info(&lv, &cd_ee05262);
    dp->~ee05262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05262(Test_ee05262, "ee05262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05262C1Ev();
extern void _ZN7ee05262D1Ev();
Name_Map name_map_ee05262[] = {
  NSPAIR(_ZN7ee05262C1Ev),
  NSPAIR(_ZN7ee05262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee05262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05262[];
extern void _ZN6dd52623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
extern VTBL_ENTRY _ZTV7ee05262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee05262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee05262[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee05262[] = {
  {&(_ZTV7ee05262[3]),  3,10},
  {&(_tg__ZTV6dd5262__7ee05262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee05262[4]),  4,6},
  {&(_ZTV7ee05262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05262[];
extern  VTBL_ENTRY _ZTV7ee05262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05262[];
static VTBL_ENTRY alt_thunk_names1067[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05262 = {  "ee05262", // class name
  bases_ee05262, 4,
  &(vtc_ee05262[0]), // expected_vtbl_contents
  &(vtt_ee05262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1067,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15262  : virtual dd5262 {
  int e;
  ~ee15262(); // tgen
  ee15262(); // tgen
};
//SIG(1 ee15262) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee15262 ::~ee15262(){ note_dtor("ee15262", this);} // tgen
ee15262 ::ee15262(){ note_ctor("ee15262", this);} // tgen

static void Test_ee15262()
{
  extern Class_Descriptor cd_ee15262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15262, buf);
    ee15262 *dp, &lv = *(dp=new (buf) ee15262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee15262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee15262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(32,16), "ee15262");
    check_base_class_offset(lv, (dd5262*), ABISELECT(16,8), "ee15262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15262.e");
    test_class_info(&lv, &cd_ee15262);
    dp->~ee15262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15262(Test_ee15262, "ee15262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15262C1Ev();
extern void _ZN7ee15262D1Ev();
Name_Map name_map_ee15262[] = {
  NSPAIR(_ZN7ee15262C1Ev),
  NSPAIR(_ZN7ee15262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee15262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15262[];
extern void _ZN6dd52623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15262[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
extern VTBL_ENTRY _ZTV7ee15262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee15262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee15262[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee15262[] = {
  {&(_ZTV7ee15262[4]),  4,15},
  {&(_ZTV7ee15262[8]),  8,15},
  {&(_ZTV7ee15262[13]),  13,15},
  {&(_tg__ZTV6dd5262__7ee15262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee15262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15262[];
extern  VTBL_ENTRY _ZTV7ee15262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15262[];
static VTBL_ENTRY alt_thunk_names1068[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15262 = {  "ee15262", // class name
  bases_ee15262, 4,
  &(vtc_ee15262[0]), // expected_vtbl_contents
  &(vtt_ee15262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15262),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1068,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25262  : dd5262 {
  int e;
  virtual void  foo(); // _ZN7ee252623fooEv
  ~ee25262(); // tgen
  ee25262(); // tgen
};
//SIG(1 ee25262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee25262 ::foo(){vfunc_called(this, "_ZN7ee252623fooEv");}
ee25262 ::~ee25262(){ note_dtor("ee25262", this);} // tgen
ee25262 ::ee25262(){ note_ctor("ee25262", this);} // tgen

static void Test_ee25262()
{
  extern Class_Descriptor cd_ee25262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25262, buf);
    ee25262 *dp, &lv = *(dp=new (buf) ee25262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee25262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee25262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(16,12), "ee25262");
    check_base_class_offset(lv, (dd5262*), 0, "ee25262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25262.e");
    test_class_info(&lv, &cd_ee25262);
    dp->~ee25262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25262(Test_ee25262, "ee25262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25262C1Ev();
extern void _ZN7ee25262D1Ev();
Name_Map name_map_ee25262[] = {
  NSPAIR(_ZN7ee25262C1Ev),
  NSPAIR(_ZN7ee25262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee25262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25262[];
extern void _ZN6dd52623barEv();
extern void _ZN7ee252623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee252623fooEv,_ZTv0_n12_N7ee252623fooEv)();
extern void ABISELECT(_ZThn16_N7ee252623fooEv,_ZThn12_N7ee252623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
  (VTBL_ENTRY)&_ZN7ee252623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee252623fooEv,_ZTv0_n12_N7ee252623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
extern VTBL_ENTRY _ZTV7ee25262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee25262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee25262[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee25262[] = {
  {&(_ZTV7ee25262[3]),  3,11},
  {&(_tg__ZTV6dd5262__7ee25262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee25262[4]),  4,6},
  {&(_ZTV7ee25262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25262[];
extern  VTBL_ENTRY _ZTV7ee25262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25262[];
static VTBL_ENTRY alt_thunk_names1069[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee252623fooEv,_ZTv0_n12_N7ee252623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee252623fooEv,_ZThn12_N7ee252623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25262 = {  "ee25262", // class name
  bases_ee25262, 4,
  &(vtc_ee25262[0]), // expected_vtbl_contents
  &(vtt_ee25262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1069,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35262  : virtual dd5262 {
  int e;
  virtual void  foo(); // _ZN7ee352623fooEv
  ~ee35262(); // tgen
  ee35262(); // tgen
};
//SIG(1 ee35262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee35262 ::foo(){vfunc_called(this, "_ZN7ee352623fooEv");}
ee35262 ::~ee35262(){ note_dtor("ee35262", this);} // tgen
ee35262 ::ee35262(){ note_ctor("ee35262", this);} // tgen

static void Test_ee35262()
{
  extern Class_Descriptor cd_ee35262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35262, buf);
    ee35262 *dp, &lv = *(dp=new (buf) ee35262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee35262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee35262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(32,16), "ee35262");
    check_base_class_offset(lv, (dd5262*), ABISELECT(16,8), "ee35262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35262.e");
    test_class_info(&lv, &cd_ee35262);
    dp->~ee35262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35262(Test_ee35262, "ee35262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35262C1Ev();
extern void _ZN7ee35262D1Ev();
Name_Map name_map_ee35262[] = {
  NSPAIR(_ZN7ee35262C1Ev),
  NSPAIR(_ZN7ee35262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee35262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35262[];
extern void _ZN7ee352623fooEv();
extern void _ZN6dd52623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee352623fooEv,_ZTv0_n12_N7ee352623fooEv)();
extern void ABISELECT(_ZThn32_N7ee352623fooEv,_ZThn16_N7ee352623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35262[0]),
  (VTBL_ENTRY)&_ZN7ee352623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee352623fooEv,_ZTv0_n12_N7ee352623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
extern VTBL_ENTRY _ZTV7ee35262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee35262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee35262[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee35262[] = {
  {&(_ZTV7ee35262[4]),  4,16},
  {&(_ZTV7ee35262[9]),  9,16},
  {&(_ZTV7ee35262[14]),  14,16},
  {&(_tg__ZTV6dd5262__7ee35262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee35262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35262[];
extern  VTBL_ENTRY _ZTV7ee35262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35262[];
static VTBL_ENTRY alt_thunk_names1070[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee352623fooEv,_ZTv0_n12_N7ee352623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee352623fooEv,_ZThn16_N7ee352623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35262 = {  "ee35262", // class name
  bases_ee35262, 4,
  &(vtc_ee35262[0]), // expected_vtbl_contents
  &(vtt_ee35262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35262),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1070,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45262  : dd5262 {
  int e;
  virtual void  bar(); // _ZN7ee452623barEv
  ~ee45262(); // tgen
  ee45262(); // tgen
};
//SIG(1 ee45262) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee45262 ::bar(){vfunc_called(this, "_ZN7ee452623barEv");}
ee45262 ::~ee45262(){ note_dtor("ee45262", this);} // tgen
ee45262 ::ee45262(){ note_ctor("ee45262", this);} // tgen

static void Test_ee45262()
{
  extern Class_Descriptor cd_ee45262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45262, buf);
    ee45262 *dp, &lv = *(dp=new (buf) ee45262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee45262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee45262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(16,12), "ee45262");
    check_base_class_offset(lv, (dd5262*), 0, "ee45262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45262.e");
    test_class_info(&lv, &cd_ee45262);
    dp->~ee45262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45262(Test_ee45262, "ee45262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45262C1Ev();
extern void _ZN7ee45262D1Ev();
Name_Map name_map_ee45262[] = {
  NSPAIR(_ZN7ee45262C1Ev),
  NSPAIR(_ZN7ee45262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee45262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45262[];
extern void _ZN7ee452623barEv();
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee452623barEv,_ZTv0_n16_N7ee452623barEv)();
extern void ABISELECT(_ZThn16_N7ee452623barEv,_ZThn12_N7ee452623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45262[0]),
  (VTBL_ENTRY)&_ZN7ee452623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee452623barEv,_ZTv0_n16_N7ee452623barEv),
};
extern VTBL_ENTRY _ZTV7ee45262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee45262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee45262[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee45262[] = {
  {&(_ZTV7ee45262[3]),  3,10},
  {&(_tg__ZTV6dd5262__7ee45262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee45262[4]),  4,6},
  {&(_ZTV7ee45262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45262[];
extern  VTBL_ENTRY _ZTV7ee45262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45262[];
static VTBL_ENTRY alt_thunk_names1071[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee452623barEv,_ZTv0_n16_N7ee452623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee452623barEv,_ZThn12_N7ee452623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45262 = {  "ee45262", // class name
  bases_ee45262, 4,
  &(vtc_ee45262[0]), // expected_vtbl_contents
  &(vtt_ee45262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1071,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55262  : virtual dd5262 {
  int e;
  virtual void  bar(); // _ZN7ee552623barEv
  ~ee55262(); // tgen
  ee55262(); // tgen
};
//SIG(1 ee55262) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee55262 ::bar(){vfunc_called(this, "_ZN7ee552623barEv");}
ee55262 ::~ee55262(){ note_dtor("ee55262", this);} // tgen
ee55262 ::ee55262(){ note_ctor("ee55262", this);} // tgen

static void Test_ee55262()
{
  extern Class_Descriptor cd_ee55262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55262, buf);
    ee55262 *dp, &lv = *(dp=new (buf) ee55262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee55262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee55262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(32,16), "ee55262");
    check_base_class_offset(lv, (dd5262*), ABISELECT(16,8), "ee55262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55262.e");
    test_class_info(&lv, &cd_ee55262);
    dp->~ee55262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55262(Test_ee55262, "ee55262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55262C1Ev();
extern void _ZN7ee55262D1Ev();
Name_Map name_map_ee55262[] = {
  NSPAIR(_ZN7ee55262C1Ev),
  NSPAIR(_ZN7ee55262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee55262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55262[];
extern void _ZN7ee552623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee552623barEv,_ZTv0_n16_N7ee552623barEv)();
extern void ABISELECT(_ZThn16_N7ee552623barEv,_ZThn8_N7ee552623barEv)() __attribute__((weak));
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee552623barEv,_ZTv0_n16_N7ee552623barEv)();
extern void ABISELECT(_ZThn32_N7ee552623barEv,_ZThn16_N7ee552623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55262[0]),
  (VTBL_ENTRY)&_ZN7ee552623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee552623barEv,_ZTv0_n16_N7ee552623barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee552623barEv,_ZTv0_n16_N7ee552623barEv),
};
extern VTBL_ENTRY _ZTV7ee55262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee55262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee55262[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee55262[] = {
  {&(_ZTV7ee55262[4]),  4,16},
  {&(_ZTV7ee55262[9]),  9,16},
  {&(_ZTV7ee55262[14]),  14,16},
  {&(_tg__ZTV6dd5262__7ee55262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee55262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55262[];
extern  VTBL_ENTRY _ZTV7ee55262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55262[];
static VTBL_ENTRY alt_thunk_names1072[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee552623barEv,_ZTv0_n16_N7ee552623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee552623barEv,_ZThn16_N7ee552623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee552623barEv,_ZThn8_N7ee552623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55262 = {  "ee55262", // class name
  bases_ee55262, 4,
  &(vtc_ee55262[0]), // expected_vtbl_contents
  &(vtt_ee55262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55262),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1072,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65262  : dd5262 {
  int e;
  virtual void  foo(); // _ZN7ee652623fooEv
  virtual void  bar(); // _ZN7ee652623barEv
  ~ee65262(); // tgen
  ee65262(); // tgen
};
//SIG(1 ee65262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee65262 ::foo(){vfunc_called(this, "_ZN7ee652623fooEv");}
void  ee65262 ::bar(){vfunc_called(this, "_ZN7ee652623barEv");}
ee65262 ::~ee65262(){ note_dtor("ee65262", this);} // tgen
ee65262 ::ee65262(){ note_ctor("ee65262", this);} // tgen

static void Test_ee65262()
{
  extern Class_Descriptor cd_ee65262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65262, buf);
    ee65262 *dp, &lv = *(dp=new (buf) ee65262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee65262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee65262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(16,12), "ee65262");
    check_base_class_offset(lv, (dd5262*), 0, "ee65262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65262.e");
    test_class_info(&lv, &cd_ee65262);
    dp->~ee65262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65262(Test_ee65262, "ee65262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65262C1Ev();
extern void _ZN7ee65262D1Ev();
Name_Map name_map_ee65262[] = {
  NSPAIR(_ZN7ee65262C1Ev),
  NSPAIR(_ZN7ee65262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee65262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65262[];
extern void _ZN7ee652623barEv();
extern void _ZN7ee652623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee652623fooEv,_ZTv0_n12_N7ee652623fooEv)();
extern void ABISELECT(_ZThn16_N7ee652623fooEv,_ZThn12_N7ee652623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee652623barEv,_ZTv0_n16_N7ee652623barEv)();
extern void ABISELECT(_ZThn16_N7ee652623barEv,_ZThn12_N7ee652623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65262[0]),
  (VTBL_ENTRY)&_ZN7ee652623barEv,
  (VTBL_ENTRY)&_ZN7ee652623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee652623fooEv,_ZTv0_n12_N7ee652623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee652623barEv,_ZTv0_n16_N7ee652623barEv),
};
extern VTBL_ENTRY _ZTV7ee65262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee65262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee65262[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee65262[] = {
  {&(_ZTV7ee65262[3]),  3,11},
  {&(_tg__ZTV6dd5262__7ee65262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee65262[4]),  4,6},
  {&(_ZTV7ee65262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65262[];
extern  VTBL_ENTRY _ZTV7ee65262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65262[];
static VTBL_ENTRY alt_thunk_names1073[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn12_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee652623barEv,_ZTv0_n16_N7ee652623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee652623barEv,_ZThn12_N7ee652623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee652623fooEv,_ZTv0_n12_N7ee652623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee652623fooEv,_ZThn12_N7ee652623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65262 = {  "ee65262", // class name
  bases_ee65262, 4,
  &(vtc_ee65262[0]), // expected_vtbl_contents
  &(vtt_ee65262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1073,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75262  : virtual dd5262 {
  int e;
  virtual void  foo(); // _ZN7ee752623fooEv
  virtual void  bar(); // _ZN7ee752623barEv
  ~ee75262(); // tgen
  ee75262(); // tgen
};
//SIG(1 ee75262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee75262 ::foo(){vfunc_called(this, "_ZN7ee752623fooEv");}
void  ee75262 ::bar(){vfunc_called(this, "_ZN7ee752623barEv");}
ee75262 ::~ee75262(){ note_dtor("ee75262", this);} // tgen
ee75262 ::ee75262(){ note_ctor("ee75262", this);} // tgen

static void Test_ee75262()
{
  extern Class_Descriptor cd_ee75262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75262, buf);
    ee75262 *dp, &lv = *(dp=new (buf) ee75262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee75262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee75262");
    check_base_class_offset(lv, (cc262*)(dd5262*), ABISELECT(32,16), "ee75262");
    check_base_class_offset(lv, (dd5262*), ABISELECT(16,8), "ee75262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75262.e");
    test_class_info(&lv, &cd_ee75262);
    dp->~ee75262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75262(Test_ee75262, "ee75262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75262C1Ev();
extern void _ZN7ee75262D1Ev();
Name_Map name_map_ee75262[] = {
  NSPAIR(_ZN7ee75262C1Ev),
  NSPAIR(_ZN7ee75262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd5262;
extern VTBL_ENTRY _ZTI6dd5262[];
extern  VTBL_ENTRY _ZTV6dd5262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5262[];
static Base_Class bases_ee75262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5262,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75262[];
extern void _ZN7ee752623fooEv();
extern void _ZN7ee752623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee752623barEv,_ZTv0_n16_N7ee752623barEv)();
extern void ABISELECT(_ZThn16_N7ee752623barEv,_ZThn8_N7ee752623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee752623fooEv,_ZTv0_n12_N7ee752623fooEv)();
extern void ABISELECT(_ZThn32_N7ee752623fooEv,_ZThn16_N7ee752623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee752623barEv,_ZTv0_n16_N7ee752623barEv)();
extern void ABISELECT(_ZThn32_N7ee752623barEv,_ZThn16_N7ee752623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75262[0]),
  (VTBL_ENTRY)&_ZN7ee752623fooEv,
  (VTBL_ENTRY)&_ZN7ee752623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee752623barEv,_ZTv0_n16_N7ee752623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee752623fooEv,_ZTv0_n12_N7ee752623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee752623barEv,_ZTv0_n16_N7ee752623barEv),
};
extern VTBL_ENTRY _ZTV7ee75262[];
extern void _ZN6dd52623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5262__7ee75262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN6dd52623barEv,
};
extern void _ZN5cc2623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv)();
extern void ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd5262__7ee75262[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5262[0]),
  (VTBL_ENTRY)&_ZN5cc2623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv),
};
static  VTT_ENTRY vtt_ee75262[] = {
  {&(_ZTV7ee75262[4]),  4,17},
  {&(_ZTV7ee75262[10]),  10,17},
  {&(_ZTV7ee75262[15]),  15,17},
  {&(_tg__ZTV6dd5262__7ee75262[3]),  3,4},
  {&(_tg__ZTV5cc262__6dd5262__7ee75262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75262[];
extern  VTBL_ENTRY _ZTV7ee75262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75262[];
static VTBL_ENTRY alt_thunk_names1074[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd52623barEv,_ZTv0_n16_N6dd52623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd52623barEv,_ZThn8_N6dd52623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee752623fooEv,_ZTv0_n12_N7ee752623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee752623fooEv,_ZThn16_N7ee752623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee752623barEv,_ZTv0_n16_N7ee752623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee752623barEv,_ZThn16_N7ee752623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee752623barEv,_ZThn8_N7ee752623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75262 = {  "ee75262", // class name
  bases_ee75262, 4,
  &(vtc_ee75262[0]), // expected_vtbl_contents
  &(vtt_ee75262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75262),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1074,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6262  : cc262 {
  int d;
  virtual void  bar(); // _ZN6dd62623barEv
  virtual void  foo(); // _ZN6dd62623fooEv
  ~dd6262(); // tgen
  dd6262(); // tgen
};
//SIG(-1 dd6262) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd6262 ::bar(){vfunc_called(this, "_ZN6dd62623barEv");}
void  dd6262 ::foo(){vfunc_called(this, "_ZN6dd62623fooEv");}
dd6262 ::~dd6262(){ note_dtor("dd6262", this);} // tgen
dd6262 ::dd6262(){ note_ctor("dd6262", this);} // tgen

static void Test_dd6262()
{
  extern Class_Descriptor cd_dd6262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6262, buf);
    dd6262 *dp, &lv = *(dp=new (buf) dd6262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), 0, "dd6262");
    check_base_class_offset(lv, (bb62*)(cc262*), 0, "dd6262");
    check_base_class_offset(lv, (cc262*), 0, "dd6262");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6262.d");
    test_class_info(&lv, &cd_dd6262);
    dp->~dd6262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6262(Test_dd6262, "dd6262", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6262C1Ev();
extern void _ZN6dd6262D1Ev();
Name_Map name_map_dd6262[] = {
  NSPAIR(_ZN6dd6262C1Ev),
  NSPAIR(_ZN6dd6262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd6262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6262[];
extern void _ZN6dd62623fooEv();
extern void _ZN6dd62623barEv();
static  VTBL_ENTRY vtc_dd6262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6262[0]),
  (VTBL_ENTRY)&_ZN6dd62623fooEv,
  (VTBL_ENTRY)&_ZN6dd62623barEv,
};
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
Class_Descriptor cd_dd6262 = {  "dd6262", // class name
  bases_dd6262, 3,
  &(vtc_dd6262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6262),4, //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  ee06262  : dd6262 {
  int e;
  ~ee06262(); // tgen
  ee06262(); // tgen
};
//SIG(1 ee06262) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee06262 ::~ee06262(){ note_dtor("ee06262", this);} // tgen
ee06262 ::ee06262(){ note_ctor("ee06262", this);} // tgen

static void Test_ee06262()
{
  extern Class_Descriptor cd_ee06262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06262, buf);
    ee06262 *dp, &lv = *(dp=new (buf) ee06262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), 0, "ee06262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), 0, "ee06262");
    check_base_class_offset(lv, (cc262*)(dd6262*), 0, "ee06262");
    check_base_class_offset(lv, (dd6262*), 0, "ee06262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06262.e");
    test_class_info(&lv, &cd_ee06262);
    dp->~ee06262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06262(Test_ee06262, "ee06262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06262C1Ev();
extern void _ZN7ee06262D1Ev();
Name_Map name_map_ee06262[] = {
  NSPAIR(_ZN7ee06262C1Ev),
  NSPAIR(_ZN7ee06262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee06262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06262[];
extern void _ZN6dd62623fooEv();
extern void _ZN6dd62623barEv();
static  VTBL_ENTRY vtc_ee06262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06262[0]),
  (VTBL_ENTRY)&_ZN6dd62623fooEv,
  (VTBL_ENTRY)&_ZN6dd62623barEv,
};
extern VTBL_ENTRY _ZTI7ee06262[];
extern  VTBL_ENTRY _ZTV7ee06262[];
Class_Descriptor cd_ee06262 = {  "ee06262", // class name
  bases_ee06262, 4,
  &(vtc_ee06262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06262),4, //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  ee16262  : virtual dd6262 {
  int e;
  ~ee16262(); // tgen
  ee16262(); // tgen
};
//SIG(1 ee16262) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee16262 ::~ee16262(){ note_dtor("ee16262", this);} // tgen
ee16262 ::ee16262(){ note_ctor("ee16262", this);} // tgen

static void Test_ee16262()
{
  extern Class_Descriptor cd_ee16262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16262, buf);
    ee16262 *dp, &lv = *(dp=new (buf) ee16262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee16262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee16262");
    check_base_class_offset(lv, (cc262*)(dd6262*), ABISELECT(16,8), "ee16262");
    check_base_class_offset(lv, (dd6262*), ABISELECT(16,8), "ee16262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16262.e");
    test_class_info(&lv, &cd_ee16262);
    dp->~ee16262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16262(Test_ee16262, "ee16262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16262C1Ev();
extern void _ZN7ee16262D1Ev();
Name_Map name_map_ee16262[] = {
  NSPAIR(_ZN7ee16262C1Ev),
  NSPAIR(_ZN7ee16262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee16262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16262[];
extern void _ZN6dd62623fooEv();
extern void _ZN6dd62623barEv();
static  VTBL_ENTRY vtc_ee16262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16262[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16262[0]),
  (VTBL_ENTRY)&_ZN6dd62623fooEv,
  (VTBL_ENTRY)&_ZN6dd62623barEv,
};
extern VTBL_ENTRY _ZTV7ee16262[];
static  VTT_ENTRY vtt_ee16262[] = {
  {&(_ZTV7ee16262[3]),  3,9},
  {&(_ZTV7ee16262[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16262[];
extern  VTBL_ENTRY _ZTV7ee16262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16262[];
Class_Descriptor cd_ee16262 = {  "ee16262", // class name
  bases_ee16262, 4,
  &(vtc_ee16262[0]), // expected_vtbl_contents
  &(vtt_ee16262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16262),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16262),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  ee26262  : dd6262 {
  int e;
  virtual void  foo(); // _ZN7ee262623fooEv
  ~ee26262(); // tgen
  ee26262(); // tgen
};
//SIG(1 ee26262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee26262 ::foo(){vfunc_called(this, "_ZN7ee262623fooEv");}
ee26262 ::~ee26262(){ note_dtor("ee26262", this);} // tgen
ee26262 ::ee26262(){ note_ctor("ee26262", this);} // tgen

static void Test_ee26262()
{
  extern Class_Descriptor cd_ee26262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26262, buf);
    ee26262 *dp, &lv = *(dp=new (buf) ee26262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), 0, "ee26262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), 0, "ee26262");
    check_base_class_offset(lv, (cc262*)(dd6262*), 0, "ee26262");
    check_base_class_offset(lv, (dd6262*), 0, "ee26262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26262.e");
    test_class_info(&lv, &cd_ee26262);
    dp->~ee26262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26262(Test_ee26262, "ee26262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26262C1Ev();
extern void _ZN7ee26262D1Ev();
Name_Map name_map_ee26262[] = {
  NSPAIR(_ZN7ee26262C1Ev),
  NSPAIR(_ZN7ee26262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee26262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26262[];
extern void _ZN7ee262623fooEv();
extern void _ZN6dd62623barEv();
static  VTBL_ENTRY vtc_ee26262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26262[0]),
  (VTBL_ENTRY)&_ZN7ee262623fooEv,
  (VTBL_ENTRY)&_ZN6dd62623barEv,
};
extern VTBL_ENTRY _ZTI7ee26262[];
extern  VTBL_ENTRY _ZTV7ee26262[];
Class_Descriptor cd_ee26262 = {  "ee26262", // class name
  bases_ee26262, 4,
  &(vtc_ee26262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26262),4, //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  ee36262  : virtual dd6262 {
  int e;
  virtual void  foo(); // _ZN7ee362623fooEv
  ~ee36262(); // tgen
  ee36262(); // tgen
};
//SIG(1 ee36262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee36262 ::foo(){vfunc_called(this, "_ZN7ee362623fooEv");}
ee36262 ::~ee36262(){ note_dtor("ee36262", this);} // tgen
ee36262 ::ee36262(){ note_ctor("ee36262", this);} // tgen

static void Test_ee36262()
{
  extern Class_Descriptor cd_ee36262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36262, buf);
    ee36262 *dp, &lv = *(dp=new (buf) ee36262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee36262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee36262");
    check_base_class_offset(lv, (cc262*)(dd6262*), ABISELECT(16,8), "ee36262");
    check_base_class_offset(lv, (dd6262*), ABISELECT(16,8), "ee36262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36262.e");
    test_class_info(&lv, &cd_ee36262);
    dp->~ee36262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36262(Test_ee36262, "ee36262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36262C1Ev();
extern void _ZN7ee36262D1Ev();
Name_Map name_map_ee36262[] = {
  NSPAIR(_ZN7ee36262C1Ev),
  NSPAIR(_ZN7ee36262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee36262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36262[];
extern void _ZN7ee362623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee362623fooEv,_ZTv0_n12_N7ee362623fooEv)();
extern void ABISELECT(_ZThn16_N7ee362623fooEv,_ZThn8_N7ee362623fooEv)() __attribute__((weak));
extern void _ZN6dd62623barEv();
static  VTBL_ENTRY vtc_ee36262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36262[0]),
  (VTBL_ENTRY)&_ZN7ee362623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee362623fooEv,_ZTv0_n12_N7ee362623fooEv),
  (VTBL_ENTRY)&_ZN6dd62623barEv,
};
extern VTBL_ENTRY _ZTV7ee36262[];
static  VTT_ENTRY vtt_ee36262[] = {
  {&(_ZTV7ee36262[3]),  3,10},
  {&(_ZTV7ee36262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36262[];
extern  VTBL_ENTRY _ZTV7ee36262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36262[];
static VTBL_ENTRY alt_thunk_names1075[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee362623fooEv,_ZTv0_n12_N7ee362623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee362623fooEv,_ZThn8_N7ee362623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36262 = {  "ee36262", // class name
  bases_ee36262, 4,
  &(vtc_ee36262[0]), // expected_vtbl_contents
  &(vtt_ee36262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1075,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46262  : dd6262 {
  int e;
  virtual void  bar(); // _ZN7ee462623barEv
  ~ee46262(); // tgen
  ee46262(); // tgen
};
//SIG(1 ee46262) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee46262 ::bar(){vfunc_called(this, "_ZN7ee462623barEv");}
ee46262 ::~ee46262(){ note_dtor("ee46262", this);} // tgen
ee46262 ::ee46262(){ note_ctor("ee46262", this);} // tgen

static void Test_ee46262()
{
  extern Class_Descriptor cd_ee46262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46262, buf);
    ee46262 *dp, &lv = *(dp=new (buf) ee46262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), 0, "ee46262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), 0, "ee46262");
    check_base_class_offset(lv, (cc262*)(dd6262*), 0, "ee46262");
    check_base_class_offset(lv, (dd6262*), 0, "ee46262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46262.e");
    test_class_info(&lv, &cd_ee46262);
    dp->~ee46262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46262(Test_ee46262, "ee46262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46262C1Ev();
extern void _ZN7ee46262D1Ev();
Name_Map name_map_ee46262[] = {
  NSPAIR(_ZN7ee46262C1Ev),
  NSPAIR(_ZN7ee46262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee46262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46262[];
extern void _ZN6dd62623fooEv();
extern void _ZN7ee462623barEv();
static  VTBL_ENTRY vtc_ee46262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46262[0]),
  (VTBL_ENTRY)&_ZN6dd62623fooEv,
  (VTBL_ENTRY)&_ZN7ee462623barEv,
};
extern VTBL_ENTRY _ZTI7ee46262[];
extern  VTBL_ENTRY _ZTV7ee46262[];
Class_Descriptor cd_ee46262 = {  "ee46262", // class name
  bases_ee46262, 4,
  &(vtc_ee46262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46262),4, //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  ee56262  : virtual dd6262 {
  int e;
  virtual void  bar(); // _ZN7ee562623barEv
  ~ee56262(); // tgen
  ee56262(); // tgen
};
//SIG(1 ee56262) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee56262 ::bar(){vfunc_called(this, "_ZN7ee562623barEv");}
ee56262 ::~ee56262(){ note_dtor("ee56262", this);} // tgen
ee56262 ::ee56262(){ note_ctor("ee56262", this);} // tgen

static void Test_ee56262()
{
  extern Class_Descriptor cd_ee56262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56262, buf);
    ee56262 *dp, &lv = *(dp=new (buf) ee56262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee56262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee56262");
    check_base_class_offset(lv, (cc262*)(dd6262*), ABISELECT(16,8), "ee56262");
    check_base_class_offset(lv, (dd6262*), ABISELECT(16,8), "ee56262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56262.e");
    test_class_info(&lv, &cd_ee56262);
    dp->~ee56262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56262(Test_ee56262, "ee56262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56262C1Ev();
extern void _ZN7ee56262D1Ev();
Name_Map name_map_ee56262[] = {
  NSPAIR(_ZN7ee56262C1Ev),
  NSPAIR(_ZN7ee56262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee56262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56262[];
extern void _ZN7ee562623barEv();
extern void _ZN6dd62623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee562623barEv,_ZTv0_n16_N7ee562623barEv)();
extern void ABISELECT(_ZThn16_N7ee562623barEv,_ZThn8_N7ee562623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56262[0]),
  (VTBL_ENTRY)&_ZN7ee562623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56262[0]),
  (VTBL_ENTRY)&_ZN6dd62623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee562623barEv,_ZTv0_n16_N7ee562623barEv),
};
extern VTBL_ENTRY _ZTV7ee56262[];
static  VTT_ENTRY vtt_ee56262[] = {
  {&(_ZTV7ee56262[3]),  3,10},
  {&(_ZTV7ee56262[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56262[];
extern  VTBL_ENTRY _ZTV7ee56262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56262[];
static VTBL_ENTRY alt_thunk_names1076[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee562623barEv,_ZTv0_n16_N7ee562623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee562623barEv,_ZThn8_N7ee562623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56262 = {  "ee56262", // class name
  bases_ee56262, 4,
  &(vtc_ee56262[0]), // expected_vtbl_contents
  &(vtt_ee56262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56262),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1076,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66262  : dd6262 {
  int e;
  virtual void  foo(); // _ZN7ee662623fooEv
  virtual void  bar(); // _ZN7ee662623barEv
  ~ee66262(); // tgen
  ee66262(); // tgen
};
//SIG(1 ee66262) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66262 ::foo(){vfunc_called(this, "_ZN7ee662623fooEv");}
void  ee66262 ::bar(){vfunc_called(this, "_ZN7ee662623barEv");}
ee66262 ::~ee66262(){ note_dtor("ee66262", this);} // tgen
ee66262 ::ee66262(){ note_ctor("ee66262", this);} // tgen

static void Test_ee66262()
{
  extern Class_Descriptor cd_ee66262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66262, buf);
    ee66262 *dp, &lv = *(dp=new (buf) ee66262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), 0, "ee66262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), 0, "ee66262");
    check_base_class_offset(lv, (cc262*)(dd6262*), 0, "ee66262");
    check_base_class_offset(lv, (dd6262*), 0, "ee66262");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66262.e");
    test_class_info(&lv, &cd_ee66262);
    dp->~ee66262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66262(Test_ee66262, "ee66262", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66262C1Ev();
extern void _ZN7ee66262D1Ev();
Name_Map name_map_ee66262[] = {
  NSPAIR(_ZN7ee66262C1Ev),
  NSPAIR(_ZN7ee66262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee66262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66262[];
extern void _ZN7ee662623fooEv();
extern void _ZN7ee662623barEv();
static  VTBL_ENTRY vtc_ee66262[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66262[0]),
  (VTBL_ENTRY)&_ZN7ee662623fooEv,
  (VTBL_ENTRY)&_ZN7ee662623barEv,
};
extern VTBL_ENTRY _ZTI7ee66262[];
extern  VTBL_ENTRY _ZTV7ee66262[];
Class_Descriptor cd_ee66262 = {  "ee66262", // class name
  bases_ee66262, 4,
  &(vtc_ee66262[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66262),4, //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  ee76262  : virtual dd6262 {
  int e;
  virtual void  foo(); // _ZN7ee762623fooEv
  virtual void  bar(); // _ZN7ee762623barEv
  ~ee76262(); // tgen
  ee76262(); // tgen
};
//SIG(1 ee76262) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76262 ::foo(){vfunc_called(this, "_ZN7ee762623fooEv");}
void  ee76262 ::bar(){vfunc_called(this, "_ZN7ee762623barEv");}
ee76262 ::~ee76262(){ note_dtor("ee76262", this);} // tgen
ee76262 ::ee76262(){ note_ctor("ee76262", this);} // tgen

static void Test_ee76262()
{
  extern Class_Descriptor cd_ee76262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76262, buf);
    ee76262 *dp, &lv = *(dp=new (buf) ee76262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee76262");
    check_base_class_offset(lv, (bb62*)(cc262*)(dd6262*), ABISELECT(16,8), "ee76262");
    check_base_class_offset(lv, (cc262*)(dd6262*), ABISELECT(16,8), "ee76262");
    check_base_class_offset(lv, (dd6262*), ABISELECT(16,8), "ee76262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76262.e");
    test_class_info(&lv, &cd_ee76262);
    dp->~ee76262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76262(Test_ee76262, "ee76262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76262C1Ev();
extern void _ZN7ee76262D1Ev();
Name_Map name_map_ee76262[] = {
  NSPAIR(_ZN7ee76262C1Ev),
  NSPAIR(_ZN7ee76262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd6262;
extern VTBL_ENTRY _ZTI6dd6262[];
extern  VTBL_ENTRY _ZTV6dd6262[];
static Base_Class bases_ee76262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6262,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76262[];
extern void _ZN7ee762623fooEv();
extern void _ZN7ee762623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee762623fooEv,_ZTv0_n12_N7ee762623fooEv)();
extern void ABISELECT(_ZThn16_N7ee762623fooEv,_ZThn8_N7ee762623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee762623barEv,_ZTv0_n16_N7ee762623barEv)();
extern void ABISELECT(_ZThn16_N7ee762623barEv,_ZThn8_N7ee762623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76262[0]),
  (VTBL_ENTRY)&_ZN7ee762623fooEv,
  (VTBL_ENTRY)&_ZN7ee762623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee762623fooEv,_ZTv0_n12_N7ee762623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee762623barEv,_ZTv0_n16_N7ee762623barEv),
};
extern VTBL_ENTRY _ZTV7ee76262[];
static  VTT_ENTRY vtt_ee76262[] = {
  {&(_ZTV7ee76262[3]),  3,11},
  {&(_ZTV7ee76262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76262[];
extern  VTBL_ENTRY _ZTV7ee76262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76262[];
static VTBL_ENTRY alt_thunk_names1077[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee762623barEv,_ZTv0_n16_N7ee762623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee762623barEv,_ZThn8_N7ee762623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee762623fooEv,_ZTv0_n12_N7ee762623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee762623fooEv,_ZThn8_N7ee762623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76262 = {  "ee76262", // class name
  bases_ee76262, 4,
  &(vtc_ee76262[0]), // expected_vtbl_contents
  &(vtt_ee76262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76262),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1077,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7262  : virtual cc262 {
  int d;
  virtual void  bar(); // _ZN6dd72623barEv
  virtual void  foo(); // _ZN6dd72623fooEv
  ~dd7262(); // tgen
  dd7262(); // tgen
};
//SIG(-1 dd7262) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd7262 ::bar(){vfunc_called(this, "_ZN6dd72623barEv");}
void  dd7262 ::foo(){vfunc_called(this, "_ZN6dd72623fooEv");}
dd7262 ::~dd7262(){ note_dtor("dd7262", this);} // tgen
dd7262 ::dd7262(){ note_ctor("dd7262", this);} // tgen

static void Test_dd7262()
{
  extern Class_Descriptor cd_dd7262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7262, buf);
    dd7262 *dp, &lv = *(dp=new (buf) dd7262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,8), "dd7262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,8), "dd7262");
    check_base_class_offset(lv, (cc262*), ABISELECT(16,8), "dd7262");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7262.d");
    test_class_info(&lv, &cd_dd7262);
    dp->~dd7262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7262(Test_dd7262, "dd7262", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7262C1Ev();
extern void _ZN6dd7262D1Ev();
Name_Map name_map_dd7262[] = {
  NSPAIR(_ZN6dd7262C1Ev),
  NSPAIR(_ZN6dd7262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
static Base_Class bases_dd7262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
extern VTBL_ENTRY _ZTV6dd7262[];
static  VTT_ENTRY vtt_dd7262[] = {
  {&(_ZTV6dd7262[3]),  3,11},
  {&(_ZTV6dd7262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static VTBL_ENTRY alt_thunk_names1078[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7262 = {  "dd7262", // class name
  bases_dd7262, 3,
  &(vtc_dd7262[0]), // expected_vtbl_contents
  &(vtt_dd7262[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7262),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1078,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07262  : dd7262 {
  int e;
  ~ee07262(); // tgen
  ee07262(); // tgen
};
//SIG(1 ee07262) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee07262 ::~ee07262(){ note_dtor("ee07262", this);} // tgen
ee07262 ::ee07262(){ note_ctor("ee07262", this);} // tgen

static void Test_ee07262()
{
  extern Class_Descriptor cd_ee07262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07262, buf);
    ee07262 *dp, &lv = *(dp=new (buf) ee07262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee07262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee07262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(16,12), "ee07262");
    check_base_class_offset(lv, (dd7262*), 0, "ee07262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07262.e");
    test_class_info(&lv, &cd_ee07262);
    dp->~ee07262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07262(Test_ee07262, "ee07262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07262C1Ev();
extern void _ZN7ee07262D1Ev();
Name_Map name_map_ee07262[] = {
  NSPAIR(_ZN7ee07262C1Ev),
  NSPAIR(_ZN7ee07262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee07262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
extern VTBL_ENTRY _ZTV7ee07262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee07262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee07262[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee07262[] = {
  {&(_ZTV7ee07262[3]),  3,11},
  {&(_tg__ZTV6dd7262__7ee07262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee07262[4]),  4,6},
  {&(_ZTV7ee07262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07262[];
extern  VTBL_ENTRY _ZTV7ee07262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07262[];
static VTBL_ENTRY alt_thunk_names1079[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07262 = {  "ee07262", // class name
  bases_ee07262, 4,
  &(vtc_ee07262[0]), // expected_vtbl_contents
  &(vtt_ee07262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1079,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17262  : virtual dd7262 {
  int e;
  ~ee17262(); // tgen
  ee17262(); // tgen
};
//SIG(1 ee17262) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee17262 ::~ee17262(){ note_dtor("ee17262", this);} // tgen
ee17262 ::ee17262(){ note_ctor("ee17262", this);} // tgen

static void Test_ee17262()
{
  extern Class_Descriptor cd_ee17262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17262, buf);
    ee17262 *dp, &lv = *(dp=new (buf) ee17262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee17262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee17262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(32,16), "ee17262");
    check_base_class_offset(lv, (dd7262*), ABISELECT(16,8), "ee17262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17262.e");
    test_class_info(&lv, &cd_ee17262);
    dp->~ee17262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17262(Test_ee17262, "ee17262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17262C1Ev();
extern void _ZN7ee17262D1Ev();
Name_Map name_map_ee17262[] = {
  NSPAIR(_ZN7ee17262C1Ev),
  NSPAIR(_ZN7ee17262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee17262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17262[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
extern VTBL_ENTRY _ZTV7ee17262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee17262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee17262[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee17262[] = {
  {&(_ZTV7ee17262[4]),  4,17},
  {&(_ZTV7ee17262[9]),  9,17},
  {&(_ZTV7ee17262[15]),  15,17},
  {&(_tg__ZTV6dd7262__7ee17262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee17262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17262[];
extern  VTBL_ENTRY _ZTV7ee17262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17262[];
static VTBL_ENTRY alt_thunk_names1080[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17262 = {  "ee17262", // class name
  bases_ee17262, 4,
  &(vtc_ee17262[0]), // expected_vtbl_contents
  &(vtt_ee17262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17262),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1080,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27262  : dd7262 {
  int e;
  virtual void  foo(); // _ZN7ee272623fooEv
  ~ee27262(); // tgen
  ee27262(); // tgen
};
//SIG(1 ee27262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee27262 ::foo(){vfunc_called(this, "_ZN7ee272623fooEv");}
ee27262 ::~ee27262(){ note_dtor("ee27262", this);} // tgen
ee27262 ::ee27262(){ note_ctor("ee27262", this);} // tgen

static void Test_ee27262()
{
  extern Class_Descriptor cd_ee27262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27262, buf);
    ee27262 *dp, &lv = *(dp=new (buf) ee27262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee27262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee27262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(16,12), "ee27262");
    check_base_class_offset(lv, (dd7262*), 0, "ee27262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27262.e");
    test_class_info(&lv, &cd_ee27262);
    dp->~ee27262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27262(Test_ee27262, "ee27262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27262C1Ev();
extern void _ZN7ee27262D1Ev();
Name_Map name_map_ee27262[] = {
  NSPAIR(_ZN7ee27262C1Ev),
  NSPAIR(_ZN7ee27262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee27262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27262[];
extern void _ZN6dd72623barEv();
extern void _ZN7ee272623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee272623fooEv,_ZTv0_n12_N7ee272623fooEv)();
extern void ABISELECT(_ZThn16_N7ee272623fooEv,_ZThn12_N7ee272623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN7ee272623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee272623fooEv,_ZTv0_n12_N7ee272623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
extern VTBL_ENTRY _ZTV7ee27262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee27262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee27262[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee27262[] = {
  {&(_ZTV7ee27262[3]),  3,11},
  {&(_tg__ZTV6dd7262__7ee27262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee27262[4]),  4,6},
  {&(_ZTV7ee27262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27262[];
extern  VTBL_ENTRY _ZTV7ee27262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27262[];
static VTBL_ENTRY alt_thunk_names1081[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee272623fooEv,_ZTv0_n12_N7ee272623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee272623fooEv,_ZThn12_N7ee272623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27262 = {  "ee27262", // class name
  bases_ee27262, 4,
  &(vtc_ee27262[0]), // expected_vtbl_contents
  &(vtt_ee27262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1081,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37262  : virtual dd7262 {
  int e;
  virtual void  foo(); // _ZN7ee372623fooEv
  ~ee37262(); // tgen
  ee37262(); // tgen
};
//SIG(1 ee37262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee37262 ::foo(){vfunc_called(this, "_ZN7ee372623fooEv");}
ee37262 ::~ee37262(){ note_dtor("ee37262", this);} // tgen
ee37262 ::ee37262(){ note_ctor("ee37262", this);} // tgen

static void Test_ee37262()
{
  extern Class_Descriptor cd_ee37262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37262, buf);
    ee37262 *dp, &lv = *(dp=new (buf) ee37262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee37262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee37262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(32,16), "ee37262");
    check_base_class_offset(lv, (dd7262*), ABISELECT(16,8), "ee37262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37262.e");
    test_class_info(&lv, &cd_ee37262);
    dp->~ee37262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37262(Test_ee37262, "ee37262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37262C1Ev();
extern void _ZN7ee37262D1Ev();
Name_Map name_map_ee37262[] = {
  NSPAIR(_ZN7ee37262C1Ev),
  NSPAIR(_ZN7ee37262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee37262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37262[];
extern void _ZN7ee372623fooEv();
extern void _ZN6dd72623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee372623fooEv,_ZTv0_n20_N7ee372623fooEv)();
extern void ABISELECT(_ZThn16_N7ee372623fooEv,_ZThn8_N7ee372623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee372623fooEv,_ZTv0_n12_N7ee372623fooEv)();
extern void ABISELECT(_ZThn32_N7ee372623fooEv,_ZThn16_N7ee372623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37262[0]),
  (VTBL_ENTRY)&_ZN7ee372623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee372623fooEv,_ZTv0_n20_N7ee372623fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee372623fooEv,_ZTv0_n12_N7ee372623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
extern VTBL_ENTRY _ZTV7ee37262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee37262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee37262[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee37262[] = {
  {&(_ZTV7ee37262[4]),  4,18},
  {&(_ZTV7ee37262[10]),  10,18},
  {&(_ZTV7ee37262[16]),  16,18},
  {&(_tg__ZTV6dd7262__7ee37262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee37262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37262[];
extern  VTBL_ENTRY _ZTV7ee37262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37262[];
static VTBL_ENTRY alt_thunk_names1082[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee372623fooEv,_ZTv0_n12_N7ee372623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee372623fooEv,_ZThn16_N7ee372623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee372623fooEv,_ZTv0_n20_N7ee372623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee372623fooEv,_ZThn8_N7ee372623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37262 = {  "ee37262", // class name
  bases_ee37262, 4,
  &(vtc_ee37262[0]), // expected_vtbl_contents
  &(vtt_ee37262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37262),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1082,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47262  : dd7262 {
  int e;
  virtual void  bar(); // _ZN7ee472623barEv
  ~ee47262(); // tgen
  ee47262(); // tgen
};
//SIG(1 ee47262) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee47262 ::bar(){vfunc_called(this, "_ZN7ee472623barEv");}
ee47262 ::~ee47262(){ note_dtor("ee47262", this);} // tgen
ee47262 ::ee47262(){ note_ctor("ee47262", this);} // tgen

static void Test_ee47262()
{
  extern Class_Descriptor cd_ee47262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47262, buf);
    ee47262 *dp, &lv = *(dp=new (buf) ee47262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee47262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee47262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(16,12), "ee47262");
    check_base_class_offset(lv, (dd7262*), 0, "ee47262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47262.e");
    test_class_info(&lv, &cd_ee47262);
    dp->~ee47262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47262(Test_ee47262, "ee47262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47262C1Ev();
extern void _ZN7ee47262D1Ev();
Name_Map name_map_ee47262[] = {
  NSPAIR(_ZN7ee47262C1Ev),
  NSPAIR(_ZN7ee47262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee47262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47262[];
extern void _ZN7ee472623barEv();
extern void _ZN6dd72623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee472623barEv,_ZTv0_n16_N7ee472623barEv)();
extern void ABISELECT(_ZThn16_N7ee472623barEv,_ZThn12_N7ee472623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47262[0]),
  (VTBL_ENTRY)&_ZN7ee472623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee472623barEv,_ZTv0_n16_N7ee472623barEv),
};
extern VTBL_ENTRY _ZTV7ee47262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee47262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee47262[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee47262[] = {
  {&(_ZTV7ee47262[3]),  3,11},
  {&(_tg__ZTV6dd7262__7ee47262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee47262[4]),  4,6},
  {&(_ZTV7ee47262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47262[];
extern  VTBL_ENTRY _ZTV7ee47262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47262[];
static VTBL_ENTRY alt_thunk_names1083[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee472623barEv,_ZTv0_n16_N7ee472623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee472623barEv,_ZThn12_N7ee472623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47262 = {  "ee47262", // class name
  bases_ee47262, 4,
  &(vtc_ee47262[0]), // expected_vtbl_contents
  &(vtt_ee47262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1083,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57262  : virtual dd7262 {
  int e;
  virtual void  bar(); // _ZN7ee572623barEv
  ~ee57262(); // tgen
  ee57262(); // tgen
};
//SIG(1 ee57262) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee57262 ::bar(){vfunc_called(this, "_ZN7ee572623barEv");}
ee57262 ::~ee57262(){ note_dtor("ee57262", this);} // tgen
ee57262 ::ee57262(){ note_ctor("ee57262", this);} // tgen

static void Test_ee57262()
{
  extern Class_Descriptor cd_ee57262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57262, buf);
    ee57262 *dp, &lv = *(dp=new (buf) ee57262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee57262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee57262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(32,16), "ee57262");
    check_base_class_offset(lv, (dd7262*), ABISELECT(16,8), "ee57262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57262.e");
    test_class_info(&lv, &cd_ee57262);
    dp->~ee57262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57262(Test_ee57262, "ee57262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57262C1Ev();
extern void _ZN7ee57262D1Ev();
Name_Map name_map_ee57262[] = {
  NSPAIR(_ZN7ee57262C1Ev),
  NSPAIR(_ZN7ee57262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee57262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57262[];
extern void _ZN7ee572623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee572623barEv,_ZTv0_n16_N7ee572623barEv)();
extern void ABISELECT(_ZThn16_N7ee572623barEv,_ZThn8_N7ee572623barEv)() __attribute__((weak));
extern void _ZN6dd72623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee572623barEv,_ZTv0_n16_N7ee572623barEv)();
extern void ABISELECT(_ZThn32_N7ee572623barEv,_ZThn16_N7ee572623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57262[0]),
  (VTBL_ENTRY)&_ZN7ee572623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee572623barEv,_ZTv0_n16_N7ee572623barEv),
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee572623barEv,_ZTv0_n16_N7ee572623barEv),
};
extern VTBL_ENTRY _ZTV7ee57262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee57262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee57262[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee57262[] = {
  {&(_ZTV7ee57262[4]),  4,18},
  {&(_ZTV7ee57262[10]),  10,18},
  {&(_ZTV7ee57262[16]),  16,18},
  {&(_tg__ZTV6dd7262__7ee57262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee57262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57262[];
extern  VTBL_ENTRY _ZTV7ee57262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57262[];
static VTBL_ENTRY alt_thunk_names1084[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee572623barEv,_ZTv0_n16_N7ee572623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee572623barEv,_ZThn16_N7ee572623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee572623barEv,_ZThn8_N7ee572623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57262 = {  "ee57262", // class name
  bases_ee57262, 4,
  &(vtc_ee57262[0]), // expected_vtbl_contents
  &(vtt_ee57262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57262),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1084,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67262  : dd7262 {
  int e;
  virtual void  foo(); // _ZN7ee672623fooEv
  virtual void  bar(); // _ZN7ee672623barEv
  ~ee67262(); // tgen
  ee67262(); // tgen
};
//SIG(1 ee67262) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67262 ::foo(){vfunc_called(this, "_ZN7ee672623fooEv");}
void  ee67262 ::bar(){vfunc_called(this, "_ZN7ee672623barEv");}
ee67262 ::~ee67262(){ note_dtor("ee67262", this);} // tgen
ee67262 ::ee67262(){ note_ctor("ee67262", this);} // tgen

static void Test_ee67262()
{
  extern Class_Descriptor cd_ee67262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67262, buf);
    ee67262 *dp, &lv = *(dp=new (buf) ee67262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(16,12), "ee67262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(16,12), "ee67262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(16,12), "ee67262");
    check_base_class_offset(lv, (dd7262*), 0, "ee67262");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67262.e");
    test_class_info(&lv, &cd_ee67262);
    dp->~ee67262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67262(Test_ee67262, "ee67262", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67262C1Ev();
extern void _ZN7ee67262D1Ev();
Name_Map name_map_ee67262[] = {
  NSPAIR(_ZN7ee67262C1Ev),
  NSPAIR(_ZN7ee67262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee67262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc262,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67262[];
extern void _ZN7ee672623barEv();
extern void _ZN7ee672623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee672623fooEv,_ZTv0_n12_N7ee672623fooEv)();
extern void ABISELECT(_ZThn16_N7ee672623fooEv,_ZThn12_N7ee672623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee672623barEv,_ZTv0_n16_N7ee672623barEv)();
extern void ABISELECT(_ZThn16_N7ee672623barEv,_ZThn12_N7ee672623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67262[0]),
  (VTBL_ENTRY)&_ZN7ee672623barEv,
  (VTBL_ENTRY)&_ZN7ee672623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee672623fooEv,_ZTv0_n12_N7ee672623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee672623barEv,_ZTv0_n16_N7ee672623barEv),
};
extern VTBL_ENTRY _ZTV7ee67262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee67262[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee67262[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee67262[] = {
  {&(_ZTV7ee67262[3]),  3,11},
  {&(_tg__ZTV6dd7262__7ee67262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee67262[4]),  4,6},
  {&(_ZTV7ee67262[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67262[];
extern  VTBL_ENTRY _ZTV7ee67262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67262[];
static VTBL_ENTRY alt_thunk_names1085[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn12_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn12_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee672623barEv,_ZTv0_n16_N7ee672623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee672623barEv,_ZThn12_N7ee672623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee672623fooEv,_ZTv0_n12_N7ee672623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee672623fooEv,_ZThn12_N7ee672623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67262 = {  "ee67262", // class name
  bases_ee67262, 4,
  &(vtc_ee67262[0]), // expected_vtbl_contents
  &(vtt_ee67262[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67262),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67262),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67262),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1085,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77262  : virtual dd7262 {
  int e;
  virtual void  foo(); // _ZN7ee772623fooEv
  virtual void  bar(); // _ZN7ee772623barEv
  ~ee77262(); // tgen
  ee77262(); // tgen
};
//SIG(1 ee77262) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77262 ::foo(){vfunc_called(this, "_ZN7ee772623fooEv");}
void  ee77262 ::bar(){vfunc_called(this, "_ZN7ee772623barEv");}
ee77262 ::~ee77262(){ note_dtor("ee77262", this);} // tgen
ee77262 ::ee77262(){ note_ctor("ee77262", this);} // tgen

static void Test_ee77262()
{
  extern Class_Descriptor cd_ee77262;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77262, buf);
    ee77262 *dp, &lv = *(dp=new (buf) ee77262());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77262)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77262)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc262*), ABISELECT(32,16), "ee77262");
    check_base_class_offset(lv, (bb62*)(cc262*), ABISELECT(32,16), "ee77262");
    check_base_class_offset(lv, (cc262*)(dd7262*), ABISELECT(32,16), "ee77262");
    check_base_class_offset(lv, (dd7262*), ABISELECT(16,8), "ee77262");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77262.e");
    test_class_info(&lv, &cd_ee77262);
    dp->~ee77262();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77262(Test_ee77262, "ee77262", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77262C1Ev();
extern void _ZN7ee77262D1Ev();
Name_Map name_map_ee77262[] = {
  NSPAIR(_ZN7ee77262C1Ev),
  NSPAIR(_ZN7ee77262D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc262;
extern VTBL_ENTRY _ZTI5cc262[];
extern  VTBL_ENTRY _ZTV5cc262[];
extern Class_Descriptor cd_dd7262;
extern VTBL_ENTRY _ZTI6dd7262[];
extern  VTBL_ENTRY _ZTV6dd7262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7262[];
static Base_Class bases_ee77262[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc262,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7262,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77262[];
extern void _ZN7ee772623fooEv();
extern void _ZN7ee772623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee772623barEv,_ZTv0_n16_N7ee772623barEv)();
extern void ABISELECT(_ZThn16_N7ee772623barEv,_ZThn8_N7ee772623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee772623fooEv,_ZTv0_n20_N7ee772623fooEv)();
extern void ABISELECT(_ZThn16_N7ee772623fooEv,_ZThn8_N7ee772623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee772623fooEv,_ZTv0_n12_N7ee772623fooEv)();
extern void ABISELECT(_ZThn32_N7ee772623fooEv,_ZThn16_N7ee772623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee772623barEv,_ZTv0_n16_N7ee772623barEv)();
extern void ABISELECT(_ZThn32_N7ee772623barEv,_ZThn16_N7ee772623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77262[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77262[0]),
  (VTBL_ENTRY)&_ZN7ee772623fooEv,
  (VTBL_ENTRY)&_ZN7ee772623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee772623barEv,_ZTv0_n16_N7ee772623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee772623fooEv,_ZTv0_n20_N7ee772623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee772623fooEv,_ZTv0_n12_N7ee772623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee772623barEv,_ZTv0_n16_N7ee772623barEv),
};
extern VTBL_ENTRY _ZTV7ee77262[];
extern void _ZN6dd72623barEv();
extern void _ZN6dd72623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7262__7ee77262[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&_ZN6dd72623barEv,
  (VTBL_ENTRY)&_ZN6dd72623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv)();
extern void ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv)();
extern void ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc262__6dd7262__7ee77262[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7262[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv),
};
static  VTT_ENTRY vtt_ee77262[] = {
  {&(_ZTV7ee77262[4]),  4,19},
  {&(_ZTV7ee77262[11]),  11,19},
  {&(_ZTV7ee77262[17]),  17,19},
  {&(_tg__ZTV6dd7262__7ee77262[3]),  3,5},
  {&(_tg__ZTV5cc262__6dd7262__7ee77262[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77262[];
extern  VTBL_ENTRY _ZTV7ee77262[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77262[];
static VTBL_ENTRY alt_thunk_names1086[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd72623barEv,_ZTv0_n16_N6dd72623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623barEv,_ZThn8_N6dd72623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd72623fooEv,_ZTv0_n12_N6dd72623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd72623fooEv,_ZThn8_N6dd72623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee772623fooEv,_ZTv0_n12_N7ee772623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee772623fooEv,_ZThn16_N7ee772623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee772623fooEv,_ZTv0_n20_N7ee772623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee772623fooEv,_ZThn8_N7ee772623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee772623barEv,_ZTv0_n16_N7ee772623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee772623barEv,_ZThn16_N7ee772623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee772623barEv,_ZThn8_N7ee772623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77262 = {  "ee77262", // class name
  bases_ee77262, 4,
  &(vtc_ee77262[0]), // expected_vtbl_contents
  &(vtt_ee77262[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77262),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77262),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77262),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1086,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc362  : virtual bb62 {
  int c;
  virtual void  foo(); // _ZN5cc3623fooEv
  ~cc362(); // tgen
  cc362(); // tgen
};
//SIG(-1 cc362) C1{ VBC2{ BC3{ v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  cc362 ::foo(){vfunc_called(this, "_ZN5cc3623fooEv");}
cc362 ::~cc362(){ note_dtor("cc362", this);} // tgen
cc362 ::cc362(){ note_ctor("cc362", this);} // tgen

static void Test_cc362()
{
  extern Class_Descriptor cd_cc362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc362, buf);
    cc362 *dp, &lv = *(dp=new (buf) cc362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,8), "cc362");
    check_base_class_offset(lv, (bb62*), ABISELECT(16,8), "cc362");
    check_field_offset(lv, c, ABISELECT(8,4), "cc362.c");
    test_class_info(&lv, &cd_cc362);
    dp->~cc362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc362(Test_cc362, "cc362", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc362C1Ev();
extern void _ZN5cc362D1Ev();
Name_Map name_map_cc362[] = {
  NSPAIR(_ZN5cc362C1Ev),
  NSPAIR(_ZN5cc362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI5cc362[];
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_cc362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV5cc362[];
static  VTT_ENTRY vtt_cc362[] = {
  {&(_ZTV5cc362[3]),  3,10},
  {&(_ZTV5cc362[8]),  8,10},
};
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static VTBL_ENTRY alt_thunk_names1087[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc362 = {  "cc362", // class name
  bases_cc362, 2,
  &(vtc_cc362[0]), // expected_vtbl_contents
  &(vtt_cc362[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc362),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc362),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1087,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0362  : cc362 {
  int d;
  ~dd0362(); // tgen
  dd0362(); // tgen
};
//SIG(-1 dd0362) C1{ BC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


dd0362 ::~dd0362(){ note_dtor("dd0362", this);} // tgen
dd0362 ::dd0362(){ note_ctor("dd0362", this);} // tgen

static void Test_dd0362()
{
  extern Class_Descriptor cd_dd0362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0362, buf);
    dd0362 *dp, &lv = *(dp=new (buf) dd0362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd0362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(16,12), "dd0362");
    check_base_class_offset(lv, (cc362*), 0, "dd0362");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0362.d");
    test_class_info(&lv, &cd_dd0362);
    dp->~dd0362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0362(Test_dd0362, "dd0362", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0362C1Ev();
extern void _ZN6dd0362D1Ev();
Name_Map name_map_dd0362[] = {
  NSPAIR(_ZN6dd0362C1Ev),
  NSPAIR(_ZN6dd0362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd0362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0362[];
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd0362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd0362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd0362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd0362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd0362[] = {
  {&(_ZTV6dd0362[3]),  3,10},
  {&(_tg__ZTV5cc362__6dd0362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd0362[4]),  4,6},
  {&(_ZTV6dd0362[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static VTBL_ENTRY alt_thunk_names1088[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0362 = {  "dd0362", // class name
  bases_dd0362, 3,
  &(vtc_dd0362[0]), // expected_vtbl_contents
  &(vtt_dd0362[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0362),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0362),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1088,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00362  : dd0362 {
  int e;
  ~ee00362(); // tgen
  ee00362(); // tgen
};
//SIG(1 ee00362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee00362 ::~ee00362(){ note_dtor("ee00362", this);} // tgen
ee00362 ::ee00362(){ note_ctor("ee00362", this);} // tgen

static void Test_ee00362()
{
  extern Class_Descriptor cd_ee00362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00362, buf);
    ee00362 *dp, &lv = *(dp=new (buf) ee00362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee00362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(24,16), "ee00362");
    check_base_class_offset(lv, (cc362*)(dd0362*), 0, "ee00362");
    check_base_class_offset(lv, (dd0362*), 0, "ee00362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00362.e");
    test_class_info(&lv, &cd_ee00362);
    dp->~ee00362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00362(Test_ee00362, "ee00362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00362C1Ev();
extern void _ZN7ee00362D1Ev();
Name_Map name_map_ee00362[] = {
  NSPAIR(_ZN7ee00362C1Ev),
  NSPAIR(_ZN7ee00362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee00362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00362[];
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee00362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee00362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee00362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee00362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee00362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee00362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee00362[] = {
  {&(_ZTV7ee00362[3]),  3,10},
  {&(_tg__ZTV6dd0362__7ee00362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee00362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee00362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee00362[4]),  4,6},
  {&(_ZTV7ee00362[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee00362[];
extern  VTBL_ENTRY _ZTV7ee00362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00362[];
static VTBL_ENTRY alt_thunk_names1089[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00362 = {  "ee00362", // class name
  bases_ee00362, 4,
  &(vtc_ee00362[0]), // expected_vtbl_contents
  &(vtt_ee00362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00362),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1089,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10362  : virtual dd0362 {
  int e;
  ~ee10362(); // tgen
  ee10362(); // tgen
};
//SIG(1 ee10362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee10362 ::~ee10362(){ note_dtor("ee10362", this);} // tgen
ee10362 ::ee10362(){ note_ctor("ee10362", this);} // tgen

static void Test_ee10362()
{
  extern Class_Descriptor cd_ee10362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10362, buf);
    ee10362 *dp, &lv = *(dp=new (buf) ee10362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee10362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(32,20), "ee10362");
    check_base_class_offset(lv, (cc362*)(dd0362*), ABISELECT(16,8), "ee10362");
    check_base_class_offset(lv, (dd0362*), ABISELECT(16,8), "ee10362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10362.e");
    test_class_info(&lv, &cd_ee10362);
    dp->~ee10362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10362(Test_ee10362, "ee10362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10362C1Ev();
extern void _ZN7ee10362D1Ev();
Name_Map name_map_ee10362[] = {
  NSPAIR(_ZN7ee10362C1Ev),
  NSPAIR(_ZN7ee10362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee10362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10362[];
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee10362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10362[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee10362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee10362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee10362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee10362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee10362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee10362[] = {
  {&(_ZTV7ee10362[4]),  4,15},
  {&(_ZTV7ee10362[8]),  8,15},
  {&(_ZTV7ee10362[13]),  13,15},
  {&(_tg__ZTV6dd0362__7ee10362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee10362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee10362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee10362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10362[];
extern  VTBL_ENTRY _ZTV7ee10362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10362[];
static VTBL_ENTRY alt_thunk_names1090[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10362 = {  "ee10362", // class name
  bases_ee10362, 4,
  &(vtc_ee10362[0]), // expected_vtbl_contents
  &(vtt_ee10362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10362),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1090,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20362  : dd0362 {
  int e;
  virtual void  foo(); // _ZN7ee203623fooEv
  ~ee20362(); // tgen
  ee20362(); // tgen
};
//SIG(1 ee20362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee20362 ::foo(){vfunc_called(this, "_ZN7ee203623fooEv");}
ee20362 ::~ee20362(){ note_dtor("ee20362", this);} // tgen
ee20362 ::ee20362(){ note_ctor("ee20362", this);} // tgen

static void Test_ee20362()
{
  extern Class_Descriptor cd_ee20362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20362, buf);
    ee20362 *dp, &lv = *(dp=new (buf) ee20362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee20362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(24,16), "ee20362");
    check_base_class_offset(lv, (cc362*)(dd0362*), 0, "ee20362");
    check_base_class_offset(lv, (dd0362*), 0, "ee20362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20362.e");
    test_class_info(&lv, &cd_ee20362);
    dp->~ee20362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20362(Test_ee20362, "ee20362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20362C1Ev();
extern void _ZN7ee20362D1Ev();
Name_Map name_map_ee20362[] = {
  NSPAIR(_ZN7ee20362C1Ev),
  NSPAIR(_ZN7ee20362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee20362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20362[];
extern void _ZN7ee203623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee203623fooEv,_ZTv0_n12_N7ee203623fooEv)();
extern void ABISELECT(_ZThn24_N7ee203623fooEv,_ZThn16_N7ee203623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee20362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20362[0]),
  (VTBL_ENTRY)&_ZN7ee203623fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee203623fooEv,_ZTv0_n12_N7ee203623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee20362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee20362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee20362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee20362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee20362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee20362[] = {
  {&(_ZTV7ee20362[3]),  3,10},
  {&(_tg__ZTV6dd0362__7ee20362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee20362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee20362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee20362[4]),  4,6},
  {&(_ZTV7ee20362[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee20362[];
extern  VTBL_ENTRY _ZTV7ee20362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20362[];
static VTBL_ENTRY alt_thunk_names1091[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee203623fooEv,_ZTv0_n12_N7ee203623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee203623fooEv,_ZThn16_N7ee203623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20362 = {  "ee20362", // class name
  bases_ee20362, 4,
  &(vtc_ee20362[0]), // expected_vtbl_contents
  &(vtt_ee20362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20362),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1091,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30362  : virtual dd0362 {
  int e;
  virtual void  foo(); // _ZN7ee303623fooEv
  ~ee30362(); // tgen
  ee30362(); // tgen
};
//SIG(1 ee30362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee30362 ::foo(){vfunc_called(this, "_ZN7ee303623fooEv");}
ee30362 ::~ee30362(){ note_dtor("ee30362", this);} // tgen
ee30362 ::ee30362(){ note_ctor("ee30362", this);} // tgen

static void Test_ee30362()
{
  extern Class_Descriptor cd_ee30362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30362, buf);
    ee30362 *dp, &lv = *(dp=new (buf) ee30362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee30362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(32,20), "ee30362");
    check_base_class_offset(lv, (cc362*)(dd0362*), ABISELECT(16,8), "ee30362");
    check_base_class_offset(lv, (dd0362*), ABISELECT(16,8), "ee30362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30362.e");
    test_class_info(&lv, &cd_ee30362);
    dp->~ee30362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30362(Test_ee30362, "ee30362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30362C1Ev();
extern void _ZN7ee30362D1Ev();
Name_Map name_map_ee30362[] = {
  NSPAIR(_ZN7ee30362C1Ev),
  NSPAIR(_ZN7ee30362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee30362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30362[];
extern void _ZN7ee303623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee303623fooEv,_ZTv0_n16_N7ee303623fooEv)();
extern void ABISELECT(_ZThn16_N7ee303623fooEv,_ZThn8_N7ee303623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee303623fooEv,_ZTv0_n12_N7ee303623fooEv)();
extern void ABISELECT(_ZThn32_N7ee303623fooEv,_ZThn20_N7ee303623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee30362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30362[0]),
  (VTBL_ENTRY)&_ZN7ee303623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee303623fooEv,_ZTv0_n16_N7ee303623fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee303623fooEv,_ZTv0_n12_N7ee303623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee30362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee30362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee30362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee30362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee30362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee30362[] = {
  {&(_ZTV7ee30362[4]),  4,16},
  {&(_ZTV7ee30362[9]),  9,16},
  {&(_ZTV7ee30362[14]),  14,16},
  {&(_tg__ZTV6dd0362__7ee30362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee30362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee30362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee30362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30362[];
extern  VTBL_ENTRY _ZTV7ee30362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30362[];
static VTBL_ENTRY alt_thunk_names1092[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee303623fooEv,_ZTv0_n12_N7ee303623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee303623fooEv,_ZThn20_N7ee303623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee303623fooEv,_ZTv0_n16_N7ee303623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee303623fooEv,_ZThn8_N7ee303623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30362 = {  "ee30362", // class name
  bases_ee30362, 4,
  &(vtc_ee30362[0]), // expected_vtbl_contents
  &(vtt_ee30362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1092,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40362  : dd0362 {
  int e;
  virtual void  bar(); // _ZN7ee403623barEv
  ~ee40362(); // tgen
  ee40362(); // tgen
};
//SIG(1 ee40362) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee40362 ::bar(){vfunc_called(this, "_ZN7ee403623barEv");}
ee40362 ::~ee40362(){ note_dtor("ee40362", this);} // tgen
ee40362 ::ee40362(){ note_ctor("ee40362", this);} // tgen

static void Test_ee40362()
{
  extern Class_Descriptor cd_ee40362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40362, buf);
    ee40362 *dp, &lv = *(dp=new (buf) ee40362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee40362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(24,16), "ee40362");
    check_base_class_offset(lv, (cc362*)(dd0362*), 0, "ee40362");
    check_base_class_offset(lv, (dd0362*), 0, "ee40362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40362.e");
    test_class_info(&lv, &cd_ee40362);
    dp->~ee40362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40362(Test_ee40362, "ee40362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40362C1Ev();
extern void _ZN7ee40362D1Ev();
Name_Map name_map_ee40362[] = {
  NSPAIR(_ZN7ee40362C1Ev),
  NSPAIR(_ZN7ee40362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee40362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40362[];
extern void _ZN5cc3623fooEv();
extern void _ZN7ee403623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee403623barEv,_ZTv0_n16_N7ee403623barEv)();
extern void ABISELECT(_ZThn24_N7ee403623barEv,_ZThn16_N7ee403623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN7ee403623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee403623barEv,_ZTv0_n16_N7ee403623barEv),
};
extern VTBL_ENTRY _ZTV7ee40362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee40362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee40362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee40362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee40362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee40362[] = {
  {&(_ZTV7ee40362[3]),  3,11},
  {&(_tg__ZTV6dd0362__7ee40362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee40362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee40362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee40362[4]),  4,6},
  {&(_ZTV7ee40362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee40362[];
extern  VTBL_ENTRY _ZTV7ee40362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40362[];
static VTBL_ENTRY alt_thunk_names1093[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee403623barEv,_ZTv0_n16_N7ee403623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee403623barEv,_ZThn16_N7ee403623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40362 = {  "ee40362", // class name
  bases_ee40362, 4,
  &(vtc_ee40362[0]), // expected_vtbl_contents
  &(vtt_ee40362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1093,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50362  : virtual dd0362 {
  int e;
  virtual void  bar(); // _ZN7ee503623barEv
  ~ee50362(); // tgen
  ee50362(); // tgen
};
//SIG(1 ee50362) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee50362 ::bar(){vfunc_called(this, "_ZN7ee503623barEv");}
ee50362 ::~ee50362(){ note_dtor("ee50362", this);} // tgen
ee50362 ::ee50362(){ note_ctor("ee50362", this);} // tgen

static void Test_ee50362()
{
  extern Class_Descriptor cd_ee50362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50362, buf);
    ee50362 *dp, &lv = *(dp=new (buf) ee50362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee50362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(32,20), "ee50362");
    check_base_class_offset(lv, (cc362*)(dd0362*), ABISELECT(16,8), "ee50362");
    check_base_class_offset(lv, (dd0362*), ABISELECT(16,8), "ee50362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50362.e");
    test_class_info(&lv, &cd_ee50362);
    dp->~ee50362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50362(Test_ee50362, "ee50362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50362C1Ev();
extern void _ZN7ee50362D1Ev();
Name_Map name_map_ee50362[] = {
  NSPAIR(_ZN7ee50362C1Ev),
  NSPAIR(_ZN7ee50362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee50362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50362[];
extern void _ZN7ee503623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee503623barEv,_ZTv0_n16_N7ee503623barEv)();
extern void ABISELECT(_ZThn32_N7ee503623barEv,_ZThn20_N7ee503623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50362[0]),
  (VTBL_ENTRY)&_ZN7ee503623barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee503623barEv,_ZTv0_n16_N7ee503623barEv),
};
extern VTBL_ENTRY _ZTV7ee50362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee50362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee50362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee50362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee50362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee50362[] = {
  {&(_ZTV7ee50362[4]),  4,16},
  {&(_ZTV7ee50362[9]),  9,16},
  {&(_ZTV7ee50362[14]),  14,16},
  {&(_tg__ZTV6dd0362__7ee50362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee50362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee50362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee50362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50362[];
extern  VTBL_ENTRY _ZTV7ee50362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50362[];
static VTBL_ENTRY alt_thunk_names1094[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee503623barEv,_ZTv0_n16_N7ee503623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee503623barEv,_ZThn20_N7ee503623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50362 = {  "ee50362", // class name
  bases_ee50362, 4,
  &(vtc_ee50362[0]), // expected_vtbl_contents
  &(vtt_ee50362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1094,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60362  : dd0362 {
  int e;
  virtual void  foo(); // _ZN7ee603623fooEv
  virtual void  bar(); // _ZN7ee603623barEv
  ~ee60362(); // tgen
  ee60362(); // tgen
};
//SIG(1 ee60362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee60362 ::foo(){vfunc_called(this, "_ZN7ee603623fooEv");}
void  ee60362 ::bar(){vfunc_called(this, "_ZN7ee603623barEv");}
ee60362 ::~ee60362(){ note_dtor("ee60362", this);} // tgen
ee60362 ::ee60362(){ note_ctor("ee60362", this);} // tgen

static void Test_ee60362()
{
  extern Class_Descriptor cd_ee60362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60362, buf);
    ee60362 *dp, &lv = *(dp=new (buf) ee60362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee60362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(24,16), "ee60362");
    check_base_class_offset(lv, (cc362*)(dd0362*), 0, "ee60362");
    check_base_class_offset(lv, (dd0362*), 0, "ee60362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60362.e");
    test_class_info(&lv, &cd_ee60362);
    dp->~ee60362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60362(Test_ee60362, "ee60362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60362C1Ev();
extern void _ZN7ee60362D1Ev();
Name_Map name_map_ee60362[] = {
  NSPAIR(_ZN7ee60362C1Ev),
  NSPAIR(_ZN7ee60362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee60362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60362[];
extern void _ZN7ee603623fooEv();
extern void _ZN7ee603623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee603623fooEv,_ZTv0_n12_N7ee603623fooEv)();
extern void ABISELECT(_ZThn24_N7ee603623fooEv,_ZThn16_N7ee603623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee603623barEv,_ZTv0_n16_N7ee603623barEv)();
extern void ABISELECT(_ZThn24_N7ee603623barEv,_ZThn16_N7ee603623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60362[0]),
  (VTBL_ENTRY)&_ZN7ee603623fooEv,
  (VTBL_ENTRY)&_ZN7ee603623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee603623fooEv,_ZTv0_n12_N7ee603623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee603623barEv,_ZTv0_n16_N7ee603623barEv),
};
extern VTBL_ENTRY _ZTV7ee60362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee60362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee60362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee60362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee60362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee60362[] = {
  {&(_ZTV7ee60362[3]),  3,11},
  {&(_tg__ZTV6dd0362__7ee60362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee60362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee60362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee60362[4]),  4,6},
  {&(_ZTV7ee60362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60362[];
extern  VTBL_ENTRY _ZTV7ee60362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60362[];
static VTBL_ENTRY alt_thunk_names1095[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee603623barEv,_ZTv0_n16_N7ee603623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee603623barEv,_ZThn16_N7ee603623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee603623fooEv,_ZTv0_n12_N7ee603623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee603623fooEv,_ZThn16_N7ee603623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60362 = {  "ee60362", // class name
  bases_ee60362, 4,
  &(vtc_ee60362[0]), // expected_vtbl_contents
  &(vtt_ee60362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1095,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70362  : virtual dd0362 {
  int e;
  virtual void  foo(); // _ZN7ee703623fooEv
  virtual void  bar(); // _ZN7ee703623barEv
  ~ee70362(); // tgen
  ee70362(); // tgen
};
//SIG(1 ee70362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee70362 ::foo(){vfunc_called(this, "_ZN7ee703623fooEv");}
void  ee70362 ::bar(){vfunc_called(this, "_ZN7ee703623barEv");}
ee70362 ::~ee70362(){ note_dtor("ee70362", this);} // tgen
ee70362 ::ee70362(){ note_ctor("ee70362", this);} // tgen

static void Test_ee70362()
{
  extern Class_Descriptor cd_ee70362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70362, buf);
    ee70362 *dp, &lv = *(dp=new (buf) ee70362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee70362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd0362*), ABISELECT(32,20), "ee70362");
    check_base_class_offset(lv, (cc362*)(dd0362*), ABISELECT(16,8), "ee70362");
    check_base_class_offset(lv, (dd0362*), ABISELECT(16,8), "ee70362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70362.e");
    test_class_info(&lv, &cd_ee70362);
    dp->~ee70362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70362(Test_ee70362, "ee70362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70362C1Ev();
extern void _ZN7ee70362D1Ev();
Name_Map name_map_ee70362[] = {
  NSPAIR(_ZN7ee70362C1Ev),
  NSPAIR(_ZN7ee70362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd0362;
extern VTBL_ENTRY _ZTI6dd0362[];
extern  VTBL_ENTRY _ZTV6dd0362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0362[];
static Base_Class bases_ee70362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0362,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee70362[];
extern void _ZN7ee703623fooEv();
extern void _ZN7ee703623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee703623fooEv,_ZTv0_n16_N7ee703623fooEv)();
extern void ABISELECT(_ZThn16_N7ee703623fooEv,_ZThn8_N7ee703623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee703623fooEv,_ZTv0_n12_N7ee703623fooEv)();
extern void ABISELECT(_ZThn32_N7ee703623fooEv,_ZThn20_N7ee703623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee703623barEv,_ZTv0_n16_N7ee703623barEv)();
extern void ABISELECT(_ZThn32_N7ee703623barEv,_ZThn20_N7ee703623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70362[0]),
  (VTBL_ENTRY)&_ZN7ee703623fooEv,
  (VTBL_ENTRY)&_ZN7ee703623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee703623fooEv,_ZTv0_n16_N7ee703623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee703623fooEv,_ZTv0_n12_N7ee703623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee703623barEv,_ZTv0_n16_N7ee703623barEv),
};
extern VTBL_ENTRY _ZTV7ee70362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd0362__7ee70362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd0362__7ee70362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd0362__7ee70362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0362__7ee70362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee70362[] = {
  {&(_ZTV7ee70362[4]),  4,17},
  {&(_ZTV7ee70362[10]),  10,17},
  {&(_ZTV7ee70362[15]),  15,17},
  {&(_tg__ZTV6dd0362__7ee70362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd0362__7ee70362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd0362__7ee70362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0362__7ee70362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70362[];
extern  VTBL_ENTRY _ZTV7ee70362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70362[];
static VTBL_ENTRY alt_thunk_names1096[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee703623barEv,_ZTv0_n16_N7ee703623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee703623barEv,_ZThn20_N7ee703623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee703623fooEv,_ZTv0_n12_N7ee703623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee703623fooEv,_ZThn20_N7ee703623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee703623fooEv,_ZTv0_n16_N7ee703623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee703623fooEv,_ZThn8_N7ee703623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70362 = {  "ee70362", // class name
  bases_ee70362, 4,
  &(vtc_ee70362[0]), // expected_vtbl_contents
  &(vtt_ee70362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1096,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1362  : virtual cc362 {
  int d;
  ~dd1362(); // tgen
  dd1362(); // tgen
};
//SIG(-1 dd1362) C1{ VBC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


dd1362 ::~dd1362(){ note_dtor("dd1362", this);} // tgen
dd1362 ::dd1362(){ note_ctor("dd1362", this);} // tgen

static void Test_dd1362()
{
  extern Class_Descriptor cd_dd1362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1362, buf);
    dd1362 *dp, &lv = *(dp=new (buf) dd1362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd1362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,16), "dd1362");
    check_base_class_offset(lv, (cc362*), ABISELECT(16,8), "dd1362");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1362.d");
    test_class_info(&lv, &cd_dd1362);
    dp->~dd1362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1362(Test_dd1362, "dd1362", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1362C1Ev();
extern void _ZN6dd1362D1Ev();
Name_Map name_map_dd1362[] = {
  NSPAIR(_ZN6dd1362C1Ev),
  NSPAIR(_ZN6dd1362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd1362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1362[];
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd1362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd1362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd1362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd1362[] = {
  {&(_ZTV6dd1362[4]),  4,15},
  {&(_ZTV6dd1362[8]),  8,15},
  {&(_ZTV6dd1362[13]),  13,15},
  {&(_tg__ZTV5cc362__6dd1362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd1362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static VTBL_ENTRY alt_thunk_names1097[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1362 = {  "dd1362", // class name
  bases_dd1362, 3,
  &(vtc_dd1362[0]), // expected_vtbl_contents
  &(vtt_dd1362[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1362),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1362),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1097,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01362  : dd1362 {
  int e;
  ~ee01362(); // tgen
  ee01362(); // tgen
};
//SIG(1 ee01362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee01362 ::~ee01362(){ note_dtor("ee01362", this);} // tgen
ee01362 ::ee01362(){ note_ctor("ee01362", this);} // tgen

static void Test_ee01362()
{
  extern Class_Descriptor cd_ee01362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01362, buf);
    ee01362 *dp, &lv = *(dp=new (buf) ee01362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee01362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee01362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(16,12), "ee01362");
    check_base_class_offset(lv, (dd1362*), 0, "ee01362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01362.e");
    test_class_info(&lv, &cd_ee01362);
    dp->~ee01362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01362(Test_ee01362, "ee01362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01362C1Ev();
extern void _ZN7ee01362D1Ev();
Name_Map name_map_ee01362[] = {
  NSPAIR(_ZN7ee01362C1Ev),
  NSPAIR(_ZN7ee01362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee01362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01362[];
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee01362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01362[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee01362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee01362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee01362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee01362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee01362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee01362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee01362[] = {
  {&(_ZTV7ee01362[4]),  4,15},
  {&(_tg__ZTV6dd1362__7ee01362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee01362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee01362[4]),  4,6},
  {&(_ZTV7ee01362[8]),  8,15},
  {&(_ZTV7ee01362[13]),  13,15},
  {&(_tg__ZTV5cc362__7ee01362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee01362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01362[];
extern  VTBL_ENTRY _ZTV7ee01362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01362[];
static VTBL_ENTRY alt_thunk_names1098[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01362 = {  "ee01362", // class name
  bases_ee01362, 4,
  &(vtc_ee01362[0]), // expected_vtbl_contents
  &(vtt_ee01362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01362),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1098,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11362  : virtual dd1362 {
  int e;
  ~ee11362(); // tgen
  ee11362(); // tgen
};
//SIG(1 ee11362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} Fi}


ee11362 ::~ee11362(){ note_dtor("ee11362", this);} // tgen
ee11362 ::ee11362(){ note_ctor("ee11362", this);} // tgen

static void Test_ee11362()
{
  extern Class_Descriptor cd_ee11362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11362, buf);
    ee11362 *dp, &lv = *(dp=new (buf) ee11362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee11362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee11362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(32,16), "ee11362");
    check_base_class_offset(lv, (dd1362*), ABISELECT(16,8), "ee11362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11362.e");
    test_class_info(&lv, &cd_ee11362);
    dp->~ee11362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11362(Test_ee11362, "ee11362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11362C1Ev();
extern void _ZN7ee11362D1Ev();
Name_Map name_map_ee11362[] = {
  NSPAIR(_ZN7ee11362C1Ev),
  NSPAIR(_ZN7ee11362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee11362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11362[];
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee11362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11362[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11362[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee11362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee11362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee11362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee11362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee11362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee11362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee11362[] = {
  {&(_ZTV7ee11362[5]),  5,20},
  {&(_ZTV7ee11362[9]),  9,20},
  {&(_ZTV7ee11362[13]),  13,20},
  {&(_ZTV7ee11362[18]),  18,20},
  {&(_tg__ZTV6dd1362__7ee11362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee11362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee11362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee11362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee11362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11362[];
extern  VTBL_ENTRY _ZTV7ee11362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11362[];
static VTBL_ENTRY alt_thunk_names1099[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11362 = {  "ee11362", // class name
  bases_ee11362, 4,
  &(vtc_ee11362[0]), // expected_vtbl_contents
  &(vtt_ee11362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11362),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1099,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21362  : dd1362 {
  int e;
  virtual void  foo(); // _ZN7ee213623fooEv
  ~ee21362(); // tgen
  ee21362(); // tgen
};
//SIG(1 ee21362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee21362 ::foo(){vfunc_called(this, "_ZN7ee213623fooEv");}
ee21362 ::~ee21362(){ note_dtor("ee21362", this);} // tgen
ee21362 ::ee21362(){ note_ctor("ee21362", this);} // tgen

static void Test_ee21362()
{
  extern Class_Descriptor cd_ee21362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21362, buf);
    ee21362 *dp, &lv = *(dp=new (buf) ee21362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee21362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee21362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(16,12), "ee21362");
    check_base_class_offset(lv, (dd1362*), 0, "ee21362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21362.e");
    test_class_info(&lv, &cd_ee21362);
    dp->~ee21362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21362(Test_ee21362, "ee21362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21362C1Ev();
extern void _ZN7ee21362D1Ev();
Name_Map name_map_ee21362[] = {
  NSPAIR(_ZN7ee21362C1Ev),
  NSPAIR(_ZN7ee21362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee21362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21362[];
extern void _ZN7ee213623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee213623fooEv,_ZTv0_n16_N7ee213623fooEv)();
extern void ABISELECT(_ZThn16_N7ee213623fooEv,_ZThn12_N7ee213623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee213623fooEv,_ZTv0_n12_N7ee213623fooEv)();
extern void ABISELECT(_ZThn32_N7ee213623fooEv,_ZThn20_N7ee213623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee21362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21362[0]),
  (VTBL_ENTRY)&_ZN7ee213623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee213623fooEv,_ZTv0_n16_N7ee213623fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee213623fooEv,_ZTv0_n12_N7ee213623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee21362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee21362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee21362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee21362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee21362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee21362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee21362[] = {
  {&(_ZTV7ee21362[4]),  4,16},
  {&(_tg__ZTV6dd1362__7ee21362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee21362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee21362[4]),  4,6},
  {&(_ZTV7ee21362[9]),  9,16},
  {&(_ZTV7ee21362[14]),  14,16},
  {&(_tg__ZTV5cc362__7ee21362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee21362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21362[];
extern  VTBL_ENTRY _ZTV7ee21362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21362[];
static VTBL_ENTRY alt_thunk_names1100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee213623fooEv,_ZTv0_n12_N7ee213623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee213623fooEv,_ZThn20_N7ee213623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee213623fooEv,_ZTv0_n16_N7ee213623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee213623fooEv,_ZThn12_N7ee213623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21362 = {  "ee21362", // class name
  bases_ee21362, 4,
  &(vtc_ee21362[0]), // expected_vtbl_contents
  &(vtt_ee21362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1100,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31362  : virtual dd1362 {
  int e;
  virtual void  foo(); // _ZN7ee313623fooEv
  ~ee31362(); // tgen
  ee31362(); // tgen
};
//SIG(1 ee31362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 Fi}


void  ee31362 ::foo(){vfunc_called(this, "_ZN7ee313623fooEv");}
ee31362 ::~ee31362(){ note_dtor("ee31362", this);} // tgen
ee31362 ::ee31362(){ note_ctor("ee31362", this);} // tgen

static void Test_ee31362()
{
  extern Class_Descriptor cd_ee31362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31362, buf);
    ee31362 *dp, &lv = *(dp=new (buf) ee31362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee31362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee31362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(32,16), "ee31362");
    check_base_class_offset(lv, (dd1362*), ABISELECT(16,8), "ee31362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31362.e");
    test_class_info(&lv, &cd_ee31362);
    dp->~ee31362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31362(Test_ee31362, "ee31362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31362C1Ev();
extern void _ZN7ee31362D1Ev();
Name_Map name_map_ee31362[] = {
  NSPAIR(_ZN7ee31362C1Ev),
  NSPAIR(_ZN7ee31362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee31362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31362[];
extern void _ZN7ee313623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee313623fooEv,_ZTv0_n16_N7ee313623fooEv)();
extern void ABISELECT(_ZThn32_N7ee313623fooEv,_ZThn16_N7ee313623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee313623fooEv,_ZTv0_n12_N7ee313623fooEv)();
extern void ABISELECT(_ZThn48_N7ee313623fooEv,_ZThn24_N7ee313623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee31362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31362[0]),
  (VTBL_ENTRY)&_ZN7ee313623fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31362[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee313623fooEv,_ZTv0_n16_N7ee313623fooEv),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee313623fooEv,_ZTv0_n12_N7ee313623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee31362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee31362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee31362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee31362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee31362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee31362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee31362[] = {
  {&(_ZTV7ee31362[5]),  5,21},
  {&(_ZTV7ee31362[10]),  10,21},
  {&(_ZTV7ee31362[14]),  14,21},
  {&(_ZTV7ee31362[19]),  19,21},
  {&(_tg__ZTV6dd1362__7ee31362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee31362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee31362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee31362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee31362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31362[];
extern  VTBL_ENTRY _ZTV7ee31362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31362[];
static VTBL_ENTRY alt_thunk_names1101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee313623fooEv,_ZTv0_n12_N7ee313623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee313623fooEv,_ZThn24_N7ee313623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee313623fooEv,_ZTv0_n16_N7ee313623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee313623fooEv,_ZThn16_N7ee313623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31362 = {  "ee31362", // class name
  bases_ee31362, 4,
  &(vtc_ee31362[0]), // expected_vtbl_contents
  &(vtt_ee31362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31362),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1101,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41362  : dd1362 {
  int e;
  virtual void  bar(); // _ZN7ee413623barEv
  ~ee41362(); // tgen
  ee41362(); // tgen
};
//SIG(1 ee41362) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee41362 ::bar(){vfunc_called(this, "_ZN7ee413623barEv");}
ee41362 ::~ee41362(){ note_dtor("ee41362", this);} // tgen
ee41362 ::ee41362(){ note_ctor("ee41362", this);} // tgen

static void Test_ee41362()
{
  extern Class_Descriptor cd_ee41362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41362, buf);
    ee41362 *dp, &lv = *(dp=new (buf) ee41362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee41362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee41362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(16,12), "ee41362");
    check_base_class_offset(lv, (dd1362*), 0, "ee41362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41362.e");
    test_class_info(&lv, &cd_ee41362);
    dp->~ee41362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41362(Test_ee41362, "ee41362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41362C1Ev();
extern void _ZN7ee41362D1Ev();
Name_Map name_map_ee41362[] = {
  NSPAIR(_ZN7ee41362C1Ev),
  NSPAIR(_ZN7ee41362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee41362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41362[];
extern void _ZN7ee413623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee413623barEv,_ZTv0_n16_N7ee413623barEv)();
extern void ABISELECT(_ZThn32_N7ee413623barEv,_ZThn20_N7ee413623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41362[0]),
  (VTBL_ENTRY)&_ZN7ee413623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee413623barEv,_ZTv0_n16_N7ee413623barEv),
};
extern VTBL_ENTRY _ZTV7ee41362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee41362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee41362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee41362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee41362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee41362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee41362[] = {
  {&(_ZTV7ee41362[4]),  4,16},
  {&(_tg__ZTV6dd1362__7ee41362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee41362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee41362[4]),  4,6},
  {&(_ZTV7ee41362[9]),  9,16},
  {&(_ZTV7ee41362[14]),  14,16},
  {&(_tg__ZTV5cc362__7ee41362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee41362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41362[];
extern  VTBL_ENTRY _ZTV7ee41362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41362[];
static VTBL_ENTRY alt_thunk_names1102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee413623barEv,_ZTv0_n16_N7ee413623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee413623barEv,_ZThn20_N7ee413623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41362 = {  "ee41362", // class name
  bases_ee41362, 4,
  &(vtc_ee41362[0]), // expected_vtbl_contents
  &(vtt_ee41362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1102,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51362  : virtual dd1362 {
  int e;
  virtual void  bar(); // _ZN7ee513623barEv
  ~ee51362(); // tgen
  ee51362(); // tgen
};
//SIG(1 ee51362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} Fi} v1 Fi}


void  ee51362 ::bar(){vfunc_called(this, "_ZN7ee513623barEv");}
ee51362 ::~ee51362(){ note_dtor("ee51362", this);} // tgen
ee51362 ::ee51362(){ note_ctor("ee51362", this);} // tgen

static void Test_ee51362()
{
  extern Class_Descriptor cd_ee51362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51362, buf);
    ee51362 *dp, &lv = *(dp=new (buf) ee51362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee51362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee51362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(32,16), "ee51362");
    check_base_class_offset(lv, (dd1362*), ABISELECT(16,8), "ee51362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51362.e");
    test_class_info(&lv, &cd_ee51362);
    dp->~ee51362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51362(Test_ee51362, "ee51362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51362C1Ev();
extern void _ZN7ee51362D1Ev();
Name_Map name_map_ee51362[] = {
  NSPAIR(_ZN7ee51362C1Ev),
  NSPAIR(_ZN7ee51362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee51362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51362[];
extern void _ZN7ee513623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee513623barEv,_ZTv0_n16_N7ee513623barEv)();
extern void ABISELECT(_ZThn48_N7ee513623barEv,_ZThn24_N7ee513623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51362[0]),
  (VTBL_ENTRY)&_ZN7ee513623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51362[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee513623barEv,_ZTv0_n16_N7ee513623barEv),
};
extern VTBL_ENTRY _ZTV7ee51362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee51362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee51362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee51362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee51362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee51362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee51362[] = {
  {&(_ZTV7ee51362[5]),  5,21},
  {&(_ZTV7ee51362[10]),  10,21},
  {&(_ZTV7ee51362[14]),  14,21},
  {&(_ZTV7ee51362[19]),  19,21},
  {&(_tg__ZTV6dd1362__7ee51362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee51362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee51362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee51362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee51362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51362[];
extern  VTBL_ENTRY _ZTV7ee51362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51362[];
static VTBL_ENTRY alt_thunk_names1103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee513623barEv,_ZTv0_n16_N7ee513623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee513623barEv,_ZThn24_N7ee513623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51362 = {  "ee51362", // class name
  bases_ee51362, 4,
  &(vtc_ee51362[0]), // expected_vtbl_contents
  &(vtt_ee51362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51362),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1103,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61362  : dd1362 {
  int e;
  virtual void  foo(); // _ZN7ee613623fooEv
  virtual void  bar(); // _ZN7ee613623barEv
  ~ee61362(); // tgen
  ee61362(); // tgen
};
//SIG(1 ee61362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee61362 ::foo(){vfunc_called(this, "_ZN7ee613623fooEv");}
void  ee61362 ::bar(){vfunc_called(this, "_ZN7ee613623barEv");}
ee61362 ::~ee61362(){ note_dtor("ee61362", this);} // tgen
ee61362 ::ee61362(){ note_ctor("ee61362", this);} // tgen

static void Test_ee61362()
{
  extern Class_Descriptor cd_ee61362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61362, buf);
    ee61362 *dp, &lv = *(dp=new (buf) ee61362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee61362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee61362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(16,12), "ee61362");
    check_base_class_offset(lv, (dd1362*), 0, "ee61362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61362.e");
    test_class_info(&lv, &cd_ee61362);
    dp->~ee61362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61362(Test_ee61362, "ee61362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61362C1Ev();
extern void _ZN7ee61362D1Ev();
Name_Map name_map_ee61362[] = {
  NSPAIR(_ZN7ee61362C1Ev),
  NSPAIR(_ZN7ee61362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee61362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61362[];
extern void _ZN7ee613623fooEv();
extern void _ZN7ee613623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee613623fooEv,_ZTv0_n16_N7ee613623fooEv)();
extern void ABISELECT(_ZThn16_N7ee613623fooEv,_ZThn12_N7ee613623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee613623fooEv,_ZTv0_n12_N7ee613623fooEv)();
extern void ABISELECT(_ZThn32_N7ee613623fooEv,_ZThn20_N7ee613623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee613623barEv,_ZTv0_n16_N7ee613623barEv)();
extern void ABISELECT(_ZThn32_N7ee613623barEv,_ZThn20_N7ee613623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61362[0]),
  (VTBL_ENTRY)&_ZN7ee613623fooEv,
  (VTBL_ENTRY)&_ZN7ee613623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee613623fooEv,_ZTv0_n16_N7ee613623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee613623fooEv,_ZTv0_n12_N7ee613623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee613623barEv,_ZTv0_n16_N7ee613623barEv),
};
extern VTBL_ENTRY _ZTV7ee61362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee61362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee61362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee61362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee61362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee61362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee61362[] = {
  {&(_ZTV7ee61362[4]),  4,17},
  {&(_tg__ZTV6dd1362__7ee61362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee61362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee61362[4]),  4,6},
  {&(_ZTV7ee61362[10]),  10,17},
  {&(_ZTV7ee61362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee61362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee61362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61362[];
extern  VTBL_ENTRY _ZTV7ee61362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61362[];
static VTBL_ENTRY alt_thunk_names1104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee613623barEv,_ZTv0_n16_N7ee613623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee613623barEv,_ZThn20_N7ee613623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee613623fooEv,_ZTv0_n12_N7ee613623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee613623fooEv,_ZThn20_N7ee613623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee613623fooEv,_ZTv0_n16_N7ee613623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee613623fooEv,_ZThn12_N7ee613623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61362 = {  "ee61362", // class name
  bases_ee61362, 4,
  &(vtc_ee61362[0]), // expected_vtbl_contents
  &(vtt_ee61362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1104,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71362  : virtual dd1362 {
  int e;
  virtual void  foo(); // _ZN7ee713623fooEv
  virtual void  bar(); // _ZN7ee713623barEv
  ~ee71362(); // tgen
  ee71362(); // tgen
};
//SIG(1 ee71362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi} v1 v2 Fi}


void  ee71362 ::foo(){vfunc_called(this, "_ZN7ee713623fooEv");}
void  ee71362 ::bar(){vfunc_called(this, "_ZN7ee713623barEv");}
ee71362 ::~ee71362(){ note_dtor("ee71362", this);} // tgen
ee71362 ::ee71362(){ note_ctor("ee71362", this);} // tgen

static void Test_ee71362()
{
  extern Class_Descriptor cd_ee71362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71362, buf);
    ee71362 *dp, &lv = *(dp=new (buf) ee71362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee71362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee71362");
    check_base_class_offset(lv, (cc362*)(dd1362*), ABISELECT(32,16), "ee71362");
    check_base_class_offset(lv, (dd1362*), ABISELECT(16,8), "ee71362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71362.e");
    test_class_info(&lv, &cd_ee71362);
    dp->~ee71362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71362(Test_ee71362, "ee71362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71362C1Ev();
extern void _ZN7ee71362D1Ev();
Name_Map name_map_ee71362[] = {
  NSPAIR(_ZN7ee71362C1Ev),
  NSPAIR(_ZN7ee71362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd1362;
extern VTBL_ENTRY _ZTI6dd1362[];
extern  VTBL_ENTRY _ZTV6dd1362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1362[];
static Base_Class bases_ee71362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1362,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71362[];
extern void _ZN7ee713623fooEv();
extern void _ZN7ee713623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee713623fooEv,_ZTv0_n16_N7ee713623fooEv)();
extern void ABISELECT(_ZThn32_N7ee713623fooEv,_ZThn16_N7ee713623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee713623fooEv,_ZTv0_n12_N7ee713623fooEv)();
extern void ABISELECT(_ZThn48_N7ee713623fooEv,_ZThn24_N7ee713623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee713623barEv,_ZTv0_n16_N7ee713623barEv)();
extern void ABISELECT(_ZThn48_N7ee713623barEv,_ZThn24_N7ee713623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71362[0]),
  (VTBL_ENTRY)&_ZN7ee713623fooEv,
  (VTBL_ENTRY)&_ZN7ee713623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71362[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee713623fooEv,_ZTv0_n16_N7ee713623fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee713623fooEv,_ZTv0_n12_N7ee713623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee713623barEv,_ZTv0_n16_N7ee713623barEv),
};
extern VTBL_ENTRY _ZTV7ee71362[];
static  VTBL_ENTRY _tg__ZTV6dd1362__7ee71362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd1362__7ee71362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1362__7ee71362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee71362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee71362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee71362[] = {
  {&(_ZTV7ee71362[5]),  5,22},
  {&(_ZTV7ee71362[11]),  11,22},
  {&(_ZTV7ee71362[15]),  15,22},
  {&(_ZTV7ee71362[20]),  20,22},
  {&(_tg__ZTV6dd1362__7ee71362[4]),  4,4},
  {&(_tg__ZTV5cc362__6dd1362__7ee71362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1362__7ee71362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee71362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee71362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71362[];
extern  VTBL_ENTRY _ZTV7ee71362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71362[];
static VTBL_ENTRY alt_thunk_names1105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee713623barEv,_ZTv0_n16_N7ee713623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee713623barEv,_ZThn24_N7ee713623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee713623fooEv,_ZTv0_n12_N7ee713623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee713623fooEv,_ZThn24_N7ee713623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee713623fooEv,_ZTv0_n16_N7ee713623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee713623fooEv,_ZThn16_N7ee713623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71362 = {  "ee71362", // class name
  bases_ee71362, 4,
  &(vtc_ee71362[0]), // expected_vtbl_contents
  &(vtt_ee71362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71362),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1105,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2362  : cc362 {
  int d;
  virtual void  foo(); // _ZN6dd23623fooEv
  ~dd2362(); // tgen
  dd2362(); // tgen
};
//SIG(-1 dd2362) C1{ BC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd2362 ::foo(){vfunc_called(this, "_ZN6dd23623fooEv");}
dd2362 ::~dd2362(){ note_dtor("dd2362", this);} // tgen
dd2362 ::dd2362(){ note_ctor("dd2362", this);} // tgen

static void Test_dd2362()
{
  extern Class_Descriptor cd_dd2362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2362, buf);
    dd2362 *dp, &lv = *(dp=new (buf) dd2362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd2362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(16,12), "dd2362");
    check_base_class_offset(lv, (cc362*), 0, "dd2362");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2362.d");
    test_class_info(&lv, &cd_dd2362);
    dp->~dd2362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2362(Test_dd2362, "dd2362", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2362C1Ev();
extern void _ZN6dd2362D1Ev();
Name_Map name_map_dd2362[] = {
  NSPAIR(_ZN6dd2362C1Ev),
  NSPAIR(_ZN6dd2362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd2362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2362[];
extern void _ZN6dd23623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd2362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd2362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd2362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd2362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd2362[] = {
  {&(_ZTV6dd2362[3]),  3,10},
  {&(_tg__ZTV5cc362__6dd2362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd2362[4]),  4,6},
  {&(_ZTV6dd2362[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static VTBL_ENTRY alt_thunk_names1106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2362 = {  "dd2362", // class name
  bases_dd2362, 3,
  &(vtc_dd2362[0]), // expected_vtbl_contents
  &(vtt_dd2362[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2362),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2362),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1106,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02362  : dd2362 {
  int e;
  ~ee02362(); // tgen
  ee02362(); // tgen
};
//SIG(1 ee02362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee02362 ::~ee02362(){ note_dtor("ee02362", this);} // tgen
ee02362 ::ee02362(){ note_ctor("ee02362", this);} // tgen

static void Test_ee02362()
{
  extern Class_Descriptor cd_ee02362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02362, buf);
    ee02362 *dp, &lv = *(dp=new (buf) ee02362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee02362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(24,16), "ee02362");
    check_base_class_offset(lv, (cc362*)(dd2362*), 0, "ee02362");
    check_base_class_offset(lv, (dd2362*), 0, "ee02362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02362.e");
    test_class_info(&lv, &cd_ee02362);
    dp->~ee02362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02362(Test_ee02362, "ee02362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02362C1Ev();
extern void _ZN7ee02362D1Ev();
Name_Map name_map_ee02362[] = {
  NSPAIR(_ZN7ee02362C1Ev),
  NSPAIR(_ZN7ee02362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee02362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02362[];
extern void _ZN6dd23623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee02362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee02362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee02362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee02362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee02362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee02362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee02362[] = {
  {&(_ZTV7ee02362[3]),  3,10},
  {&(_tg__ZTV6dd2362__7ee02362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee02362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee02362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee02362[4]),  4,6},
  {&(_ZTV7ee02362[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee02362[];
extern  VTBL_ENTRY _ZTV7ee02362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02362[];
static VTBL_ENTRY alt_thunk_names1107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02362 = {  "ee02362", // class name
  bases_ee02362, 4,
  &(vtc_ee02362[0]), // expected_vtbl_contents
  &(vtt_ee02362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02362),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1107,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12362  : virtual dd2362 {
  int e;
  ~ee12362(); // tgen
  ee12362(); // tgen
};
//SIG(1 ee12362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee12362 ::~ee12362(){ note_dtor("ee12362", this);} // tgen
ee12362 ::ee12362(){ note_ctor("ee12362", this);} // tgen

static void Test_ee12362()
{
  extern Class_Descriptor cd_ee12362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12362, buf);
    ee12362 *dp, &lv = *(dp=new (buf) ee12362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee12362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(32,20), "ee12362");
    check_base_class_offset(lv, (cc362*)(dd2362*), ABISELECT(16,8), "ee12362");
    check_base_class_offset(lv, (dd2362*), ABISELECT(16,8), "ee12362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12362.e");
    test_class_info(&lv, &cd_ee12362);
    dp->~ee12362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12362(Test_ee12362, "ee12362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12362C1Ev();
extern void _ZN7ee12362D1Ev();
Name_Map name_map_ee12362[] = {
  NSPAIR(_ZN7ee12362C1Ev),
  NSPAIR(_ZN7ee12362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee12362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12362[];
extern void _ZN6dd23623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee12362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12362[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee12362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee12362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee12362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee12362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee12362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee12362[] = {
  {&(_ZTV7ee12362[4]),  4,15},
  {&(_ZTV7ee12362[8]),  8,15},
  {&(_ZTV7ee12362[13]),  13,15},
  {&(_tg__ZTV6dd2362__7ee12362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee12362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee12362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee12362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12362[];
extern  VTBL_ENTRY _ZTV7ee12362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12362[];
static VTBL_ENTRY alt_thunk_names1108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12362 = {  "ee12362", // class name
  bases_ee12362, 4,
  &(vtc_ee12362[0]), // expected_vtbl_contents
  &(vtt_ee12362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12362),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1108,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22362  : dd2362 {
  int e;
  virtual void  foo(); // _ZN7ee223623fooEv
  ~ee22362(); // tgen
  ee22362(); // tgen
};
//SIG(1 ee22362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee22362 ::foo(){vfunc_called(this, "_ZN7ee223623fooEv");}
ee22362 ::~ee22362(){ note_dtor("ee22362", this);} // tgen
ee22362 ::ee22362(){ note_ctor("ee22362", this);} // tgen

static void Test_ee22362()
{
  extern Class_Descriptor cd_ee22362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22362, buf);
    ee22362 *dp, &lv = *(dp=new (buf) ee22362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee22362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(24,16), "ee22362");
    check_base_class_offset(lv, (cc362*)(dd2362*), 0, "ee22362");
    check_base_class_offset(lv, (dd2362*), 0, "ee22362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22362.e");
    test_class_info(&lv, &cd_ee22362);
    dp->~ee22362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22362(Test_ee22362, "ee22362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22362C1Ev();
extern void _ZN7ee22362D1Ev();
Name_Map name_map_ee22362[] = {
  NSPAIR(_ZN7ee22362C1Ev),
  NSPAIR(_ZN7ee22362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee22362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22362[];
extern void _ZN7ee223623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee223623fooEv,_ZTv0_n12_N7ee223623fooEv)();
extern void ABISELECT(_ZThn24_N7ee223623fooEv,_ZThn16_N7ee223623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee22362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22362[0]),
  (VTBL_ENTRY)&_ZN7ee223623fooEv,
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee223623fooEv,_ZTv0_n12_N7ee223623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee22362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee22362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee22362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee22362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee22362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee22362[] = {
  {&(_ZTV7ee22362[3]),  3,10},
  {&(_tg__ZTV6dd2362__7ee22362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee22362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee22362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee22362[4]),  4,6},
  {&(_ZTV7ee22362[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee22362[];
extern  VTBL_ENTRY _ZTV7ee22362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22362[];
static VTBL_ENTRY alt_thunk_names1109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee223623fooEv,_ZTv0_n12_N7ee223623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee223623fooEv,_ZThn16_N7ee223623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22362 = {  "ee22362", // class name
  bases_ee22362, 4,
  &(vtc_ee22362[0]), // expected_vtbl_contents
  &(vtt_ee22362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22362),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1109,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32362  : virtual dd2362 {
  int e;
  virtual void  foo(); // _ZN7ee323623fooEv
  ~ee32362(); // tgen
  ee32362(); // tgen
};
//SIG(1 ee32362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee32362 ::foo(){vfunc_called(this, "_ZN7ee323623fooEv");}
ee32362 ::~ee32362(){ note_dtor("ee32362", this);} // tgen
ee32362 ::ee32362(){ note_ctor("ee32362", this);} // tgen

static void Test_ee32362()
{
  extern Class_Descriptor cd_ee32362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32362, buf);
    ee32362 *dp, &lv = *(dp=new (buf) ee32362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee32362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(32,20), "ee32362");
    check_base_class_offset(lv, (cc362*)(dd2362*), ABISELECT(16,8), "ee32362");
    check_base_class_offset(lv, (dd2362*), ABISELECT(16,8), "ee32362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32362.e");
    test_class_info(&lv, &cd_ee32362);
    dp->~ee32362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32362(Test_ee32362, "ee32362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32362C1Ev();
extern void _ZN7ee32362D1Ev();
Name_Map name_map_ee32362[] = {
  NSPAIR(_ZN7ee32362C1Ev),
  NSPAIR(_ZN7ee32362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee32362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32362[];
extern void _ZN7ee323623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee323623fooEv,_ZTv0_n16_N7ee323623fooEv)();
extern void ABISELECT(_ZThn16_N7ee323623fooEv,_ZThn8_N7ee323623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee323623fooEv,_ZTv0_n12_N7ee323623fooEv)();
extern void ABISELECT(_ZThn32_N7ee323623fooEv,_ZThn20_N7ee323623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee32362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32362[0]),
  (VTBL_ENTRY)&_ZN7ee323623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee323623fooEv,_ZTv0_n16_N7ee323623fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee323623fooEv,_ZTv0_n12_N7ee323623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee32362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee32362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee32362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee32362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee32362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee32362[] = {
  {&(_ZTV7ee32362[4]),  4,16},
  {&(_ZTV7ee32362[9]),  9,16},
  {&(_ZTV7ee32362[14]),  14,16},
  {&(_tg__ZTV6dd2362__7ee32362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee32362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee32362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee32362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32362[];
extern  VTBL_ENTRY _ZTV7ee32362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32362[];
static VTBL_ENTRY alt_thunk_names1110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee323623fooEv,_ZTv0_n12_N7ee323623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee323623fooEv,_ZThn20_N7ee323623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee323623fooEv,_ZTv0_n16_N7ee323623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee323623fooEv,_ZThn8_N7ee323623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32362 = {  "ee32362", // class name
  bases_ee32362, 4,
  &(vtc_ee32362[0]), // expected_vtbl_contents
  &(vtt_ee32362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1110,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42362  : dd2362 {
  int e;
  virtual void  bar(); // _ZN7ee423623barEv
  ~ee42362(); // tgen
  ee42362(); // tgen
};
//SIG(1 ee42362) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee42362 ::bar(){vfunc_called(this, "_ZN7ee423623barEv");}
ee42362 ::~ee42362(){ note_dtor("ee42362", this);} // tgen
ee42362 ::ee42362(){ note_ctor("ee42362", this);} // tgen

static void Test_ee42362()
{
  extern Class_Descriptor cd_ee42362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42362, buf);
    ee42362 *dp, &lv = *(dp=new (buf) ee42362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee42362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(24,16), "ee42362");
    check_base_class_offset(lv, (cc362*)(dd2362*), 0, "ee42362");
    check_base_class_offset(lv, (dd2362*), 0, "ee42362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42362.e");
    test_class_info(&lv, &cd_ee42362);
    dp->~ee42362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42362(Test_ee42362, "ee42362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42362C1Ev();
extern void _ZN7ee42362D1Ev();
Name_Map name_map_ee42362[] = {
  NSPAIR(_ZN7ee42362C1Ev),
  NSPAIR(_ZN7ee42362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee42362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42362[];
extern void _ZN6dd23623fooEv();
extern void _ZN7ee423623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee423623barEv,_ZTv0_n16_N7ee423623barEv)();
extern void ABISELECT(_ZThn24_N7ee423623barEv,_ZThn16_N7ee423623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
  (VTBL_ENTRY)&_ZN7ee423623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee423623barEv,_ZTv0_n16_N7ee423623barEv),
};
extern VTBL_ENTRY _ZTV7ee42362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee42362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee42362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee42362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee42362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee42362[] = {
  {&(_ZTV7ee42362[3]),  3,11},
  {&(_tg__ZTV6dd2362__7ee42362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee42362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee42362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee42362[4]),  4,6},
  {&(_ZTV7ee42362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42362[];
extern  VTBL_ENTRY _ZTV7ee42362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42362[];
static VTBL_ENTRY alt_thunk_names1111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee423623barEv,_ZTv0_n16_N7ee423623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee423623barEv,_ZThn16_N7ee423623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42362 = {  "ee42362", // class name
  bases_ee42362, 4,
  &(vtc_ee42362[0]), // expected_vtbl_contents
  &(vtt_ee42362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1111,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52362  : virtual dd2362 {
  int e;
  virtual void  bar(); // _ZN7ee523623barEv
  ~ee52362(); // tgen
  ee52362(); // tgen
};
//SIG(1 ee52362) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee52362 ::bar(){vfunc_called(this, "_ZN7ee523623barEv");}
ee52362 ::~ee52362(){ note_dtor("ee52362", this);} // tgen
ee52362 ::ee52362(){ note_ctor("ee52362", this);} // tgen

static void Test_ee52362()
{
  extern Class_Descriptor cd_ee52362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52362, buf);
    ee52362 *dp, &lv = *(dp=new (buf) ee52362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee52362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(32,20), "ee52362");
    check_base_class_offset(lv, (cc362*)(dd2362*), ABISELECT(16,8), "ee52362");
    check_base_class_offset(lv, (dd2362*), ABISELECT(16,8), "ee52362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52362.e");
    test_class_info(&lv, &cd_ee52362);
    dp->~ee52362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52362(Test_ee52362, "ee52362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52362C1Ev();
extern void _ZN7ee52362D1Ev();
Name_Map name_map_ee52362[] = {
  NSPAIR(_ZN7ee52362C1Ev),
  NSPAIR(_ZN7ee52362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee52362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52362[];
extern void _ZN7ee523623barEv();
extern void _ZN6dd23623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee523623barEv,_ZTv0_n16_N7ee523623barEv)();
extern void ABISELECT(_ZThn32_N7ee523623barEv,_ZThn20_N7ee523623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52362[0]),
  (VTBL_ENTRY)&_ZN7ee523623barEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee523623barEv,_ZTv0_n16_N7ee523623barEv),
};
extern VTBL_ENTRY _ZTV7ee52362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee52362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee52362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee52362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee52362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee52362[] = {
  {&(_ZTV7ee52362[4]),  4,16},
  {&(_ZTV7ee52362[9]),  9,16},
  {&(_ZTV7ee52362[14]),  14,16},
  {&(_tg__ZTV6dd2362__7ee52362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee52362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee52362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee52362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52362[];
extern  VTBL_ENTRY _ZTV7ee52362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52362[];
static VTBL_ENTRY alt_thunk_names1112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee523623barEv,_ZTv0_n16_N7ee523623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee523623barEv,_ZThn20_N7ee523623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52362 = {  "ee52362", // class name
  bases_ee52362, 4,
  &(vtc_ee52362[0]), // expected_vtbl_contents
  &(vtt_ee52362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1112,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62362  : dd2362 {
  int e;
  virtual void  foo(); // _ZN7ee623623fooEv
  virtual void  bar(); // _ZN7ee623623barEv
  ~ee62362(); // tgen
  ee62362(); // tgen
};
//SIG(1 ee62362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee62362 ::foo(){vfunc_called(this, "_ZN7ee623623fooEv");}
void  ee62362 ::bar(){vfunc_called(this, "_ZN7ee623623barEv");}
ee62362 ::~ee62362(){ note_dtor("ee62362", this);} // tgen
ee62362 ::ee62362(){ note_ctor("ee62362", this);} // tgen

static void Test_ee62362()
{
  extern Class_Descriptor cd_ee62362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62362, buf);
    ee62362 *dp, &lv = *(dp=new (buf) ee62362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee62362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(24,16), "ee62362");
    check_base_class_offset(lv, (cc362*)(dd2362*), 0, "ee62362");
    check_base_class_offset(lv, (dd2362*), 0, "ee62362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62362.e");
    test_class_info(&lv, &cd_ee62362);
    dp->~ee62362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62362(Test_ee62362, "ee62362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62362C1Ev();
extern void _ZN7ee62362D1Ev();
Name_Map name_map_ee62362[] = {
  NSPAIR(_ZN7ee62362C1Ev),
  NSPAIR(_ZN7ee62362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee62362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62362[];
extern void _ZN7ee623623fooEv();
extern void _ZN7ee623623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee623623fooEv,_ZTv0_n12_N7ee623623fooEv)();
extern void ABISELECT(_ZThn24_N7ee623623fooEv,_ZThn16_N7ee623623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee623623barEv,_ZTv0_n16_N7ee623623barEv)();
extern void ABISELECT(_ZThn24_N7ee623623barEv,_ZThn16_N7ee623623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62362[0]),
  (VTBL_ENTRY)&_ZN7ee623623fooEv,
  (VTBL_ENTRY)&_ZN7ee623623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee623623fooEv,_ZTv0_n12_N7ee623623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee623623barEv,_ZTv0_n16_N7ee623623barEv),
};
extern VTBL_ENTRY _ZTV7ee62362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee62362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee62362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee62362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee62362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee62362[] = {
  {&(_ZTV7ee62362[3]),  3,11},
  {&(_tg__ZTV6dd2362__7ee62362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee62362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee62362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee62362[4]),  4,6},
  {&(_ZTV7ee62362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62362[];
extern  VTBL_ENTRY _ZTV7ee62362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62362[];
static VTBL_ENTRY alt_thunk_names1113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd23623fooEv,_ZThn16_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee623623barEv,_ZTv0_n16_N7ee623623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee623623barEv,_ZThn16_N7ee623623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee623623fooEv,_ZTv0_n12_N7ee623623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee623623fooEv,_ZThn16_N7ee623623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62362 = {  "ee62362", // class name
  bases_ee62362, 4,
  &(vtc_ee62362[0]), // expected_vtbl_contents
  &(vtt_ee62362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1113,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72362  : virtual dd2362 {
  int e;
  virtual void  foo(); // _ZN7ee723623fooEv
  virtual void  bar(); // _ZN7ee723623barEv
  ~ee72362(); // tgen
  ee72362(); // tgen
};
//SIG(1 ee72362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee72362 ::foo(){vfunc_called(this, "_ZN7ee723623fooEv");}
void  ee72362 ::bar(){vfunc_called(this, "_ZN7ee723623barEv");}
ee72362 ::~ee72362(){ note_dtor("ee72362", this);} // tgen
ee72362 ::ee72362(){ note_ctor("ee72362", this);} // tgen

static void Test_ee72362()
{
  extern Class_Descriptor cd_ee72362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72362, buf);
    ee72362 *dp, &lv = *(dp=new (buf) ee72362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee72362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd2362*), ABISELECT(32,20), "ee72362");
    check_base_class_offset(lv, (cc362*)(dd2362*), ABISELECT(16,8), "ee72362");
    check_base_class_offset(lv, (dd2362*), ABISELECT(16,8), "ee72362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72362.e");
    test_class_info(&lv, &cd_ee72362);
    dp->~ee72362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72362(Test_ee72362, "ee72362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72362C1Ev();
extern void _ZN7ee72362D1Ev();
Name_Map name_map_ee72362[] = {
  NSPAIR(_ZN7ee72362C1Ev),
  NSPAIR(_ZN7ee72362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd2362;
extern VTBL_ENTRY _ZTI6dd2362[];
extern  VTBL_ENTRY _ZTV6dd2362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2362[];
static Base_Class bases_ee72362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2362,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72362[];
extern void _ZN7ee723623fooEv();
extern void _ZN7ee723623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee723623fooEv,_ZTv0_n16_N7ee723623fooEv)();
extern void ABISELECT(_ZThn16_N7ee723623fooEv,_ZThn8_N7ee723623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee723623fooEv,_ZTv0_n12_N7ee723623fooEv)();
extern void ABISELECT(_ZThn32_N7ee723623fooEv,_ZThn20_N7ee723623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee723623barEv,_ZTv0_n16_N7ee723623barEv)();
extern void ABISELECT(_ZThn32_N7ee723623barEv,_ZThn20_N7ee723623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72362[0]),
  (VTBL_ENTRY)&_ZN7ee723623fooEv,
  (VTBL_ENTRY)&_ZN7ee723623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee723623fooEv,_ZTv0_n16_N7ee723623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee723623fooEv,_ZTv0_n12_N7ee723623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee723623barEv,_ZTv0_n16_N7ee723623barEv),
};
extern VTBL_ENTRY _ZTV7ee72362[];
extern void _ZN6dd23623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2362__7ee72362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&_ZN6dd23623fooEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd2362__7ee72362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd2362__7ee72362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv)();
extern void ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2362__7ee72362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee72362[] = {
  {&(_ZTV7ee72362[4]),  4,17},
  {&(_ZTV7ee72362[10]),  10,17},
  {&(_ZTV7ee72362[15]),  15,17},
  {&(_tg__ZTV6dd2362__7ee72362[3]),  3,4},
  {&(_tg__ZTV5cc3626dd2362__7ee72362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd2362__7ee72362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2362__7ee72362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72362[];
extern  VTBL_ENTRY _ZTV7ee72362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72362[];
static VTBL_ENTRY alt_thunk_names1114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd23623fooEv,_ZTv0_n12_N6dd23623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd23623fooEv,_ZThn12_N6dd23623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee723623barEv,_ZTv0_n16_N7ee723623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee723623barEv,_ZThn20_N7ee723623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee723623fooEv,_ZTv0_n12_N7ee723623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee723623fooEv,_ZThn20_N7ee723623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee723623fooEv,_ZTv0_n16_N7ee723623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee723623fooEv,_ZThn8_N7ee723623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72362 = {  "ee72362", // class name
  bases_ee72362, 4,
  &(vtc_ee72362[0]), // expected_vtbl_contents
  &(vtt_ee72362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1114,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3362  : virtual cc362 {
  int d;
  virtual void  foo(); // _ZN6dd33623fooEv
  ~dd3362(); // tgen
  dd3362(); // tgen
};
//SIG(-1 dd3362) C1{ VBC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  dd3362 ::foo(){vfunc_called(this, "_ZN6dd33623fooEv");}
dd3362 ::~dd3362(){ note_dtor("dd3362", this);} // tgen
dd3362 ::dd3362(){ note_ctor("dd3362", this);} // tgen

static void Test_dd3362()
{
  extern Class_Descriptor cd_dd3362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3362, buf);
    dd3362 *dp, &lv = *(dp=new (buf) dd3362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd3362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,16), "dd3362");
    check_base_class_offset(lv, (cc362*), ABISELECT(16,8), "dd3362");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3362.d");
    test_class_info(&lv, &cd_dd3362);
    dp->~dd3362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3362(Test_dd3362, "dd3362", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3362C1Ev();
extern void _ZN6dd3362D1Ev();
Name_Map name_map_dd3362[] = {
  NSPAIR(_ZN6dd3362C1Ev),
  NSPAIR(_ZN6dd3362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd3362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc362,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3362[];
extern void _ZN6dd33623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_dd3362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV6dd3362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd3362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd3362[] = {
  {&(_ZTV6dd3362[4]),  4,16},
  {&(_ZTV6dd3362[9]),  9,16},
  {&(_ZTV6dd3362[14]),  14,16},
  {&(_tg__ZTV5cc362__6dd3362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd3362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static VTBL_ENTRY alt_thunk_names1115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3362 = {  "dd3362", // class name
  bases_dd3362, 3,
  &(vtc_dd3362[0]), // expected_vtbl_contents
  &(vtt_dd3362[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3362),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1115,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03362  : dd3362 {
  int e;
  ~ee03362(); // tgen
  ee03362(); // tgen
};
//SIG(1 ee03362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee03362 ::~ee03362(){ note_dtor("ee03362", this);} // tgen
ee03362 ::ee03362(){ note_ctor("ee03362", this);} // tgen

static void Test_ee03362()
{
  extern Class_Descriptor cd_ee03362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03362, buf);
    ee03362 *dp, &lv = *(dp=new (buf) ee03362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee03362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee03362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(16,12), "ee03362");
    check_base_class_offset(lv, (dd3362*), 0, "ee03362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03362.e");
    test_class_info(&lv, &cd_ee03362);
    dp->~ee03362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03362(Test_ee03362, "ee03362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03362C1Ev();
extern void _ZN7ee03362D1Ev();
Name_Map name_map_ee03362[] = {
  NSPAIR(_ZN7ee03362C1Ev),
  NSPAIR(_ZN7ee03362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee03362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03362[];
extern void _ZN6dd33623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee03362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee03362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee03362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee03362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee03362[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee03362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee03362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee03362[] = {
  {&(_ZTV7ee03362[4]),  4,16},
  {&(_tg__ZTV6dd3362__7ee03362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee03362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee03362[4]),  4,6},
  {&(_ZTV7ee03362[9]),  9,16},
  {&(_ZTV7ee03362[14]),  14,16},
  {&(_tg__ZTV5cc362__7ee03362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee03362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03362[];
extern  VTBL_ENTRY _ZTV7ee03362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03362[];
static VTBL_ENTRY alt_thunk_names1116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03362 = {  "ee03362", // class name
  bases_ee03362, 4,
  &(vtc_ee03362[0]), // expected_vtbl_contents
  &(vtt_ee03362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1116,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13362  : virtual dd3362 {
  int e;
  ~ee13362(); // tgen
  ee13362(); // tgen
};
//SIG(1 ee13362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} Fi}


ee13362 ::~ee13362(){ note_dtor("ee13362", this);} // tgen
ee13362 ::ee13362(){ note_ctor("ee13362", this);} // tgen

static void Test_ee13362()
{
  extern Class_Descriptor cd_ee13362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13362, buf);
    ee13362 *dp, &lv = *(dp=new (buf) ee13362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee13362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee13362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(32,16), "ee13362");
    check_base_class_offset(lv, (dd3362*), ABISELECT(16,8), "ee13362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13362.e");
    test_class_info(&lv, &cd_ee13362);
    dp->~ee13362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13362(Test_ee13362, "ee13362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13362C1Ev();
extern void _ZN7ee13362D1Ev();
Name_Map name_map_ee13362[] = {
  NSPAIR(_ZN7ee13362C1Ev),
  NSPAIR(_ZN7ee13362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee13362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13362[];
extern void _ZN6dd33623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee13362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13362[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee13362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee13362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee13362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee13362[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee13362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee13362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee13362[] = {
  {&(_ZTV7ee13362[5]),  5,22},
  {&(_ZTV7ee13362[10]),  10,22},
  {&(_ZTV7ee13362[15]),  15,22},
  {&(_ZTV7ee13362[20]),  20,22},
  {&(_tg__ZTV6dd3362__7ee13362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee13362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee13362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee13362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee13362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13362[];
extern  VTBL_ENTRY _ZTV7ee13362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13362[];
static VTBL_ENTRY alt_thunk_names1117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13362 = {  "ee13362", // class name
  bases_ee13362, 4,
  &(vtc_ee13362[0]), // expected_vtbl_contents
  &(vtt_ee13362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13362),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1117,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23362  : dd3362 {
  int e;
  virtual void  foo(); // _ZN7ee233623fooEv
  ~ee23362(); // tgen
  ee23362(); // tgen
};
//SIG(1 ee23362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee23362 ::foo(){vfunc_called(this, "_ZN7ee233623fooEv");}
ee23362 ::~ee23362(){ note_dtor("ee23362", this);} // tgen
ee23362 ::ee23362(){ note_ctor("ee23362", this);} // tgen

static void Test_ee23362()
{
  extern Class_Descriptor cd_ee23362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23362, buf);
    ee23362 *dp, &lv = *(dp=new (buf) ee23362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee23362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee23362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(16,12), "ee23362");
    check_base_class_offset(lv, (dd3362*), 0, "ee23362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23362.e");
    test_class_info(&lv, &cd_ee23362);
    dp->~ee23362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23362(Test_ee23362, "ee23362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23362C1Ev();
extern void _ZN7ee23362D1Ev();
Name_Map name_map_ee23362[] = {
  NSPAIR(_ZN7ee23362C1Ev),
  NSPAIR(_ZN7ee23362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee23362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23362[];
extern void _ZN7ee233623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee233623fooEv,_ZTv0_n16_N7ee233623fooEv)();
extern void ABISELECT(_ZThn16_N7ee233623fooEv,_ZThn12_N7ee233623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee233623fooEv,_ZTv0_n12_N7ee233623fooEv)();
extern void ABISELECT(_ZThn32_N7ee233623fooEv,_ZThn20_N7ee233623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee23362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23362[0]),
  (VTBL_ENTRY)&_ZN7ee233623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee233623fooEv,_ZTv0_n16_N7ee233623fooEv),
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee233623fooEv,_ZTv0_n12_N7ee233623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee23362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee23362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee23362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee23362[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee23362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee23362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee23362[] = {
  {&(_ZTV7ee23362[4]),  4,16},
  {&(_tg__ZTV6dd3362__7ee23362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee23362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee23362[4]),  4,6},
  {&(_ZTV7ee23362[9]),  9,16},
  {&(_ZTV7ee23362[14]),  14,16},
  {&(_tg__ZTV5cc362__7ee23362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee23362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23362[];
extern  VTBL_ENTRY _ZTV7ee23362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23362[];
static VTBL_ENTRY alt_thunk_names1118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee233623fooEv,_ZTv0_n12_N7ee233623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee233623fooEv,_ZThn20_N7ee233623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee233623fooEv,_ZTv0_n16_N7ee233623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee233623fooEv,_ZThn12_N7ee233623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23362 = {  "ee23362", // class name
  bases_ee23362, 4,
  &(vtc_ee23362[0]), // expected_vtbl_contents
  &(vtt_ee23362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1118,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33362  : virtual dd3362 {
  int e;
  virtual void  foo(); // _ZN7ee333623fooEv
  ~ee33362(); // tgen
  ee33362(); // tgen
};
//SIG(1 ee33362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee33362 ::foo(){vfunc_called(this, "_ZN7ee333623fooEv");}
ee33362 ::~ee33362(){ note_dtor("ee33362", this);} // tgen
ee33362 ::ee33362(){ note_ctor("ee33362", this);} // tgen

static void Test_ee33362()
{
  extern Class_Descriptor cd_ee33362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33362, buf);
    ee33362 *dp, &lv = *(dp=new (buf) ee33362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee33362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee33362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(32,16), "ee33362");
    check_base_class_offset(lv, (dd3362*), ABISELECT(16,8), "ee33362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33362.e");
    test_class_info(&lv, &cd_ee33362);
    dp->~ee33362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33362(Test_ee33362, "ee33362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33362C1Ev();
extern void _ZN7ee33362D1Ev();
Name_Map name_map_ee33362[] = {
  NSPAIR(_ZN7ee33362C1Ev),
  NSPAIR(_ZN7ee33362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee33362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33362[];
extern void _ZN7ee333623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee333623fooEv,_ZTv0_n20_N7ee333623fooEv)();
extern void ABISELECT(_ZThn16_N7ee333623fooEv,_ZThn8_N7ee333623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee333623fooEv,_ZTv0_n16_N7ee333623fooEv)();
extern void ABISELECT(_ZThn32_N7ee333623fooEv,_ZThn16_N7ee333623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee333623fooEv,_ZTv0_n12_N7ee333623fooEv)();
extern void ABISELECT(_ZThn48_N7ee333623fooEv,_ZThn24_N7ee333623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY vtc_ee33362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33362[0]),
  (VTBL_ENTRY)&_ZN7ee333623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee333623fooEv,_ZTv0_n20_N7ee333623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee333623fooEv,_ZTv0_n16_N7ee333623fooEv),
  0,
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee333623fooEv,_ZTv0_n12_N7ee333623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern VTBL_ENTRY _ZTV7ee33362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee33362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee33362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee33362[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee33362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee33362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee33362[] = {
  {&(_ZTV7ee33362[5]),  5,23},
  {&(_ZTV7ee33362[11]),  11,23},
  {&(_ZTV7ee33362[16]),  16,23},
  {&(_ZTV7ee33362[21]),  21,23},
  {&(_tg__ZTV6dd3362__7ee33362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee33362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee33362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee33362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee33362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33362[];
extern  VTBL_ENTRY _ZTV7ee33362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33362[];
static VTBL_ENTRY alt_thunk_names1119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee333623fooEv,_ZTv0_n12_N7ee333623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee333623fooEv,_ZThn24_N7ee333623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee333623fooEv,_ZTv0_n16_N7ee333623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee333623fooEv,_ZThn16_N7ee333623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee333623fooEv,_ZTv0_n20_N7ee333623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee333623fooEv,_ZThn8_N7ee333623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33362 = {  "ee33362", // class name
  bases_ee33362, 4,
  &(vtc_ee33362[0]), // expected_vtbl_contents
  &(vtt_ee33362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33362),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1119,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43362  : dd3362 {
  int e;
  virtual void  bar(); // _ZN7ee433623barEv
  ~ee43362(); // tgen
  ee43362(); // tgen
};
//SIG(1 ee43362) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee43362 ::bar(){vfunc_called(this, "_ZN7ee433623barEv");}
ee43362 ::~ee43362(){ note_dtor("ee43362", this);} // tgen
ee43362 ::ee43362(){ note_ctor("ee43362", this);} // tgen

static void Test_ee43362()
{
  extern Class_Descriptor cd_ee43362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43362, buf);
    ee43362 *dp, &lv = *(dp=new (buf) ee43362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee43362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee43362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(16,12), "ee43362");
    check_base_class_offset(lv, (dd3362*), 0, "ee43362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43362.e");
    test_class_info(&lv, &cd_ee43362);
    dp->~ee43362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43362(Test_ee43362, "ee43362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43362C1Ev();
extern void _ZN7ee43362D1Ev();
Name_Map name_map_ee43362[] = {
  NSPAIR(_ZN7ee43362C1Ev),
  NSPAIR(_ZN7ee43362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee43362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43362[];
extern void _ZN6dd33623fooEv();
extern void _ZN7ee433623barEv();
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee433623barEv,_ZTv0_n16_N7ee433623barEv)();
extern void ABISELECT(_ZThn32_N7ee433623barEv,_ZThn20_N7ee433623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
  (VTBL_ENTRY)&_ZN7ee433623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee433623barEv,_ZTv0_n16_N7ee433623barEv),
};
extern VTBL_ENTRY _ZTV7ee43362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee43362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee43362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee43362[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee43362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee43362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee43362[] = {
  {&(_ZTV7ee43362[4]),  4,17},
  {&(_tg__ZTV6dd3362__7ee43362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee43362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee43362[4]),  4,6},
  {&(_ZTV7ee43362[10]),  10,17},
  {&(_ZTV7ee43362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee43362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee43362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43362[];
extern  VTBL_ENTRY _ZTV7ee43362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43362[];
static VTBL_ENTRY alt_thunk_names1120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee433623barEv,_ZTv0_n16_N7ee433623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee433623barEv,_ZThn20_N7ee433623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43362 = {  "ee43362", // class name
  bases_ee43362, 4,
  &(vtc_ee43362[0]), // expected_vtbl_contents
  &(vtt_ee43362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1120,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53362  : virtual dd3362 {
  int e;
  virtual void  bar(); // _ZN7ee533623barEv
  ~ee53362(); // tgen
  ee53362(); // tgen
};
//SIG(1 ee53362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee53362 ::bar(){vfunc_called(this, "_ZN7ee533623barEv");}
ee53362 ::~ee53362(){ note_dtor("ee53362", this);} // tgen
ee53362 ::ee53362(){ note_ctor("ee53362", this);} // tgen

static void Test_ee53362()
{
  extern Class_Descriptor cd_ee53362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53362, buf);
    ee53362 *dp, &lv = *(dp=new (buf) ee53362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee53362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee53362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(32,16), "ee53362");
    check_base_class_offset(lv, (dd3362*), ABISELECT(16,8), "ee53362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53362.e");
    test_class_info(&lv, &cd_ee53362);
    dp->~ee53362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53362(Test_ee53362, "ee53362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53362C1Ev();
extern void _ZN7ee53362D1Ev();
Name_Map name_map_ee53362[] = {
  NSPAIR(_ZN7ee53362C1Ev),
  NSPAIR(_ZN7ee53362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee53362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53362[];
extern void _ZN7ee533623barEv();
extern void _ZN6dd33623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee533623barEv,_ZTv0_n16_N7ee533623barEv)();
extern void ABISELECT(_ZThn48_N7ee533623barEv,_ZThn24_N7ee533623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53362[0]),
  (VTBL_ENTRY)&_ZN7ee533623barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee533623barEv,_ZTv0_n16_N7ee533623barEv),
};
extern VTBL_ENTRY _ZTV7ee53362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee53362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee53362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee53362[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee53362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee53362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee53362[] = {
  {&(_ZTV7ee53362[5]),  5,23},
  {&(_ZTV7ee53362[11]),  11,23},
  {&(_ZTV7ee53362[16]),  16,23},
  {&(_ZTV7ee53362[21]),  21,23},
  {&(_tg__ZTV6dd3362__7ee53362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee53362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee53362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee53362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee53362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53362[];
extern  VTBL_ENTRY _ZTV7ee53362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53362[];
static VTBL_ENTRY alt_thunk_names1121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee533623barEv,_ZTv0_n16_N7ee533623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee533623barEv,_ZThn24_N7ee533623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53362 = {  "ee53362", // class name
  bases_ee53362, 4,
  &(vtc_ee53362[0]), // expected_vtbl_contents
  &(vtt_ee53362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53362),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1121,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63362  : dd3362 {
  int e;
  virtual void  foo(); // _ZN7ee633623fooEv
  virtual void  bar(); // _ZN7ee633623barEv
  ~ee63362(); // tgen
  ee63362(); // tgen
};
//SIG(1 ee63362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee63362 ::foo(){vfunc_called(this, "_ZN7ee633623fooEv");}
void  ee63362 ::bar(){vfunc_called(this, "_ZN7ee633623barEv");}
ee63362 ::~ee63362(){ note_dtor("ee63362", this);} // tgen
ee63362 ::ee63362(){ note_ctor("ee63362", this);} // tgen

static void Test_ee63362()
{
  extern Class_Descriptor cd_ee63362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63362, buf);
    ee63362 *dp, &lv = *(dp=new (buf) ee63362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee63362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee63362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(16,12), "ee63362");
    check_base_class_offset(lv, (dd3362*), 0, "ee63362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63362.e");
    test_class_info(&lv, &cd_ee63362);
    dp->~ee63362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63362(Test_ee63362, "ee63362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63362C1Ev();
extern void _ZN7ee63362D1Ev();
Name_Map name_map_ee63362[] = {
  NSPAIR(_ZN7ee63362C1Ev),
  NSPAIR(_ZN7ee63362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee63362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63362[];
extern void _ZN7ee633623fooEv();
extern void _ZN7ee633623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee633623fooEv,_ZTv0_n16_N7ee633623fooEv)();
extern void ABISELECT(_ZThn16_N7ee633623fooEv,_ZThn12_N7ee633623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee633623fooEv,_ZTv0_n12_N7ee633623fooEv)();
extern void ABISELECT(_ZThn32_N7ee633623fooEv,_ZThn20_N7ee633623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee633623barEv,_ZTv0_n16_N7ee633623barEv)();
extern void ABISELECT(_ZThn32_N7ee633623barEv,_ZThn20_N7ee633623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63362[0]),
  (VTBL_ENTRY)&_ZN7ee633623fooEv,
  (VTBL_ENTRY)&_ZN7ee633623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee633623fooEv,_ZTv0_n16_N7ee633623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee633623fooEv,_ZTv0_n12_N7ee633623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee633623barEv,_ZTv0_n16_N7ee633623barEv),
};
extern VTBL_ENTRY _ZTV7ee63362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee63362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee63362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee63362[] = {
  0,
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee63362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee63362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee63362[] = {
  {&(_ZTV7ee63362[4]),  4,17},
  {&(_tg__ZTV6dd3362__7ee63362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee63362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee63362[4]),  4,6},
  {&(_ZTV7ee63362[10]),  10,17},
  {&(_ZTV7ee63362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee63362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee63362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63362[];
extern  VTBL_ENTRY _ZTV7ee63362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63362[];
static VTBL_ENTRY alt_thunk_names1122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn20_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn12_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee633623barEv,_ZTv0_n16_N7ee633623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee633623barEv,_ZThn20_N7ee633623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee633623fooEv,_ZTv0_n12_N7ee633623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee633623fooEv,_ZThn20_N7ee633623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee633623fooEv,_ZTv0_n16_N7ee633623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee633623fooEv,_ZThn12_N7ee633623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63362 = {  "ee63362", // class name
  bases_ee63362, 4,
  &(vtc_ee63362[0]), // expected_vtbl_contents
  &(vtt_ee63362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1122,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73362  : virtual dd3362 {
  int e;
  virtual void  foo(); // _ZN7ee733623fooEv
  virtual void  bar(); // _ZN7ee733623barEv
  ~ee73362(); // tgen
  ee73362(); // tgen
};
//SIG(1 ee73362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi} v1 v2 Fi}


void  ee73362 ::foo(){vfunc_called(this, "_ZN7ee733623fooEv");}
void  ee73362 ::bar(){vfunc_called(this, "_ZN7ee733623barEv");}
ee73362 ::~ee73362(){ note_dtor("ee73362", this);} // tgen
ee73362 ::ee73362(){ note_ctor("ee73362", this);} // tgen

static void Test_ee73362()
{
  extern Class_Descriptor cd_ee73362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73362, buf);
    ee73362 *dp, &lv = *(dp=new (buf) ee73362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee73362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee73362");
    check_base_class_offset(lv, (cc362*)(dd3362*), ABISELECT(32,16), "ee73362");
    check_base_class_offset(lv, (dd3362*), ABISELECT(16,8), "ee73362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73362.e");
    test_class_info(&lv, &cd_ee73362);
    dp->~ee73362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73362(Test_ee73362, "ee73362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73362C1Ev();
extern void _ZN7ee73362D1Ev();
Name_Map name_map_ee73362[] = {
  NSPAIR(_ZN7ee73362C1Ev),
  NSPAIR(_ZN7ee73362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd3362;
extern VTBL_ENTRY _ZTI6dd3362[];
extern  VTBL_ENTRY _ZTV6dd3362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3362[];
static Base_Class bases_ee73362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3362,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73362[];
extern void _ZN7ee733623fooEv();
extern void _ZN7ee733623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee733623fooEv,_ZTv0_n20_N7ee733623fooEv)();
extern void ABISELECT(_ZThn16_N7ee733623fooEv,_ZThn8_N7ee733623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee733623fooEv,_ZTv0_n16_N7ee733623fooEv)();
extern void ABISELECT(_ZThn32_N7ee733623fooEv,_ZThn16_N7ee733623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee733623fooEv,_ZTv0_n12_N7ee733623fooEv)();
extern void ABISELECT(_ZThn48_N7ee733623fooEv,_ZThn24_N7ee733623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee733623barEv,_ZTv0_n16_N7ee733623barEv)();
extern void ABISELECT(_ZThn48_N7ee733623barEv,_ZThn24_N7ee733623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73362[0]),
  (VTBL_ENTRY)&_ZN7ee733623fooEv,
  (VTBL_ENTRY)&_ZN7ee733623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee733623fooEv,_ZTv0_n20_N7ee733623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee733623fooEv,_ZTv0_n16_N7ee733623fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee733623fooEv,_ZTv0_n12_N7ee733623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee733623barEv,_ZTv0_n16_N7ee733623barEv),
};
extern VTBL_ENTRY _ZTV7ee73362[];
extern void _ZN6dd33623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3362__7ee73362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&_ZN6dd33623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv)();
extern void ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd3362__7ee73362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv)();
extern void ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3362__7ee73362[] = {
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee73362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee73362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee73362[] = {
  {&(_ZTV7ee73362[5]),  5,24},
  {&(_ZTV7ee73362[12]),  12,24},
  {&(_ZTV7ee73362[17]),  17,24},
  {&(_ZTV7ee73362[22]),  22,24},
  {&(_tg__ZTV6dd3362__7ee73362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd3362__7ee73362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3362__7ee73362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee73362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee73362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73362[];
extern  VTBL_ENTRY _ZTV7ee73362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73362[];
static VTBL_ENTRY alt_thunk_names1123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd33623fooEv,_ZTv0_n12_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd33623fooEv,_ZThn16_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd33623fooEv,_ZTv0_n16_N6dd33623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd33623fooEv,_ZThn8_N6dd33623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee733623barEv,_ZTv0_n16_N7ee733623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee733623barEv,_ZThn24_N7ee733623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee733623fooEv,_ZTv0_n12_N7ee733623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee733623fooEv,_ZThn24_N7ee733623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee733623fooEv,_ZTv0_n16_N7ee733623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee733623fooEv,_ZThn16_N7ee733623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee733623fooEv,_ZTv0_n20_N7ee733623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee733623fooEv,_ZThn8_N7ee733623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73362 = {  "ee73362", // class name
  bases_ee73362, 4,
  &(vtc_ee73362[0]), // expected_vtbl_contents
  &(vtt_ee73362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73362),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1123,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4362  : cc362 {
  int d;
  virtual void  bar(); // _ZN6dd43623barEv
  ~dd4362(); // tgen
  dd4362(); // tgen
};
//SIG(-1 dd4362) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd4362 ::bar(){vfunc_called(this, "_ZN6dd43623barEv");}
dd4362 ::~dd4362(){ note_dtor("dd4362", this);} // tgen
dd4362 ::dd4362(){ note_ctor("dd4362", this);} // tgen

static void Test_dd4362()
{
  extern Class_Descriptor cd_dd4362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4362, buf);
    dd4362 *dp, &lv = *(dp=new (buf) dd4362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd4362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(16,12), "dd4362");
    check_base_class_offset(lv, (cc362*), 0, "dd4362");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4362.d");
    test_class_info(&lv, &cd_dd4362);
    dp->~dd4362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4362(Test_dd4362, "dd4362", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4362C1Ev();
extern void _ZN6dd4362D1Ev();
Name_Map name_map_dd4362[] = {
  NSPAIR(_ZN6dd4362C1Ev),
  NSPAIR(_ZN6dd4362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd4362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
extern VTBL_ENTRY _ZTV6dd4362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd4362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd4362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd4362[] = {
  {&(_ZTV6dd4362[3]),  3,11},
  {&(_tg__ZTV5cc362__6dd4362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd4362[4]),  4,6},
  {&(_ZTV6dd4362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static VTBL_ENTRY alt_thunk_names1124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4362 = {  "dd4362", // class name
  bases_dd4362, 3,
  &(vtc_dd4362[0]), // expected_vtbl_contents
  &(vtt_dd4362[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4362),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1124,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04362  : dd4362 {
  int e;
  ~ee04362(); // tgen
  ee04362(); // tgen
};
//SIG(1 ee04362) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee04362 ::~ee04362(){ note_dtor("ee04362", this);} // tgen
ee04362 ::ee04362(){ note_ctor("ee04362", this);} // tgen

static void Test_ee04362()
{
  extern Class_Descriptor cd_ee04362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04362, buf);
    ee04362 *dp, &lv = *(dp=new (buf) ee04362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee04362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(24,16), "ee04362");
    check_base_class_offset(lv, (cc362*)(dd4362*), 0, "ee04362");
    check_base_class_offset(lv, (dd4362*), 0, "ee04362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04362.e");
    test_class_info(&lv, &cd_ee04362);
    dp->~ee04362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04362(Test_ee04362, "ee04362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04362C1Ev();
extern void _ZN7ee04362D1Ev();
Name_Map name_map_ee04362[] = {
  NSPAIR(_ZN7ee04362C1Ev),
  NSPAIR(_ZN7ee04362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee04362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
extern VTBL_ENTRY _ZTV7ee04362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee04362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee04362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee04362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee04362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee04362[] = {
  {&(_ZTV7ee04362[3]),  3,11},
  {&(_tg__ZTV6dd4362__7ee04362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee04362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee04362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee04362[4]),  4,6},
  {&(_ZTV7ee04362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee04362[];
extern  VTBL_ENTRY _ZTV7ee04362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04362[];
static VTBL_ENTRY alt_thunk_names1125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04362 = {  "ee04362", // class name
  bases_ee04362, 4,
  &(vtc_ee04362[0]), // expected_vtbl_contents
  &(vtt_ee04362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1125,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14362  : virtual dd4362 {
  int e;
  ~ee14362(); // tgen
  ee14362(); // tgen
};
//SIG(1 ee14362) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee14362 ::~ee14362(){ note_dtor("ee14362", this);} // tgen
ee14362 ::ee14362(){ note_ctor("ee14362", this);} // tgen

static void Test_ee14362()
{
  extern Class_Descriptor cd_ee14362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14362, buf);
    ee14362 *dp, &lv = *(dp=new (buf) ee14362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee14362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(32,20), "ee14362");
    check_base_class_offset(lv, (cc362*)(dd4362*), ABISELECT(16,8), "ee14362");
    check_base_class_offset(lv, (dd4362*), ABISELECT(16,8), "ee14362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14362.e");
    test_class_info(&lv, &cd_ee14362);
    dp->~ee14362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14362(Test_ee14362, "ee14362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14362C1Ev();
extern void _ZN7ee14362D1Ev();
Name_Map name_map_ee14362[] = {
  NSPAIR(_ZN7ee14362C1Ev),
  NSPAIR(_ZN7ee14362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee14362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14362[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
extern VTBL_ENTRY _ZTV7ee14362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee14362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee14362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee14362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee14362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee14362[] = {
  {&(_ZTV7ee14362[4]),  4,17},
  {&(_ZTV7ee14362[9]),  9,17},
  {&(_ZTV7ee14362[15]),  15,17},
  {&(_tg__ZTV6dd4362__7ee14362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee14362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee14362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee14362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14362[];
extern  VTBL_ENTRY _ZTV7ee14362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14362[];
static VTBL_ENTRY alt_thunk_names1126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14362 = {  "ee14362", // class name
  bases_ee14362, 4,
  &(vtc_ee14362[0]), // expected_vtbl_contents
  &(vtt_ee14362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1126,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24362  : dd4362 {
  int e;
  virtual void  foo(); // _ZN7ee243623fooEv
  ~ee24362(); // tgen
  ee24362(); // tgen
};
//SIG(1 ee24362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee24362 ::foo(){vfunc_called(this, "_ZN7ee243623fooEv");}
ee24362 ::~ee24362(){ note_dtor("ee24362", this);} // tgen
ee24362 ::ee24362(){ note_ctor("ee24362", this);} // tgen

static void Test_ee24362()
{
  extern Class_Descriptor cd_ee24362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24362, buf);
    ee24362 *dp, &lv = *(dp=new (buf) ee24362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee24362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(24,16), "ee24362");
    check_base_class_offset(lv, (cc362*)(dd4362*), 0, "ee24362");
    check_base_class_offset(lv, (dd4362*), 0, "ee24362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24362.e");
    test_class_info(&lv, &cd_ee24362);
    dp->~ee24362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24362(Test_ee24362, "ee24362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24362C1Ev();
extern void _ZN7ee24362D1Ev();
Name_Map name_map_ee24362[] = {
  NSPAIR(_ZN7ee24362C1Ev),
  NSPAIR(_ZN7ee24362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee24362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24362[];
extern void _ZN7ee243623fooEv();
extern void _ZN6dd43623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee243623fooEv,_ZTv0_n12_N7ee243623fooEv)();
extern void ABISELECT(_ZThn24_N7ee243623fooEv,_ZThn16_N7ee243623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24362[0]),
  (VTBL_ENTRY)&_ZN7ee243623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee243623fooEv,_ZTv0_n12_N7ee243623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
extern VTBL_ENTRY _ZTV7ee24362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee24362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee24362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee24362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee24362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee24362[] = {
  {&(_ZTV7ee24362[3]),  3,11},
  {&(_tg__ZTV6dd4362__7ee24362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee24362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee24362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee24362[4]),  4,6},
  {&(_ZTV7ee24362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24362[];
extern  VTBL_ENTRY _ZTV7ee24362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24362[];
static VTBL_ENTRY alt_thunk_names1127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee243623fooEv,_ZTv0_n12_N7ee243623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee243623fooEv,_ZThn16_N7ee243623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24362 = {  "ee24362", // class name
  bases_ee24362, 4,
  &(vtc_ee24362[0]), // expected_vtbl_contents
  &(vtt_ee24362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1127,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34362  : virtual dd4362 {
  int e;
  virtual void  foo(); // _ZN7ee343623fooEv
  ~ee34362(); // tgen
  ee34362(); // tgen
};
//SIG(1 ee34362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee34362 ::foo(){vfunc_called(this, "_ZN7ee343623fooEv");}
ee34362 ::~ee34362(){ note_dtor("ee34362", this);} // tgen
ee34362 ::ee34362(){ note_ctor("ee34362", this);} // tgen

static void Test_ee34362()
{
  extern Class_Descriptor cd_ee34362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34362, buf);
    ee34362 *dp, &lv = *(dp=new (buf) ee34362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee34362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(32,20), "ee34362");
    check_base_class_offset(lv, (cc362*)(dd4362*), ABISELECT(16,8), "ee34362");
    check_base_class_offset(lv, (dd4362*), ABISELECT(16,8), "ee34362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34362.e");
    test_class_info(&lv, &cd_ee34362);
    dp->~ee34362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34362(Test_ee34362, "ee34362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34362C1Ev();
extern void _ZN7ee34362D1Ev();
Name_Map name_map_ee34362[] = {
  NSPAIR(_ZN7ee34362C1Ev),
  NSPAIR(_ZN7ee34362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee34362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34362[];
extern void _ZN7ee343623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee343623fooEv,_ZTv0_n16_N7ee343623fooEv)();
extern void ABISELECT(_ZThn16_N7ee343623fooEv,_ZThn8_N7ee343623fooEv)() __attribute__((weak));
extern void _ZN6dd43623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee343623fooEv,_ZTv0_n12_N7ee343623fooEv)();
extern void ABISELECT(_ZThn32_N7ee343623fooEv,_ZThn20_N7ee343623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34362[0]),
  (VTBL_ENTRY)&_ZN7ee343623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee343623fooEv,_ZTv0_n16_N7ee343623fooEv),
  (VTBL_ENTRY)&_ZN6dd43623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee343623fooEv,_ZTv0_n12_N7ee343623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
extern VTBL_ENTRY _ZTV7ee34362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee34362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee34362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee34362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee34362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee34362[] = {
  {&(_ZTV7ee34362[4]),  4,18},
  {&(_ZTV7ee34362[10]),  10,18},
  {&(_ZTV7ee34362[16]),  16,18},
  {&(_tg__ZTV6dd4362__7ee34362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee34362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee34362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee34362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34362[];
extern  VTBL_ENTRY _ZTV7ee34362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34362[];
static VTBL_ENTRY alt_thunk_names1128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee343623fooEv,_ZTv0_n12_N7ee343623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee343623fooEv,_ZThn20_N7ee343623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee343623fooEv,_ZTv0_n16_N7ee343623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee343623fooEv,_ZThn8_N7ee343623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34362 = {  "ee34362", // class name
  bases_ee34362, 4,
  &(vtc_ee34362[0]), // expected_vtbl_contents
  &(vtt_ee34362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34362),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1128,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44362  : dd4362 {
  int e;
  virtual void  bar(); // _ZN7ee443623barEv
  ~ee44362(); // tgen
  ee44362(); // tgen
};
//SIG(1 ee44362) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee44362 ::bar(){vfunc_called(this, "_ZN7ee443623barEv");}
ee44362 ::~ee44362(){ note_dtor("ee44362", this);} // tgen
ee44362 ::ee44362(){ note_ctor("ee44362", this);} // tgen

static void Test_ee44362()
{
  extern Class_Descriptor cd_ee44362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44362, buf);
    ee44362 *dp, &lv = *(dp=new (buf) ee44362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee44362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(24,16), "ee44362");
    check_base_class_offset(lv, (cc362*)(dd4362*), 0, "ee44362");
    check_base_class_offset(lv, (dd4362*), 0, "ee44362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44362.e");
    test_class_info(&lv, &cd_ee44362);
    dp->~ee44362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44362(Test_ee44362, "ee44362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44362C1Ev();
extern void _ZN7ee44362D1Ev();
Name_Map name_map_ee44362[] = {
  NSPAIR(_ZN7ee44362C1Ev),
  NSPAIR(_ZN7ee44362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee44362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44362[];
extern void _ZN5cc3623fooEv();
extern void _ZN7ee443623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee443623barEv,_ZTv0_n16_N7ee443623barEv)();
extern void ABISELECT(_ZThn24_N7ee443623barEv,_ZThn16_N7ee443623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN7ee443623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee443623barEv,_ZTv0_n16_N7ee443623barEv),
};
extern VTBL_ENTRY _ZTV7ee44362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee44362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee44362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee44362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee44362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee44362[] = {
  {&(_ZTV7ee44362[3]),  3,11},
  {&(_tg__ZTV6dd4362__7ee44362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee44362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee44362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee44362[4]),  4,6},
  {&(_ZTV7ee44362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee44362[];
extern  VTBL_ENTRY _ZTV7ee44362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44362[];
static VTBL_ENTRY alt_thunk_names1129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee443623barEv,_ZTv0_n16_N7ee443623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee443623barEv,_ZThn16_N7ee443623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44362 = {  "ee44362", // class name
  bases_ee44362, 4,
  &(vtc_ee44362[0]), // expected_vtbl_contents
  &(vtt_ee44362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1129,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54362  : virtual dd4362 {
  int e;
  virtual void  bar(); // _ZN7ee543623barEv
  ~ee54362(); // tgen
  ee54362(); // tgen
};
//SIG(1 ee54362) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee54362 ::bar(){vfunc_called(this, "_ZN7ee543623barEv");}
ee54362 ::~ee54362(){ note_dtor("ee54362", this);} // tgen
ee54362 ::ee54362(){ note_ctor("ee54362", this);} // tgen

static void Test_ee54362()
{
  extern Class_Descriptor cd_ee54362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54362, buf);
    ee54362 *dp, &lv = *(dp=new (buf) ee54362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee54362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(32,20), "ee54362");
    check_base_class_offset(lv, (cc362*)(dd4362*), ABISELECT(16,8), "ee54362");
    check_base_class_offset(lv, (dd4362*), ABISELECT(16,8), "ee54362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54362.e");
    test_class_info(&lv, &cd_ee54362);
    dp->~ee54362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54362(Test_ee54362, "ee54362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54362C1Ev();
extern void _ZN7ee54362D1Ev();
Name_Map name_map_ee54362[] = {
  NSPAIR(_ZN7ee54362C1Ev),
  NSPAIR(_ZN7ee54362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee54362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54362[];
extern void _ZN7ee543623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee543623barEv,_ZTv0_n20_N7ee543623barEv)();
extern void ABISELECT(_ZThn16_N7ee543623barEv,_ZThn8_N7ee543623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee543623barEv,_ZTv0_n16_N7ee543623barEv)();
extern void ABISELECT(_ZThn32_N7ee543623barEv,_ZThn20_N7ee543623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54362[0]),
  (VTBL_ENTRY)&_ZN7ee543623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee543623barEv,_ZTv0_n20_N7ee543623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee543623barEv,_ZTv0_n16_N7ee543623barEv),
};
extern VTBL_ENTRY _ZTV7ee54362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee54362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee54362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee54362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee54362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee54362[] = {
  {&(_ZTV7ee54362[4]),  4,18},
  {&(_ZTV7ee54362[10]),  10,18},
  {&(_ZTV7ee54362[16]),  16,18},
  {&(_tg__ZTV6dd4362__7ee54362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee54362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee54362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee54362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54362[];
extern  VTBL_ENTRY _ZTV7ee54362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54362[];
static VTBL_ENTRY alt_thunk_names1130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee543623barEv,_ZTv0_n16_N7ee543623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee543623barEv,_ZThn20_N7ee543623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee543623barEv,_ZTv0_n20_N7ee543623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee543623barEv,_ZThn8_N7ee543623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54362 = {  "ee54362", // class name
  bases_ee54362, 4,
  &(vtc_ee54362[0]), // expected_vtbl_contents
  &(vtt_ee54362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54362),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1130,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64362  : dd4362 {
  int e;
  virtual void  foo(); // _ZN7ee643623fooEv
  virtual void  bar(); // _ZN7ee643623barEv
  ~ee64362(); // tgen
  ee64362(); // tgen
};
//SIG(1 ee64362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee64362 ::foo(){vfunc_called(this, "_ZN7ee643623fooEv");}
void  ee64362 ::bar(){vfunc_called(this, "_ZN7ee643623barEv");}
ee64362 ::~ee64362(){ note_dtor("ee64362", this);} // tgen
ee64362 ::ee64362(){ note_ctor("ee64362", this);} // tgen

static void Test_ee64362()
{
  extern Class_Descriptor cd_ee64362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64362, buf);
    ee64362 *dp, &lv = *(dp=new (buf) ee64362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee64362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(24,16), "ee64362");
    check_base_class_offset(lv, (cc362*)(dd4362*), 0, "ee64362");
    check_base_class_offset(lv, (dd4362*), 0, "ee64362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64362.e");
    test_class_info(&lv, &cd_ee64362);
    dp->~ee64362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64362(Test_ee64362, "ee64362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64362C1Ev();
extern void _ZN7ee64362D1Ev();
Name_Map name_map_ee64362[] = {
  NSPAIR(_ZN7ee64362C1Ev),
  NSPAIR(_ZN7ee64362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee64362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64362[];
extern void _ZN7ee643623fooEv();
extern void _ZN7ee643623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee643623fooEv,_ZTv0_n12_N7ee643623fooEv)();
extern void ABISELECT(_ZThn24_N7ee643623fooEv,_ZThn16_N7ee643623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee643623barEv,_ZTv0_n16_N7ee643623barEv)();
extern void ABISELECT(_ZThn24_N7ee643623barEv,_ZThn16_N7ee643623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64362[0]),
  (VTBL_ENTRY)&_ZN7ee643623fooEv,
  (VTBL_ENTRY)&_ZN7ee643623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee643623fooEv,_ZTv0_n12_N7ee643623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee643623barEv,_ZTv0_n16_N7ee643623barEv),
};
extern VTBL_ENTRY _ZTV7ee64362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee64362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee64362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee64362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee64362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee64362[] = {
  {&(_ZTV7ee64362[3]),  3,11},
  {&(_tg__ZTV6dd4362__7ee64362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee64362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee64362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee64362[4]),  4,6},
  {&(_ZTV7ee64362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64362[];
extern  VTBL_ENTRY _ZTV7ee64362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64362[];
static VTBL_ENTRY alt_thunk_names1131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd43623barEv,_ZThn16_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee643623barEv,_ZTv0_n16_N7ee643623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee643623barEv,_ZThn16_N7ee643623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee643623fooEv,_ZTv0_n12_N7ee643623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee643623fooEv,_ZThn16_N7ee643623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64362 = {  "ee64362", // class name
  bases_ee64362, 4,
  &(vtc_ee64362[0]), // expected_vtbl_contents
  &(vtt_ee64362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1131,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74362  : virtual dd4362 {
  int e;
  virtual void  foo(); // _ZN7ee743623fooEv
  virtual void  bar(); // _ZN7ee743623barEv
  ~ee74362(); // tgen
  ee74362(); // tgen
};
//SIG(1 ee74362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee74362 ::foo(){vfunc_called(this, "_ZN7ee743623fooEv");}
void  ee74362 ::bar(){vfunc_called(this, "_ZN7ee743623barEv");}
ee74362 ::~ee74362(){ note_dtor("ee74362", this);} // tgen
ee74362 ::ee74362(){ note_ctor("ee74362", this);} // tgen

static void Test_ee74362()
{
  extern Class_Descriptor cd_ee74362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74362, buf);
    ee74362 *dp, &lv = *(dp=new (buf) ee74362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee74362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd4362*), ABISELECT(32,20), "ee74362");
    check_base_class_offset(lv, (cc362*)(dd4362*), ABISELECT(16,8), "ee74362");
    check_base_class_offset(lv, (dd4362*), ABISELECT(16,8), "ee74362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74362.e");
    test_class_info(&lv, &cd_ee74362);
    dp->~ee74362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74362(Test_ee74362, "ee74362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74362C1Ev();
extern void _ZN7ee74362D1Ev();
Name_Map name_map_ee74362[] = {
  NSPAIR(_ZN7ee74362C1Ev),
  NSPAIR(_ZN7ee74362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd4362;
extern VTBL_ENTRY _ZTI6dd4362[];
extern  VTBL_ENTRY _ZTV6dd4362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4362[];
static Base_Class bases_ee74362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74362[];
extern void _ZN7ee743623fooEv();
extern void _ZN7ee743623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee743623fooEv,_ZTv0_n16_N7ee743623fooEv)();
extern void ABISELECT(_ZThn16_N7ee743623fooEv,_ZThn8_N7ee743623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee743623barEv,_ZTv0_n20_N7ee743623barEv)();
extern void ABISELECT(_ZThn16_N7ee743623barEv,_ZThn8_N7ee743623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee743623fooEv,_ZTv0_n12_N7ee743623fooEv)();
extern void ABISELECT(_ZThn32_N7ee743623fooEv,_ZThn20_N7ee743623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee743623barEv,_ZTv0_n16_N7ee743623barEv)();
extern void ABISELECT(_ZThn32_N7ee743623barEv,_ZThn20_N7ee743623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74362[0]),
  (VTBL_ENTRY)&_ZN7ee743623fooEv,
  (VTBL_ENTRY)&_ZN7ee743623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee743623fooEv,_ZTv0_n16_N7ee743623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee743623barEv,_ZTv0_n20_N7ee743623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee743623fooEv,_ZTv0_n12_N7ee743623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee743623barEv,_ZTv0_n16_N7ee743623barEv),
};
extern VTBL_ENTRY _ZTV7ee74362[];
extern void _ZN5cc3623fooEv();
extern void _ZN6dd43623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4362__7ee74362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  (VTBL_ENTRY)&_ZN6dd43623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd4362__7ee74362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd4362__7ee74362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv)();
extern void ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4362__7ee74362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv),
};
static  VTT_ENTRY vtt_ee74362[] = {
  {&(_ZTV7ee74362[4]),  4,19},
  {&(_ZTV7ee74362[11]),  11,19},
  {&(_ZTV7ee74362[17]),  17,19},
  {&(_tg__ZTV6dd4362__7ee74362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd4362__7ee74362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd4362__7ee74362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4362__7ee74362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74362[];
extern  VTBL_ENTRY _ZTV7ee74362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74362[];
static VTBL_ENTRY alt_thunk_names1132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd43623barEv,_ZTv0_n16_N6dd43623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd43623barEv,_ZThn12_N6dd43623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee743623barEv,_ZTv0_n16_N7ee743623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee743623barEv,_ZThn20_N7ee743623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee743623fooEv,_ZTv0_n12_N7ee743623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee743623fooEv,_ZThn20_N7ee743623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee743623barEv,_ZTv0_n20_N7ee743623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee743623barEv,_ZThn8_N7ee743623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee743623fooEv,_ZTv0_n16_N7ee743623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee743623fooEv,_ZThn8_N7ee743623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74362 = {  "ee74362", // class name
  bases_ee74362, 4,
  &(vtc_ee74362[0]), // expected_vtbl_contents
  &(vtt_ee74362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74362),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1132,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5362  : virtual cc362 {
  int d;
  virtual void  bar(); // _ZN6dd53623barEv
  ~dd5362(); // tgen
  dd5362(); // tgen
};
//SIG(-1 dd5362) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  dd5362 ::bar(){vfunc_called(this, "_ZN6dd53623barEv");}
dd5362 ::~dd5362(){ note_dtor("dd5362", this);} // tgen
dd5362 ::dd5362(){ note_ctor("dd5362", this);} // tgen

static void Test_dd5362()
{
  extern Class_Descriptor cd_dd5362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5362, buf);
    dd5362 *dp, &lv = *(dp=new (buf) dd5362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd5362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,16), "dd5362");
    check_base_class_offset(lv, (cc362*), ABISELECT(16,8), "dd5362");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5362.d");
    test_class_info(&lv, &cd_dd5362);
    dp->~dd5362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5362(Test_dd5362, "dd5362", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5362C1Ev();
extern void _ZN6dd5362D1Ev();
Name_Map name_map_dd5362[] = {
  NSPAIR(_ZN6dd5362C1Ev),
  NSPAIR(_ZN6dd5362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd5362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc362,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5362[];
extern void _ZN6dd53623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern VTBL_ENTRY _ZTV6dd5362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd5362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd5362[] = {
  {&(_ZTV6dd5362[4]),  4,16},
  {&(_ZTV6dd5362[9]),  9,16},
  {&(_ZTV6dd5362[14]),  14,16},
  {&(_tg__ZTV5cc362__6dd5362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd5362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static VTBL_ENTRY alt_thunk_names1133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5362 = {  "dd5362", // class name
  bases_dd5362, 3,
  &(vtc_dd5362[0]), // expected_vtbl_contents
  &(vtt_dd5362[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5362),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1133,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05362  : dd5362 {
  int e;
  ~ee05362(); // tgen
  ee05362(); // tgen
};
//SIG(1 ee05362) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee05362 ::~ee05362(){ note_dtor("ee05362", this);} // tgen
ee05362 ::ee05362(){ note_ctor("ee05362", this);} // tgen

static void Test_ee05362()
{
  extern Class_Descriptor cd_ee05362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05362, buf);
    ee05362 *dp, &lv = *(dp=new (buf) ee05362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee05362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee05362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(16,12), "ee05362");
    check_base_class_offset(lv, (dd5362*), 0, "ee05362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05362.e");
    test_class_info(&lv, &cd_ee05362);
    dp->~ee05362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05362(Test_ee05362, "ee05362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05362C1Ev();
extern void _ZN7ee05362D1Ev();
Name_Map name_map_ee05362[] = {
  NSPAIR(_ZN7ee05362C1Ev),
  NSPAIR(_ZN7ee05362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee05362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05362[];
extern void _ZN6dd53623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern VTBL_ENTRY _ZTV7ee05362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee05362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee05362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee05362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee05362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee05362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee05362[] = {
  {&(_ZTV7ee05362[4]),  4,16},
  {&(_tg__ZTV6dd5362__7ee05362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee05362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee05362[4]),  4,6},
  {&(_ZTV7ee05362[9]),  9,16},
  {&(_ZTV7ee05362[14]),  14,16},
  {&(_tg__ZTV5cc362__7ee05362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee05362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05362[];
extern  VTBL_ENTRY _ZTV7ee05362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05362[];
static VTBL_ENTRY alt_thunk_names1134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05362 = {  "ee05362", // class name
  bases_ee05362, 4,
  &(vtc_ee05362[0]), // expected_vtbl_contents
  &(vtt_ee05362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1134,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15362  : virtual dd5362 {
  int e;
  ~ee15362(); // tgen
  ee15362(); // tgen
};
//SIG(1 ee15362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} Fi}


ee15362 ::~ee15362(){ note_dtor("ee15362", this);} // tgen
ee15362 ::ee15362(){ note_ctor("ee15362", this);} // tgen

static void Test_ee15362()
{
  extern Class_Descriptor cd_ee15362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15362, buf);
    ee15362 *dp, &lv = *(dp=new (buf) ee15362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee15362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee15362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(32,16), "ee15362");
    check_base_class_offset(lv, (dd5362*), ABISELECT(16,8), "ee15362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15362.e");
    test_class_info(&lv, &cd_ee15362);
    dp->~ee15362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15362(Test_ee15362, "ee15362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15362C1Ev();
extern void _ZN7ee15362D1Ev();
Name_Map name_map_ee15362[] = {
  NSPAIR(_ZN7ee15362C1Ev),
  NSPAIR(_ZN7ee15362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee15362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15362[];
extern void _ZN6dd53623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15362[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern VTBL_ENTRY _ZTV7ee15362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee15362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee15362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee15362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee15362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee15362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee15362[] = {
  {&(_ZTV7ee15362[5]),  5,22},
  {&(_ZTV7ee15362[10]),  10,22},
  {&(_ZTV7ee15362[15]),  15,22},
  {&(_ZTV7ee15362[20]),  20,22},
  {&(_tg__ZTV6dd5362__7ee15362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee15362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee15362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee15362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee15362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15362[];
extern  VTBL_ENTRY _ZTV7ee15362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15362[];
static VTBL_ENTRY alt_thunk_names1135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15362 = {  "ee15362", // class name
  bases_ee15362, 4,
  &(vtc_ee15362[0]), // expected_vtbl_contents
  &(vtt_ee15362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15362),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1135,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25362  : dd5362 {
  int e;
  virtual void  foo(); // _ZN7ee253623fooEv
  ~ee25362(); // tgen
  ee25362(); // tgen
};
//SIG(1 ee25362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee25362 ::foo(){vfunc_called(this, "_ZN7ee253623fooEv");}
ee25362 ::~ee25362(){ note_dtor("ee25362", this);} // tgen
ee25362 ::ee25362(){ note_ctor("ee25362", this);} // tgen

static void Test_ee25362()
{
  extern Class_Descriptor cd_ee25362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25362, buf);
    ee25362 *dp, &lv = *(dp=new (buf) ee25362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee25362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee25362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(16,12), "ee25362");
    check_base_class_offset(lv, (dd5362*), 0, "ee25362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25362.e");
    test_class_info(&lv, &cd_ee25362);
    dp->~ee25362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25362(Test_ee25362, "ee25362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25362C1Ev();
extern void _ZN7ee25362D1Ev();
Name_Map name_map_ee25362[] = {
  NSPAIR(_ZN7ee25362C1Ev),
  NSPAIR(_ZN7ee25362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee25362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25362[];
extern void _ZN6dd53623barEv();
extern void _ZN7ee253623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee253623fooEv,_ZTv0_n16_N7ee253623fooEv)();
extern void ABISELECT(_ZThn16_N7ee253623fooEv,_ZThn12_N7ee253623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee253623fooEv,_ZTv0_n12_N7ee253623fooEv)();
extern void ABISELECT(_ZThn32_N7ee253623fooEv,_ZThn20_N7ee253623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
  (VTBL_ENTRY)&_ZN7ee253623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee253623fooEv,_ZTv0_n16_N7ee253623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee253623fooEv,_ZTv0_n12_N7ee253623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern VTBL_ENTRY _ZTV7ee25362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee25362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee25362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee25362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee25362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee25362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee25362[] = {
  {&(_ZTV7ee25362[4]),  4,17},
  {&(_tg__ZTV6dd5362__7ee25362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee25362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee25362[4]),  4,6},
  {&(_ZTV7ee25362[10]),  10,17},
  {&(_ZTV7ee25362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee25362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee25362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25362[];
extern  VTBL_ENTRY _ZTV7ee25362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25362[];
static VTBL_ENTRY alt_thunk_names1136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee253623fooEv,_ZTv0_n12_N7ee253623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee253623fooEv,_ZThn20_N7ee253623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee253623fooEv,_ZTv0_n16_N7ee253623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee253623fooEv,_ZThn12_N7ee253623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25362 = {  "ee25362", // class name
  bases_ee25362, 4,
  &(vtc_ee25362[0]), // expected_vtbl_contents
  &(vtt_ee25362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1136,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35362  : virtual dd5362 {
  int e;
  virtual void  foo(); // _ZN7ee353623fooEv
  ~ee35362(); // tgen
  ee35362(); // tgen
};
//SIG(1 ee35362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee35362 ::foo(){vfunc_called(this, "_ZN7ee353623fooEv");}
ee35362 ::~ee35362(){ note_dtor("ee35362", this);} // tgen
ee35362 ::ee35362(){ note_ctor("ee35362", this);} // tgen

static void Test_ee35362()
{
  extern Class_Descriptor cd_ee35362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35362, buf);
    ee35362 *dp, &lv = *(dp=new (buf) ee35362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee35362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee35362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(32,16), "ee35362");
    check_base_class_offset(lv, (dd5362*), ABISELECT(16,8), "ee35362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35362.e");
    test_class_info(&lv, &cd_ee35362);
    dp->~ee35362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35362(Test_ee35362, "ee35362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35362C1Ev();
extern void _ZN7ee35362D1Ev();
Name_Map name_map_ee35362[] = {
  NSPAIR(_ZN7ee35362C1Ev),
  NSPAIR(_ZN7ee35362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee35362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35362[];
extern void _ZN7ee353623fooEv();
extern void _ZN6dd53623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee353623fooEv,_ZTv0_n16_N7ee353623fooEv)();
extern void ABISELECT(_ZThn32_N7ee353623fooEv,_ZThn16_N7ee353623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee353623fooEv,_ZTv0_n12_N7ee353623fooEv)();
extern void ABISELECT(_ZThn48_N7ee353623fooEv,_ZThn24_N7ee353623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35362[0]),
  (VTBL_ENTRY)&_ZN7ee353623fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee353623fooEv,_ZTv0_n16_N7ee353623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee353623fooEv,_ZTv0_n12_N7ee353623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern VTBL_ENTRY _ZTV7ee35362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee35362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee35362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee35362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee35362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee35362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee35362[] = {
  {&(_ZTV7ee35362[5]),  5,23},
  {&(_ZTV7ee35362[11]),  11,23},
  {&(_ZTV7ee35362[16]),  16,23},
  {&(_ZTV7ee35362[21]),  21,23},
  {&(_tg__ZTV6dd5362__7ee35362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee35362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee35362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee35362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee35362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35362[];
extern  VTBL_ENTRY _ZTV7ee35362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35362[];
static VTBL_ENTRY alt_thunk_names1137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee353623fooEv,_ZTv0_n12_N7ee353623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee353623fooEv,_ZThn24_N7ee353623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee353623fooEv,_ZTv0_n16_N7ee353623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee353623fooEv,_ZThn16_N7ee353623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35362 = {  "ee35362", // class name
  bases_ee35362, 4,
  &(vtc_ee35362[0]), // expected_vtbl_contents
  &(vtt_ee35362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35362),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1137,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45362  : dd5362 {
  int e;
  virtual void  bar(); // _ZN7ee453623barEv
  ~ee45362(); // tgen
  ee45362(); // tgen
};
//SIG(1 ee45362) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee45362 ::bar(){vfunc_called(this, "_ZN7ee453623barEv");}
ee45362 ::~ee45362(){ note_dtor("ee45362", this);} // tgen
ee45362 ::ee45362(){ note_ctor("ee45362", this);} // tgen

static void Test_ee45362()
{
  extern Class_Descriptor cd_ee45362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45362, buf);
    ee45362 *dp, &lv = *(dp=new (buf) ee45362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee45362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee45362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(16,12), "ee45362");
    check_base_class_offset(lv, (dd5362*), 0, "ee45362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45362.e");
    test_class_info(&lv, &cd_ee45362);
    dp->~ee45362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45362(Test_ee45362, "ee45362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45362C1Ev();
extern void _ZN7ee45362D1Ev();
Name_Map name_map_ee45362[] = {
  NSPAIR(_ZN7ee45362C1Ev),
  NSPAIR(_ZN7ee45362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee45362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45362[];
extern void _ZN7ee453623barEv();
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee453623barEv,_ZTv0_n16_N7ee453623barEv)();
extern void ABISELECT(_ZThn32_N7ee453623barEv,_ZThn20_N7ee453623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45362[0]),
  (VTBL_ENTRY)&_ZN7ee453623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee453623barEv,_ZTv0_n16_N7ee453623barEv),
};
extern VTBL_ENTRY _ZTV7ee45362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee45362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee45362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee45362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee45362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee45362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee45362[] = {
  {&(_ZTV7ee45362[4]),  4,16},
  {&(_tg__ZTV6dd5362__7ee45362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee45362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee45362[4]),  4,6},
  {&(_ZTV7ee45362[9]),  9,16},
  {&(_ZTV7ee45362[14]),  14,16},
  {&(_tg__ZTV5cc362__7ee45362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee45362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45362[];
extern  VTBL_ENTRY _ZTV7ee45362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45362[];
static VTBL_ENTRY alt_thunk_names1138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee453623barEv,_ZTv0_n16_N7ee453623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee453623barEv,_ZThn20_N7ee453623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45362 = {  "ee45362", // class name
  bases_ee45362, 4,
  &(vtc_ee45362[0]), // expected_vtbl_contents
  &(vtt_ee45362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45362),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1138,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55362  : virtual dd5362 {
  int e;
  virtual void  bar(); // _ZN7ee553623barEv
  ~ee55362(); // tgen
  ee55362(); // tgen
};
//SIG(1 ee55362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee55362 ::bar(){vfunc_called(this, "_ZN7ee553623barEv");}
ee55362 ::~ee55362(){ note_dtor("ee55362", this);} // tgen
ee55362 ::ee55362(){ note_ctor("ee55362", this);} // tgen

static void Test_ee55362()
{
  extern Class_Descriptor cd_ee55362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55362, buf);
    ee55362 *dp, &lv = *(dp=new (buf) ee55362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee55362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee55362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(32,16), "ee55362");
    check_base_class_offset(lv, (dd5362*), ABISELECT(16,8), "ee55362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55362.e");
    test_class_info(&lv, &cd_ee55362);
    dp->~ee55362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55362(Test_ee55362, "ee55362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55362C1Ev();
extern void _ZN7ee55362D1Ev();
Name_Map name_map_ee55362[] = {
  NSPAIR(_ZN7ee55362C1Ev),
  NSPAIR(_ZN7ee55362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee55362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55362[];
extern void _ZN7ee553623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee553623barEv,_ZTv0_n20_N7ee553623barEv)();
extern void ABISELECT(_ZThn16_N7ee553623barEv,_ZThn8_N7ee553623barEv)() __attribute__((weak));
extern void _ZN5cc3623fooEv();
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee553623barEv,_ZTv0_n16_N7ee553623barEv)();
extern void ABISELECT(_ZThn48_N7ee553623barEv,_ZThn24_N7ee553623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55362[0]),
  (VTBL_ENTRY)&_ZN7ee553623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee553623barEv,_ZTv0_n20_N7ee553623barEv),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee553623barEv,_ZTv0_n16_N7ee553623barEv),
};
extern VTBL_ENTRY _ZTV7ee55362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee55362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee55362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee55362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee55362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee55362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee55362[] = {
  {&(_ZTV7ee55362[5]),  5,23},
  {&(_ZTV7ee55362[11]),  11,23},
  {&(_ZTV7ee55362[16]),  16,23},
  {&(_ZTV7ee55362[21]),  21,23},
  {&(_tg__ZTV6dd5362__7ee55362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee55362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee55362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee55362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee55362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55362[];
extern  VTBL_ENTRY _ZTV7ee55362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55362[];
static VTBL_ENTRY alt_thunk_names1139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee553623barEv,_ZTv0_n16_N7ee553623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee553623barEv,_ZThn24_N7ee553623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee553623barEv,_ZTv0_n20_N7ee553623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee553623barEv,_ZThn8_N7ee553623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55362 = {  "ee55362", // class name
  bases_ee55362, 4,
  &(vtc_ee55362[0]), // expected_vtbl_contents
  &(vtt_ee55362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55362),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1139,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65362  : dd5362 {
  int e;
  virtual void  foo(); // _ZN7ee653623fooEv
  virtual void  bar(); // _ZN7ee653623barEv
  ~ee65362(); // tgen
  ee65362(); // tgen
};
//SIG(1 ee65362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee65362 ::foo(){vfunc_called(this, "_ZN7ee653623fooEv");}
void  ee65362 ::bar(){vfunc_called(this, "_ZN7ee653623barEv");}
ee65362 ::~ee65362(){ note_dtor("ee65362", this);} // tgen
ee65362 ::ee65362(){ note_ctor("ee65362", this);} // tgen

static void Test_ee65362()
{
  extern Class_Descriptor cd_ee65362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65362, buf);
    ee65362 *dp, &lv = *(dp=new (buf) ee65362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee65362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee65362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(16,12), "ee65362");
    check_base_class_offset(lv, (dd5362*), 0, "ee65362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65362.e");
    test_class_info(&lv, &cd_ee65362);
    dp->~ee65362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65362(Test_ee65362, "ee65362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65362C1Ev();
extern void _ZN7ee65362D1Ev();
Name_Map name_map_ee65362[] = {
  NSPAIR(_ZN7ee65362C1Ev),
  NSPAIR(_ZN7ee65362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee65362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65362[];
extern void _ZN7ee653623barEv();
extern void _ZN7ee653623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee653623fooEv,_ZTv0_n16_N7ee653623fooEv)();
extern void ABISELECT(_ZThn16_N7ee653623fooEv,_ZThn12_N7ee653623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee653623fooEv,_ZTv0_n12_N7ee653623fooEv)();
extern void ABISELECT(_ZThn32_N7ee653623fooEv,_ZThn20_N7ee653623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee653623barEv,_ZTv0_n16_N7ee653623barEv)();
extern void ABISELECT(_ZThn32_N7ee653623barEv,_ZThn20_N7ee653623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65362[0]),
  (VTBL_ENTRY)&_ZN7ee653623barEv,
  (VTBL_ENTRY)&_ZN7ee653623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee653623fooEv,_ZTv0_n16_N7ee653623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee653623fooEv,_ZTv0_n12_N7ee653623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee653623barEv,_ZTv0_n16_N7ee653623barEv),
};
extern VTBL_ENTRY _ZTV7ee65362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee65362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee65362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee65362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee65362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee65362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee65362[] = {
  {&(_ZTV7ee65362[4]),  4,17},
  {&(_tg__ZTV6dd5362__7ee65362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee65362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee65362[4]),  4,6},
  {&(_ZTV7ee65362[10]),  10,17},
  {&(_ZTV7ee65362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee65362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee65362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65362[];
extern  VTBL_ENTRY _ZTV7ee65362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65362[];
static VTBL_ENTRY alt_thunk_names1140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn20_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee653623barEv,_ZTv0_n16_N7ee653623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee653623barEv,_ZThn20_N7ee653623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee653623fooEv,_ZTv0_n12_N7ee653623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee653623fooEv,_ZThn20_N7ee653623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee653623fooEv,_ZTv0_n16_N7ee653623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee653623fooEv,_ZThn12_N7ee653623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65362 = {  "ee65362", // class name
  bases_ee65362, 4,
  &(vtc_ee65362[0]), // expected_vtbl_contents
  &(vtt_ee65362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1140,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75362  : virtual dd5362 {
  int e;
  virtual void  foo(); // _ZN7ee753623fooEv
  virtual void  bar(); // _ZN7ee753623barEv
  ~ee75362(); // tgen
  ee75362(); // tgen
};
//SIG(1 ee75362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 Fi} v1 v2 Fi}


void  ee75362 ::foo(){vfunc_called(this, "_ZN7ee753623fooEv");}
void  ee75362 ::bar(){vfunc_called(this, "_ZN7ee753623barEv");}
ee75362 ::~ee75362(){ note_dtor("ee75362", this);} // tgen
ee75362 ::ee75362(){ note_ctor("ee75362", this);} // tgen

static void Test_ee75362()
{
  extern Class_Descriptor cd_ee75362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75362, buf);
    ee75362 *dp, &lv = *(dp=new (buf) ee75362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee75362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee75362");
    check_base_class_offset(lv, (cc362*)(dd5362*), ABISELECT(32,16), "ee75362");
    check_base_class_offset(lv, (dd5362*), ABISELECT(16,8), "ee75362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75362.e");
    test_class_info(&lv, &cd_ee75362);
    dp->~ee75362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75362(Test_ee75362, "ee75362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75362C1Ev();
extern void _ZN7ee75362D1Ev();
Name_Map name_map_ee75362[] = {
  NSPAIR(_ZN7ee75362C1Ev),
  NSPAIR(_ZN7ee75362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd5362;
extern VTBL_ENTRY _ZTI6dd5362[];
extern  VTBL_ENTRY _ZTV6dd5362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5362[];
static Base_Class bases_ee75362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5362,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75362[];
extern void _ZN7ee753623fooEv();
extern void _ZN7ee753623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee753623barEv,_ZTv0_n20_N7ee753623barEv)();
extern void ABISELECT(_ZThn16_N7ee753623barEv,_ZThn8_N7ee753623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee753623fooEv,_ZTv0_n16_N7ee753623fooEv)();
extern void ABISELECT(_ZThn32_N7ee753623fooEv,_ZThn16_N7ee753623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee753623fooEv,_ZTv0_n12_N7ee753623fooEv)();
extern void ABISELECT(_ZThn48_N7ee753623fooEv,_ZThn24_N7ee753623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee753623barEv,_ZTv0_n16_N7ee753623barEv)();
extern void ABISELECT(_ZThn48_N7ee753623barEv,_ZThn24_N7ee753623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75362[0]),
  (VTBL_ENTRY)&_ZN7ee753623fooEv,
  (VTBL_ENTRY)&_ZN7ee753623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee753623barEv,_ZTv0_n20_N7ee753623barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee753623fooEv,_ZTv0_n16_N7ee753623fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee753623fooEv,_ZTv0_n12_N7ee753623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee753623barEv,_ZTv0_n16_N7ee753623barEv),
};
extern VTBL_ENTRY _ZTV7ee75362[];
extern void _ZN6dd53623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5362__7ee75362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN6dd53623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd5362__7ee75362[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv)();
extern void ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5362__7ee75362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee75362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee75362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee75362[] = {
  {&(_ZTV7ee75362[5]),  5,24},
  {&(_ZTV7ee75362[12]),  12,24},
  {&(_ZTV7ee75362[17]),  17,24},
  {&(_ZTV7ee75362[22]),  22,24},
  {&(_tg__ZTV6dd5362__7ee75362[4]),  4,5},
  {&(_tg__ZTV5cc362__6dd5362__7ee75362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5362__7ee75362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee75362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee75362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75362[];
extern  VTBL_ENTRY _ZTV7ee75362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75362[];
static VTBL_ENTRY alt_thunk_names1141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd53623barEv,_ZTv0_n16_N6dd53623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd53623barEv,_ZThn16_N6dd53623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee753623barEv,_ZTv0_n16_N7ee753623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee753623barEv,_ZThn24_N7ee753623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee753623fooEv,_ZTv0_n12_N7ee753623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee753623fooEv,_ZThn24_N7ee753623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee753623fooEv,_ZTv0_n16_N7ee753623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee753623fooEv,_ZThn16_N7ee753623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee753623barEv,_ZTv0_n20_N7ee753623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee753623barEv,_ZThn8_N7ee753623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75362 = {  "ee75362", // class name
  bases_ee75362, 4,
  &(vtc_ee75362[0]), // expected_vtbl_contents
  &(vtt_ee75362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75362),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1141,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6362  : cc362 {
  int d;
  virtual void  bar(); // _ZN6dd63623barEv
  virtual void  foo(); // _ZN6dd63623fooEv
  ~dd6362(); // tgen
  dd6362(); // tgen
};
//SIG(-1 dd6362) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd6362 ::bar(){vfunc_called(this, "_ZN6dd63623barEv");}
void  dd6362 ::foo(){vfunc_called(this, "_ZN6dd63623fooEv");}
dd6362 ::~dd6362(){ note_dtor("dd6362", this);} // tgen
dd6362 ::dd6362(){ note_ctor("dd6362", this);} // tgen

static void Test_dd6362()
{
  extern Class_Descriptor cd_dd6362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6362, buf);
    dd6362 *dp, &lv = *(dp=new (buf) dd6362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd6362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(16,12), "dd6362");
    check_base_class_offset(lv, (cc362*), 0, "dd6362");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6362.d");
    test_class_info(&lv, &cd_dd6362);
    dp->~dd6362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6362(Test_dd6362, "dd6362", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6362C1Ev();
extern void _ZN6dd6362D1Ev();
Name_Map name_map_dd6362[] = {
  NSPAIR(_ZN6dd6362C1Ev),
  NSPAIR(_ZN6dd6362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd6362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
extern VTBL_ENTRY _ZTV6dd6362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd6362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd6362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd6362[] = {
  {&(_ZTV6dd6362[3]),  3,11},
  {&(_tg__ZTV5cc362__6dd6362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd6362[4]),  4,6},
  {&(_ZTV6dd6362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static VTBL_ENTRY alt_thunk_names1142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6362 = {  "dd6362", // class name
  bases_dd6362, 3,
  &(vtc_dd6362[0]), // expected_vtbl_contents
  &(vtt_dd6362[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6362),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1142,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06362  : dd6362 {
  int e;
  ~ee06362(); // tgen
  ee06362(); // tgen
};
//SIG(1 ee06362) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee06362 ::~ee06362(){ note_dtor("ee06362", this);} // tgen
ee06362 ::ee06362(){ note_ctor("ee06362", this);} // tgen

static void Test_ee06362()
{
  extern Class_Descriptor cd_ee06362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06362, buf);
    ee06362 *dp, &lv = *(dp=new (buf) ee06362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee06362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(24,16), "ee06362");
    check_base_class_offset(lv, (cc362*)(dd6362*), 0, "ee06362");
    check_base_class_offset(lv, (dd6362*), 0, "ee06362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06362.e");
    test_class_info(&lv, &cd_ee06362);
    dp->~ee06362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06362(Test_ee06362, "ee06362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06362C1Ev();
extern void _ZN7ee06362D1Ev();
Name_Map name_map_ee06362[] = {
  NSPAIR(_ZN7ee06362C1Ev),
  NSPAIR(_ZN7ee06362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee06362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
extern VTBL_ENTRY _ZTV7ee06362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee06362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee06362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee06362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee06362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee06362[] = {
  {&(_ZTV7ee06362[3]),  3,11},
  {&(_tg__ZTV6dd6362__7ee06362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee06362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee06362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee06362[4]),  4,6},
  {&(_ZTV7ee06362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06362[];
extern  VTBL_ENTRY _ZTV7ee06362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06362[];
static VTBL_ENTRY alt_thunk_names1143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06362 = {  "ee06362", // class name
  bases_ee06362, 4,
  &(vtc_ee06362[0]), // expected_vtbl_contents
  &(vtt_ee06362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1143,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16362  : virtual dd6362 {
  int e;
  ~ee16362(); // tgen
  ee16362(); // tgen
};
//SIG(1 ee16362) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee16362 ::~ee16362(){ note_dtor("ee16362", this);} // tgen
ee16362 ::ee16362(){ note_ctor("ee16362", this);} // tgen

static void Test_ee16362()
{
  extern Class_Descriptor cd_ee16362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16362, buf);
    ee16362 *dp, &lv = *(dp=new (buf) ee16362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee16362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(32,20), "ee16362");
    check_base_class_offset(lv, (cc362*)(dd6362*), ABISELECT(16,8), "ee16362");
    check_base_class_offset(lv, (dd6362*), ABISELECT(16,8), "ee16362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16362.e");
    test_class_info(&lv, &cd_ee16362);
    dp->~ee16362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16362(Test_ee16362, "ee16362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16362C1Ev();
extern void _ZN7ee16362D1Ev();
Name_Map name_map_ee16362[] = {
  NSPAIR(_ZN7ee16362C1Ev),
  NSPAIR(_ZN7ee16362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee16362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16362[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
extern VTBL_ENTRY _ZTV7ee16362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee16362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee16362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee16362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee16362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee16362[] = {
  {&(_ZTV7ee16362[4]),  4,17},
  {&(_ZTV7ee16362[9]),  9,17},
  {&(_ZTV7ee16362[15]),  15,17},
  {&(_tg__ZTV6dd6362__7ee16362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee16362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee16362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee16362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16362[];
extern  VTBL_ENTRY _ZTV7ee16362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16362[];
static VTBL_ENTRY alt_thunk_names1144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16362 = {  "ee16362", // class name
  bases_ee16362, 4,
  &(vtc_ee16362[0]), // expected_vtbl_contents
  &(vtt_ee16362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1144,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26362  : dd6362 {
  int e;
  virtual void  foo(); // _ZN7ee263623fooEv
  ~ee26362(); // tgen
  ee26362(); // tgen
};
//SIG(1 ee26362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee26362 ::foo(){vfunc_called(this, "_ZN7ee263623fooEv");}
ee26362 ::~ee26362(){ note_dtor("ee26362", this);} // tgen
ee26362 ::ee26362(){ note_ctor("ee26362", this);} // tgen

static void Test_ee26362()
{
  extern Class_Descriptor cd_ee26362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26362, buf);
    ee26362 *dp, &lv = *(dp=new (buf) ee26362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee26362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(24,16), "ee26362");
    check_base_class_offset(lv, (cc362*)(dd6362*), 0, "ee26362");
    check_base_class_offset(lv, (dd6362*), 0, "ee26362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26362.e");
    test_class_info(&lv, &cd_ee26362);
    dp->~ee26362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26362(Test_ee26362, "ee26362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26362C1Ev();
extern void _ZN7ee26362D1Ev();
Name_Map name_map_ee26362[] = {
  NSPAIR(_ZN7ee26362C1Ev),
  NSPAIR(_ZN7ee26362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee26362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26362[];
extern void _ZN7ee263623fooEv();
extern void _ZN6dd63623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee263623fooEv,_ZTv0_n12_N7ee263623fooEv)();
extern void ABISELECT(_ZThn24_N7ee263623fooEv,_ZThn16_N7ee263623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26362[0]),
  (VTBL_ENTRY)&_ZN7ee263623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee263623fooEv,_ZTv0_n12_N7ee263623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
extern VTBL_ENTRY _ZTV7ee26362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee26362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee26362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee26362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee26362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee26362[] = {
  {&(_ZTV7ee26362[3]),  3,11},
  {&(_tg__ZTV6dd6362__7ee26362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee26362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee26362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee26362[4]),  4,6},
  {&(_ZTV7ee26362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26362[];
extern  VTBL_ENTRY _ZTV7ee26362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26362[];
static VTBL_ENTRY alt_thunk_names1145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee263623fooEv,_ZTv0_n12_N7ee263623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee263623fooEv,_ZThn16_N7ee263623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26362 = {  "ee26362", // class name
  bases_ee26362, 4,
  &(vtc_ee26362[0]), // expected_vtbl_contents
  &(vtt_ee26362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1145,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36362  : virtual dd6362 {
  int e;
  virtual void  foo(); // _ZN7ee363623fooEv
  ~ee36362(); // tgen
  ee36362(); // tgen
};
//SIG(1 ee36362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee36362 ::foo(){vfunc_called(this, "_ZN7ee363623fooEv");}
ee36362 ::~ee36362(){ note_dtor("ee36362", this);} // tgen
ee36362 ::ee36362(){ note_ctor("ee36362", this);} // tgen

static void Test_ee36362()
{
  extern Class_Descriptor cd_ee36362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36362, buf);
    ee36362 *dp, &lv = *(dp=new (buf) ee36362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee36362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(32,20), "ee36362");
    check_base_class_offset(lv, (cc362*)(dd6362*), ABISELECT(16,8), "ee36362");
    check_base_class_offset(lv, (dd6362*), ABISELECT(16,8), "ee36362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36362.e");
    test_class_info(&lv, &cd_ee36362);
    dp->~ee36362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36362(Test_ee36362, "ee36362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36362C1Ev();
extern void _ZN7ee36362D1Ev();
Name_Map name_map_ee36362[] = {
  NSPAIR(_ZN7ee36362C1Ev),
  NSPAIR(_ZN7ee36362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee36362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36362[];
extern void _ZN7ee363623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee363623fooEv,_ZTv0_n16_N7ee363623fooEv)();
extern void ABISELECT(_ZThn16_N7ee363623fooEv,_ZThn8_N7ee363623fooEv)() __attribute__((weak));
extern void _ZN6dd63623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee363623fooEv,_ZTv0_n12_N7ee363623fooEv)();
extern void ABISELECT(_ZThn32_N7ee363623fooEv,_ZThn20_N7ee363623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36362[0]),
  (VTBL_ENTRY)&_ZN7ee363623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee363623fooEv,_ZTv0_n16_N7ee363623fooEv),
  (VTBL_ENTRY)&_ZN6dd63623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee363623fooEv,_ZTv0_n12_N7ee363623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
extern VTBL_ENTRY _ZTV7ee36362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee36362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee36362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee36362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee36362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee36362[] = {
  {&(_ZTV7ee36362[4]),  4,18},
  {&(_ZTV7ee36362[10]),  10,18},
  {&(_ZTV7ee36362[16]),  16,18},
  {&(_tg__ZTV6dd6362__7ee36362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee36362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee36362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee36362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36362[];
extern  VTBL_ENTRY _ZTV7ee36362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36362[];
static VTBL_ENTRY alt_thunk_names1146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee363623fooEv,_ZTv0_n12_N7ee363623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee363623fooEv,_ZThn20_N7ee363623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee363623fooEv,_ZTv0_n16_N7ee363623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee363623fooEv,_ZThn8_N7ee363623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36362 = {  "ee36362", // class name
  bases_ee36362, 4,
  &(vtc_ee36362[0]), // expected_vtbl_contents
  &(vtt_ee36362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36362),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1146,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46362  : dd6362 {
  int e;
  virtual void  bar(); // _ZN7ee463623barEv
  ~ee46362(); // tgen
  ee46362(); // tgen
};
//SIG(1 ee46362) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee46362 ::bar(){vfunc_called(this, "_ZN7ee463623barEv");}
ee46362 ::~ee46362(){ note_dtor("ee46362", this);} // tgen
ee46362 ::ee46362(){ note_ctor("ee46362", this);} // tgen

static void Test_ee46362()
{
  extern Class_Descriptor cd_ee46362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46362, buf);
    ee46362 *dp, &lv = *(dp=new (buf) ee46362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee46362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(24,16), "ee46362");
    check_base_class_offset(lv, (cc362*)(dd6362*), 0, "ee46362");
    check_base_class_offset(lv, (dd6362*), 0, "ee46362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46362.e");
    test_class_info(&lv, &cd_ee46362);
    dp->~ee46362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46362(Test_ee46362, "ee46362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46362C1Ev();
extern void _ZN7ee46362D1Ev();
Name_Map name_map_ee46362[] = {
  NSPAIR(_ZN7ee46362C1Ev),
  NSPAIR(_ZN7ee46362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee46362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46362[];
extern void _ZN6dd63623fooEv();
extern void _ZN7ee463623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee463623barEv,_ZTv0_n16_N7ee463623barEv)();
extern void ABISELECT(_ZThn24_N7ee463623barEv,_ZThn16_N7ee463623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN7ee463623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee463623barEv,_ZTv0_n16_N7ee463623barEv),
};
extern VTBL_ENTRY _ZTV7ee46362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee46362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee46362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee46362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee46362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee46362[] = {
  {&(_ZTV7ee46362[3]),  3,11},
  {&(_tg__ZTV6dd6362__7ee46362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee46362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee46362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee46362[4]),  4,6},
  {&(_ZTV7ee46362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46362[];
extern  VTBL_ENTRY _ZTV7ee46362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46362[];
static VTBL_ENTRY alt_thunk_names1147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee463623barEv,_ZTv0_n16_N7ee463623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee463623barEv,_ZThn16_N7ee463623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46362 = {  "ee46362", // class name
  bases_ee46362, 4,
  &(vtc_ee46362[0]), // expected_vtbl_contents
  &(vtt_ee46362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1147,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56362  : virtual dd6362 {
  int e;
  virtual void  bar(); // _ZN7ee563623barEv
  ~ee56362(); // tgen
  ee56362(); // tgen
};
//SIG(1 ee56362) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee56362 ::bar(){vfunc_called(this, "_ZN7ee563623barEv");}
ee56362 ::~ee56362(){ note_dtor("ee56362", this);} // tgen
ee56362 ::ee56362(){ note_ctor("ee56362", this);} // tgen

static void Test_ee56362()
{
  extern Class_Descriptor cd_ee56362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56362, buf);
    ee56362 *dp, &lv = *(dp=new (buf) ee56362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee56362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(32,20), "ee56362");
    check_base_class_offset(lv, (cc362*)(dd6362*), ABISELECT(16,8), "ee56362");
    check_base_class_offset(lv, (dd6362*), ABISELECT(16,8), "ee56362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56362.e");
    test_class_info(&lv, &cd_ee56362);
    dp->~ee56362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56362(Test_ee56362, "ee56362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56362C1Ev();
extern void _ZN7ee56362D1Ev();
Name_Map name_map_ee56362[] = {
  NSPAIR(_ZN7ee56362C1Ev),
  NSPAIR(_ZN7ee56362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee56362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56362[];
extern void _ZN7ee563623barEv();
extern void _ZN6dd63623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee563623barEv,_ZTv0_n20_N7ee563623barEv)();
extern void ABISELECT(_ZThn16_N7ee563623barEv,_ZThn8_N7ee563623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee563623barEv,_ZTv0_n16_N7ee563623barEv)();
extern void ABISELECT(_ZThn32_N7ee563623barEv,_ZThn20_N7ee563623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56362[0]),
  (VTBL_ENTRY)&_ZN7ee563623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee563623barEv,_ZTv0_n20_N7ee563623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee563623barEv,_ZTv0_n16_N7ee563623barEv),
};
extern VTBL_ENTRY _ZTV7ee56362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee56362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee56362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee56362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee56362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee56362[] = {
  {&(_ZTV7ee56362[4]),  4,18},
  {&(_ZTV7ee56362[10]),  10,18},
  {&(_ZTV7ee56362[16]),  16,18},
  {&(_tg__ZTV6dd6362__7ee56362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee56362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee56362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee56362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56362[];
extern  VTBL_ENTRY _ZTV7ee56362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56362[];
static VTBL_ENTRY alt_thunk_names1148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee563623barEv,_ZTv0_n16_N7ee563623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee563623barEv,_ZThn20_N7ee563623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee563623barEv,_ZTv0_n20_N7ee563623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee563623barEv,_ZThn8_N7ee563623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56362 = {  "ee56362", // class name
  bases_ee56362, 4,
  &(vtc_ee56362[0]), // expected_vtbl_contents
  &(vtt_ee56362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56362),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1148,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66362  : dd6362 {
  int e;
  virtual void  foo(); // _ZN7ee663623fooEv
  virtual void  bar(); // _ZN7ee663623barEv
  ~ee66362(); // tgen
  ee66362(); // tgen
};
//SIG(1 ee66362) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66362 ::foo(){vfunc_called(this, "_ZN7ee663623fooEv");}
void  ee66362 ::bar(){vfunc_called(this, "_ZN7ee663623barEv");}
ee66362 ::~ee66362(){ note_dtor("ee66362", this);} // tgen
ee66362 ::ee66362(){ note_ctor("ee66362", this);} // tgen

static void Test_ee66362()
{
  extern Class_Descriptor cd_ee66362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66362, buf);
    ee66362 *dp, &lv = *(dp=new (buf) ee66362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee66362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(24,16), "ee66362");
    check_base_class_offset(lv, (cc362*)(dd6362*), 0, "ee66362");
    check_base_class_offset(lv, (dd6362*), 0, "ee66362");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66362.e");
    test_class_info(&lv, &cd_ee66362);
    dp->~ee66362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66362(Test_ee66362, "ee66362", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66362C1Ev();
extern void _ZN7ee66362D1Ev();
Name_Map name_map_ee66362[] = {
  NSPAIR(_ZN7ee66362C1Ev),
  NSPAIR(_ZN7ee66362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee66362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66362[];
extern void _ZN7ee663623fooEv();
extern void _ZN7ee663623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee663623fooEv,_ZTv0_n12_N7ee663623fooEv)();
extern void ABISELECT(_ZThn24_N7ee663623fooEv,_ZThn16_N7ee663623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee663623barEv,_ZTv0_n16_N7ee663623barEv)();
extern void ABISELECT(_ZThn24_N7ee663623barEv,_ZThn16_N7ee663623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66362[0]),
  (VTBL_ENTRY)&_ZN7ee663623fooEv,
  (VTBL_ENTRY)&_ZN7ee663623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee663623fooEv,_ZTv0_n12_N7ee663623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee663623barEv,_ZTv0_n16_N7ee663623barEv),
};
extern VTBL_ENTRY _ZTV7ee66362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee66362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee66362[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee66362[] = {
  0,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee66362[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee66362[] = {
  {&(_ZTV7ee66362[3]),  3,11},
  {&(_tg__ZTV6dd6362__7ee66362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee66362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee66362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee66362[4]),  4,6},
  {&(_ZTV7ee66362[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66362[];
extern  VTBL_ENTRY _ZTV7ee66362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66362[];
static VTBL_ENTRY alt_thunk_names1149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623barEv,_ZThn16_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd63623fooEv,_ZThn16_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc3623fooEv,_ZThn16_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee663623barEv,_ZTv0_n16_N7ee663623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee663623barEv,_ZThn16_N7ee663623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee663623fooEv,_ZTv0_n12_N7ee663623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee663623fooEv,_ZThn16_N7ee663623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66362 = {  "ee66362", // class name
  bases_ee66362, 4,
  &(vtc_ee66362[0]), // expected_vtbl_contents
  &(vtt_ee66362[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66362),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66362),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1149,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76362  : virtual dd6362 {
  int e;
  virtual void  foo(); // _ZN7ee763623fooEv
  virtual void  bar(); // _ZN7ee763623barEv
  ~ee76362(); // tgen
  ee76362(); // tgen
};
//SIG(1 ee76362) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76362 ::foo(){vfunc_called(this, "_ZN7ee763623fooEv");}
void  ee76362 ::bar(){vfunc_called(this, "_ZN7ee763623barEv");}
ee76362 ::~ee76362(){ note_dtor("ee76362", this);} // tgen
ee76362 ::ee76362(){ note_ctor("ee76362", this);} // tgen

static void Test_ee76362()
{
  extern Class_Descriptor cd_ee76362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76362, buf);
    ee76362 *dp, &lv = *(dp=new (buf) ee76362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee76362");
    check_base_class_offset(lv, (bb62*)(cc362*)(dd6362*), ABISELECT(32,20), "ee76362");
    check_base_class_offset(lv, (cc362*)(dd6362*), ABISELECT(16,8), "ee76362");
    check_base_class_offset(lv, (dd6362*), ABISELECT(16,8), "ee76362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76362.e");
    test_class_info(&lv, &cd_ee76362);
    dp->~ee76362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76362(Test_ee76362, "ee76362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76362C1Ev();
extern void _ZN7ee76362D1Ev();
Name_Map name_map_ee76362[] = {
  NSPAIR(_ZN7ee76362C1Ev),
  NSPAIR(_ZN7ee76362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd6362;
extern VTBL_ENTRY _ZTI6dd6362[];
extern  VTBL_ENTRY _ZTV6dd6362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6362[];
static Base_Class bases_ee76362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc362,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76362[];
extern void _ZN7ee763623fooEv();
extern void _ZN7ee763623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee763623fooEv,_ZTv0_n16_N7ee763623fooEv)();
extern void ABISELECT(_ZThn16_N7ee763623fooEv,_ZThn8_N7ee763623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee763623barEv,_ZTv0_n20_N7ee763623barEv)();
extern void ABISELECT(_ZThn16_N7ee763623barEv,_ZThn8_N7ee763623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee763623fooEv,_ZTv0_n12_N7ee763623fooEv)();
extern void ABISELECT(_ZThn32_N7ee763623fooEv,_ZThn20_N7ee763623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee763623barEv,_ZTv0_n16_N7ee763623barEv)();
extern void ABISELECT(_ZThn32_N7ee763623barEv,_ZThn20_N7ee763623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76362[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76362[0]),
  (VTBL_ENTRY)&_ZN7ee763623fooEv,
  (VTBL_ENTRY)&_ZN7ee763623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee763623fooEv,_ZTv0_n16_N7ee763623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee763623barEv,_ZTv0_n20_N7ee763623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee763623fooEv,_ZTv0_n12_N7ee763623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee763623barEv,_ZTv0_n16_N7ee763623barEv),
};
extern VTBL_ENTRY _ZTV7ee76362[];
extern void _ZN6dd63623fooEv();
extern void _ZN6dd63623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6362__7ee76362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&_ZN6dd63623fooEv,
  (VTBL_ENTRY)&_ZN6dd63623barEv,
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc3626dd6362__7ee76362[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc3626dd6362__7ee76362[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv)();
extern void ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv)();
extern void ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6362__7ee76362[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv),
};
static  VTT_ENTRY vtt_ee76362[] = {
  {&(_ZTV7ee76362[4]),  4,19},
  {&(_ZTV7ee76362[11]),  11,19},
  {&(_ZTV7ee76362[17]),  17,19},
  {&(_tg__ZTV6dd6362__7ee76362[3]),  3,5},
  {&(_tg__ZTV5cc3626dd6362__7ee76362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc3626dd6362__7ee76362[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6362__7ee76362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76362[];
extern  VTBL_ENTRY _ZTV7ee76362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76362[];
static VTBL_ENTRY alt_thunk_names1150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd63623barEv,_ZTv0_n16_N6dd63623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623barEv,_ZThn12_N6dd63623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd63623fooEv,_ZTv0_n12_N6dd63623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd63623fooEv,_ZThn12_N6dd63623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn12_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee763623barEv,_ZTv0_n16_N7ee763623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee763623barEv,_ZThn20_N7ee763623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee763623fooEv,_ZTv0_n12_N7ee763623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee763623fooEv,_ZThn20_N7ee763623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee763623barEv,_ZTv0_n20_N7ee763623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee763623barEv,_ZThn8_N7ee763623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee763623fooEv,_ZTv0_n16_N7ee763623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee763623fooEv,_ZThn8_N7ee763623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76362 = {  "ee76362", // class name
  bases_ee76362, 4,
  &(vtc_ee76362[0]), // expected_vtbl_contents
  &(vtt_ee76362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76362),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76362),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1150,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7362  : virtual cc362 {
  int d;
  virtual void  bar(); // _ZN6dd73623barEv
  virtual void  foo(); // _ZN6dd73623fooEv
  ~dd7362(); // tgen
  dd7362(); // tgen
};
//SIG(-1 dd7362) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  dd7362 ::bar(){vfunc_called(this, "_ZN6dd73623barEv");}
void  dd7362 ::foo(){vfunc_called(this, "_ZN6dd73623fooEv");}
dd7362 ::~dd7362(){ note_dtor("dd7362", this);} // tgen
dd7362 ::dd7362(){ note_ctor("dd7362", this);} // tgen

static void Test_dd7362()
{
  extern Class_Descriptor cd_dd7362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7362, buf);
    dd7362 *dp, &lv = *(dp=new (buf) dd7362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd7362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,16), "dd7362");
    check_base_class_offset(lv, (cc362*), ABISELECT(16,8), "dd7362");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7362.d");
    test_class_info(&lv, &cd_dd7362);
    dp->~dd7362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7362(Test_dd7362, "dd7362", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7362C1Ev();
extern void _ZN6dd7362D1Ev();
Name_Map name_map_dd7362[] = {
  NSPAIR(_ZN6dd7362C1Ev),
  NSPAIR(_ZN6dd7362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
static Base_Class bases_dd7362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc362,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern VTBL_ENTRY _ZTV6dd7362[];
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__6dd7362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_dd7362[] = {
  {&(_ZTV6dd7362[4]),  4,17},
  {&(_ZTV6dd7362[10]),  10,17},
  {&(_ZTV6dd7362[15]),  15,17},
  {&(_tg__ZTV5cc362__6dd7362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__6dd7362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static VTBL_ENTRY alt_thunk_names1151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7362 = {  "dd7362", // class name
  bases_dd7362, 3,
  &(vtc_dd7362[0]), // expected_vtbl_contents
  &(vtt_dd7362[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7362),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1151,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07362  : dd7362 {
  int e;
  ~ee07362(); // tgen
  ee07362(); // tgen
};
//SIG(1 ee07362) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee07362 ::~ee07362(){ note_dtor("ee07362", this);} // tgen
ee07362 ::ee07362(){ note_ctor("ee07362", this);} // tgen

static void Test_ee07362()
{
  extern Class_Descriptor cd_ee07362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07362, buf);
    ee07362 *dp, &lv = *(dp=new (buf) ee07362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee07362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee07362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(16,12), "ee07362");
    check_base_class_offset(lv, (dd7362*), 0, "ee07362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07362.e");
    test_class_info(&lv, &cd_ee07362);
    dp->~ee07362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07362(Test_ee07362, "ee07362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07362C1Ev();
extern void _ZN7ee07362D1Ev();
Name_Map name_map_ee07362[] = {
  NSPAIR(_ZN7ee07362C1Ev),
  NSPAIR(_ZN7ee07362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee07362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern VTBL_ENTRY _ZTV7ee07362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee07362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee07362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee07362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee07362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee07362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee07362[] = {
  {&(_ZTV7ee07362[4]),  4,17},
  {&(_tg__ZTV6dd7362__7ee07362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee07362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee07362[4]),  4,6},
  {&(_ZTV7ee07362[10]),  10,17},
  {&(_ZTV7ee07362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee07362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee07362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07362[];
extern  VTBL_ENTRY _ZTV7ee07362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07362[];
static VTBL_ENTRY alt_thunk_names1152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07362 = {  "ee07362", // class name
  bases_ee07362, 4,
  &(vtc_ee07362[0]), // expected_vtbl_contents
  &(vtt_ee07362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1152,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17362  : virtual dd7362 {
  int e;
  ~ee17362(); // tgen
  ee17362(); // tgen
};
//SIG(1 ee17362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} Fi}


ee17362 ::~ee17362(){ note_dtor("ee17362", this);} // tgen
ee17362 ::ee17362(){ note_ctor("ee17362", this);} // tgen

static void Test_ee17362()
{
  extern Class_Descriptor cd_ee17362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17362, buf);
    ee17362 *dp, &lv = *(dp=new (buf) ee17362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee17362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee17362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(32,16), "ee17362");
    check_base_class_offset(lv, (dd7362*), ABISELECT(16,8), "ee17362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17362.e");
    test_class_info(&lv, &cd_ee17362);
    dp->~ee17362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17362(Test_ee17362, "ee17362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17362C1Ev();
extern void _ZN7ee17362D1Ev();
Name_Map name_map_ee17362[] = {
  NSPAIR(_ZN7ee17362C1Ev),
  NSPAIR(_ZN7ee17362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee17362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17362[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern VTBL_ENTRY _ZTV7ee17362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee17362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee17362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee17362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee17362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee17362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee17362[] = {
  {&(_ZTV7ee17362[5]),  5,24},
  {&(_ZTV7ee17362[11]),  11,24},
  {&(_ZTV7ee17362[17]),  17,24},
  {&(_ZTV7ee17362[22]),  22,24},
  {&(_tg__ZTV6dd7362__7ee17362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee17362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee17362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee17362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee17362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17362[];
extern  VTBL_ENTRY _ZTV7ee17362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17362[];
static VTBL_ENTRY alt_thunk_names1153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17362 = {  "ee17362", // class name
  bases_ee17362, 4,
  &(vtc_ee17362[0]), // expected_vtbl_contents
  &(vtt_ee17362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17362),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1153,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27362  : dd7362 {
  int e;
  virtual void  foo(); // _ZN7ee273623fooEv
  ~ee27362(); // tgen
  ee27362(); // tgen
};
//SIG(1 ee27362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee27362 ::foo(){vfunc_called(this, "_ZN7ee273623fooEv");}
ee27362 ::~ee27362(){ note_dtor("ee27362", this);} // tgen
ee27362 ::ee27362(){ note_ctor("ee27362", this);} // tgen

static void Test_ee27362()
{
  extern Class_Descriptor cd_ee27362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27362, buf);
    ee27362 *dp, &lv = *(dp=new (buf) ee27362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee27362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee27362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(16,12), "ee27362");
    check_base_class_offset(lv, (dd7362*), 0, "ee27362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27362.e");
    test_class_info(&lv, &cd_ee27362);
    dp->~ee27362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27362(Test_ee27362, "ee27362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27362C1Ev();
extern void _ZN7ee27362D1Ev();
Name_Map name_map_ee27362[] = {
  NSPAIR(_ZN7ee27362C1Ev),
  NSPAIR(_ZN7ee27362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee27362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27362[];
extern void _ZN6dd73623barEv();
extern void _ZN7ee273623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee273623fooEv,_ZTv0_n16_N7ee273623fooEv)();
extern void ABISELECT(_ZThn16_N7ee273623fooEv,_ZThn12_N7ee273623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee273623fooEv,_ZTv0_n12_N7ee273623fooEv)();
extern void ABISELECT(_ZThn32_N7ee273623fooEv,_ZThn20_N7ee273623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN7ee273623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee273623fooEv,_ZTv0_n16_N7ee273623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee273623fooEv,_ZTv0_n12_N7ee273623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern VTBL_ENTRY _ZTV7ee27362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee27362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee27362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee27362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee27362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee27362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee27362[] = {
  {&(_ZTV7ee27362[4]),  4,17},
  {&(_tg__ZTV6dd7362__7ee27362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee27362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee27362[4]),  4,6},
  {&(_ZTV7ee27362[10]),  10,17},
  {&(_ZTV7ee27362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee27362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee27362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27362[];
extern  VTBL_ENTRY _ZTV7ee27362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27362[];
static VTBL_ENTRY alt_thunk_names1154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee273623fooEv,_ZTv0_n12_N7ee273623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee273623fooEv,_ZThn20_N7ee273623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee273623fooEv,_ZTv0_n16_N7ee273623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee273623fooEv,_ZThn12_N7ee273623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27362 = {  "ee27362", // class name
  bases_ee27362, 4,
  &(vtc_ee27362[0]), // expected_vtbl_contents
  &(vtt_ee27362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1154,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37362  : virtual dd7362 {
  int e;
  virtual void  foo(); // _ZN7ee373623fooEv
  ~ee37362(); // tgen
  ee37362(); // tgen
};
//SIG(1 ee37362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 Fi}


void  ee37362 ::foo(){vfunc_called(this, "_ZN7ee373623fooEv");}
ee37362 ::~ee37362(){ note_dtor("ee37362", this);} // tgen
ee37362 ::ee37362(){ note_ctor("ee37362", this);} // tgen

static void Test_ee37362()
{
  extern Class_Descriptor cd_ee37362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37362, buf);
    ee37362 *dp, &lv = *(dp=new (buf) ee37362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee37362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee37362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(32,16), "ee37362");
    check_base_class_offset(lv, (dd7362*), ABISELECT(16,8), "ee37362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37362.e");
    test_class_info(&lv, &cd_ee37362);
    dp->~ee37362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37362(Test_ee37362, "ee37362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37362C1Ev();
extern void _ZN7ee37362D1Ev();
Name_Map name_map_ee37362[] = {
  NSPAIR(_ZN7ee37362C1Ev),
  NSPAIR(_ZN7ee37362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee37362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37362[];
extern void _ZN7ee373623fooEv();
extern void _ZN6dd73623barEv();
extern void ABISELECT(_ZTv0_n48_N7ee373623fooEv,_ZTv0_n24_N7ee373623fooEv)();
extern void ABISELECT(_ZThn16_N7ee373623fooEv,_ZThn8_N7ee373623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee373623fooEv,_ZTv0_n16_N7ee373623fooEv)();
extern void ABISELECT(_ZThn32_N7ee373623fooEv,_ZThn16_N7ee373623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee373623fooEv,_ZTv0_n12_N7ee373623fooEv)();
extern void ABISELECT(_ZThn48_N7ee373623fooEv,_ZThn24_N7ee373623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37362[0]),
  (VTBL_ENTRY)&_ZN7ee373623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee373623fooEv,_ZTv0_n24_N7ee373623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee373623fooEv,_ZTv0_n16_N7ee373623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee373623fooEv,_ZTv0_n12_N7ee373623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern VTBL_ENTRY _ZTV7ee37362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee37362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee37362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee37362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee37362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee37362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee37362[] = {
  {&(_ZTV7ee37362[5]),  5,25},
  {&(_ZTV7ee37362[12]),  12,25},
  {&(_ZTV7ee37362[18]),  18,25},
  {&(_ZTV7ee37362[23]),  23,25},
  {&(_tg__ZTV6dd7362__7ee37362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee37362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee37362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee37362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee37362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37362[];
extern  VTBL_ENTRY _ZTV7ee37362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37362[];
static VTBL_ENTRY alt_thunk_names1155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee373623fooEv,_ZTv0_n12_N7ee373623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee373623fooEv,_ZThn24_N7ee373623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee373623fooEv,_ZTv0_n16_N7ee373623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee373623fooEv,_ZThn16_N7ee373623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee373623fooEv,_ZTv0_n24_N7ee373623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee373623fooEv,_ZThn8_N7ee373623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37362 = {  "ee37362", // class name
  bases_ee37362, 4,
  &(vtc_ee37362[0]), // expected_vtbl_contents
  &(vtt_ee37362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37362),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1155,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47362  : dd7362 {
  int e;
  virtual void  bar(); // _ZN7ee473623barEv
  ~ee47362(); // tgen
  ee47362(); // tgen
};
//SIG(1 ee47362) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee47362 ::bar(){vfunc_called(this, "_ZN7ee473623barEv");}
ee47362 ::~ee47362(){ note_dtor("ee47362", this);} // tgen
ee47362 ::ee47362(){ note_ctor("ee47362", this);} // tgen

static void Test_ee47362()
{
  extern Class_Descriptor cd_ee47362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47362, buf);
    ee47362 *dp, &lv = *(dp=new (buf) ee47362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee47362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee47362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(16,12), "ee47362");
    check_base_class_offset(lv, (dd7362*), 0, "ee47362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47362.e");
    test_class_info(&lv, &cd_ee47362);
    dp->~ee47362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47362(Test_ee47362, "ee47362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47362C1Ev();
extern void _ZN7ee47362D1Ev();
Name_Map name_map_ee47362[] = {
  NSPAIR(_ZN7ee47362C1Ev),
  NSPAIR(_ZN7ee47362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee47362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47362[];
extern void _ZN7ee473623barEv();
extern void _ZN6dd73623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee473623barEv,_ZTv0_n16_N7ee473623barEv)();
extern void ABISELECT(_ZThn32_N7ee473623barEv,_ZThn20_N7ee473623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47362[0]),
  (VTBL_ENTRY)&_ZN7ee473623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee473623barEv,_ZTv0_n16_N7ee473623barEv),
};
extern VTBL_ENTRY _ZTV7ee47362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee47362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee47362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee47362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee47362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee47362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee47362[] = {
  {&(_ZTV7ee47362[4]),  4,17},
  {&(_tg__ZTV6dd7362__7ee47362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee47362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee47362[4]),  4,6},
  {&(_ZTV7ee47362[10]),  10,17},
  {&(_ZTV7ee47362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee47362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee47362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47362[];
extern  VTBL_ENTRY _ZTV7ee47362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47362[];
static VTBL_ENTRY alt_thunk_names1156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee473623barEv,_ZTv0_n16_N7ee473623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee473623barEv,_ZThn20_N7ee473623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47362 = {  "ee47362", // class name
  bases_ee47362, 4,
  &(vtc_ee47362[0]), // expected_vtbl_contents
  &(vtt_ee47362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1156,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57362  : virtual dd7362 {
  int e;
  virtual void  bar(); // _ZN7ee573623barEv
  ~ee57362(); // tgen
  ee57362(); // tgen
};
//SIG(1 ee57362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi} v1 Fi}


void  ee57362 ::bar(){vfunc_called(this, "_ZN7ee573623barEv");}
ee57362 ::~ee57362(){ note_dtor("ee57362", this);} // tgen
ee57362 ::ee57362(){ note_ctor("ee57362", this);} // tgen

static void Test_ee57362()
{
  extern Class_Descriptor cd_ee57362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57362, buf);
    ee57362 *dp, &lv = *(dp=new (buf) ee57362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee57362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee57362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(32,16), "ee57362");
    check_base_class_offset(lv, (dd7362*), ABISELECT(16,8), "ee57362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57362.e");
    test_class_info(&lv, &cd_ee57362);
    dp->~ee57362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57362(Test_ee57362, "ee57362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57362C1Ev();
extern void _ZN7ee57362D1Ev();
Name_Map name_map_ee57362[] = {
  NSPAIR(_ZN7ee57362C1Ev),
  NSPAIR(_ZN7ee57362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee57362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc362,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57362[];
extern void _ZN7ee573623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee573623barEv,_ZTv0_n20_N7ee573623barEv)();
extern void ABISELECT(_ZThn16_N7ee573623barEv,_ZThn8_N7ee573623barEv)() __attribute__((weak));
extern void _ZN6dd73623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee573623barEv,_ZTv0_n16_N7ee573623barEv)();
extern void ABISELECT(_ZThn48_N7ee573623barEv,_ZThn24_N7ee573623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57362[0]),
  (VTBL_ENTRY)&_ZN7ee573623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee573623barEv,_ZTv0_n20_N7ee573623barEv),
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee573623barEv,_ZTv0_n16_N7ee573623barEv),
};
extern VTBL_ENTRY _ZTV7ee57362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee57362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee57362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee57362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee57362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee57362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee57362[] = {
  {&(_ZTV7ee57362[5]),  5,25},
  {&(_ZTV7ee57362[12]),  12,25},
  {&(_ZTV7ee57362[18]),  18,25},
  {&(_ZTV7ee57362[23]),  23,25},
  {&(_tg__ZTV6dd7362__7ee57362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee57362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee57362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee57362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee57362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57362[];
extern  VTBL_ENTRY _ZTV7ee57362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57362[];
static VTBL_ENTRY alt_thunk_names1157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee573623barEv,_ZTv0_n16_N7ee573623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee573623barEv,_ZThn24_N7ee573623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee573623barEv,_ZTv0_n20_N7ee573623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee573623barEv,_ZThn8_N7ee573623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57362 = {  "ee57362", // class name
  bases_ee57362, 4,
  &(vtc_ee57362[0]), // expected_vtbl_contents
  &(vtt_ee57362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57362),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1157,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67362  : dd7362 {
  int e;
  virtual void  foo(); // _ZN7ee673623fooEv
  virtual void  bar(); // _ZN7ee673623barEv
  ~ee67362(); // tgen
  ee67362(); // tgen
};
//SIG(1 ee67362) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67362 ::foo(){vfunc_called(this, "_ZN7ee673623fooEv");}
void  ee67362 ::bar(){vfunc_called(this, "_ZN7ee673623barEv");}
ee67362 ::~ee67362(){ note_dtor("ee67362", this);} // tgen
ee67362 ::ee67362(){ note_ctor("ee67362", this);} // tgen

static void Test_ee67362()
{
  extern Class_Descriptor cd_ee67362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67362, buf);
    ee67362 *dp, &lv = *(dp=new (buf) ee67362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee67362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(32,20), "ee67362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(16,12), "ee67362");
    check_base_class_offset(lv, (dd7362*), 0, "ee67362");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67362.e");
    test_class_info(&lv, &cd_ee67362);
    dp->~ee67362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67362(Test_ee67362, "ee67362", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67362C1Ev();
extern void _ZN7ee67362D1Ev();
Name_Map name_map_ee67362[] = {
  NSPAIR(_ZN7ee67362C1Ev),
  NSPAIR(_ZN7ee67362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee67362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67362[];
extern void _ZN7ee673623barEv();
extern void _ZN7ee673623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee673623fooEv,_ZTv0_n16_N7ee673623fooEv)();
extern void ABISELECT(_ZThn16_N7ee673623fooEv,_ZThn12_N7ee673623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee673623fooEv,_ZTv0_n12_N7ee673623fooEv)();
extern void ABISELECT(_ZThn32_N7ee673623fooEv,_ZThn20_N7ee673623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee673623barEv,_ZTv0_n16_N7ee673623barEv)();
extern void ABISELECT(_ZThn32_N7ee673623barEv,_ZThn20_N7ee673623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67362[0]),
  (VTBL_ENTRY)&_ZN7ee673623barEv,
  (VTBL_ENTRY)&_ZN7ee673623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee673623fooEv,_ZTv0_n16_N7ee673623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee673623fooEv,_ZTv0_n12_N7ee673623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee673623barEv,_ZTv0_n16_N7ee673623barEv),
};
extern VTBL_ENTRY _ZTV7ee67362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee67362[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee67362[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee67362[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee67362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee67362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee67362[] = {
  {&(_ZTV7ee67362[4]),  4,17},
  {&(_tg__ZTV6dd7362__7ee67362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee67362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee67362[4]),  4,6},
  {&(_ZTV7ee67362[10]),  10,17},
  {&(_ZTV7ee67362[15]),  15,17},
  {&(_tg__ZTV5cc362__7ee67362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee67362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67362[];
extern  VTBL_ENTRY _ZTV7ee67362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67362[];
static VTBL_ENTRY alt_thunk_names1158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn20_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn20_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn12_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee673623barEv,_ZTv0_n16_N7ee673623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee673623barEv,_ZThn20_N7ee673623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee673623fooEv,_ZTv0_n12_N7ee673623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee673623fooEv,_ZThn20_N7ee673623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee673623fooEv,_ZTv0_n16_N7ee673623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee673623fooEv,_ZThn12_N7ee673623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67362 = {  "ee67362", // class name
  bases_ee67362, 4,
  &(vtc_ee67362[0]), // expected_vtbl_contents
  &(vtt_ee67362[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67362),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67362),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67362),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1158,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77362  : virtual dd7362 {
  int e;
  virtual void  foo(); // _ZN7ee773623fooEv
  virtual void  bar(); // _ZN7ee773623barEv
  ~ee77362(); // tgen
  ee77362(); // tgen
};
//SIG(1 ee77362) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77362 ::foo(){vfunc_called(this, "_ZN7ee773623fooEv");}
void  ee77362 ::bar(){vfunc_called(this, "_ZN7ee773623barEv");}
ee77362 ::~ee77362(){ note_dtor("ee77362", this);} // tgen
ee77362 ::ee77362(){ note_ctor("ee77362", this);} // tgen

static void Test_ee77362()
{
  extern Class_Descriptor cd_ee77362;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77362, buf);
    ee77362 *dp, &lv = *(dp=new (buf) ee77362());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77362)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77362)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee77362");
    check_base_class_offset(lv, (bb62*)(cc362*), ABISELECT(48,24), "ee77362");
    check_base_class_offset(lv, (cc362*)(dd7362*), ABISELECT(32,16), "ee77362");
    check_base_class_offset(lv, (dd7362*), ABISELECT(16,8), "ee77362");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77362.e");
    test_class_info(&lv, &cd_ee77362);
    dp->~ee77362();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77362(Test_ee77362, "ee77362", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77362C1Ev();
extern void _ZN7ee77362D1Ev();
Name_Map name_map_ee77362[] = {
  NSPAIR(_ZN7ee77362C1Ev),
  NSPAIR(_ZN7ee77362D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc362;
extern VTBL_ENTRY _ZTI5cc362[];
extern  VTBL_ENTRY _ZTV5cc362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc362[];
extern Class_Descriptor cd_dd7362;
extern VTBL_ENTRY _ZTI6dd7362[];
extern  VTBL_ENTRY _ZTV6dd7362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7362[];
static Base_Class bases_ee77362[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc362,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7362,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77362[];
extern void _ZN7ee773623fooEv();
extern void _ZN7ee773623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee773623barEv,_ZTv0_n20_N7ee773623barEv)();
extern void ABISELECT(_ZThn16_N7ee773623barEv,_ZThn8_N7ee773623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee773623fooEv,_ZTv0_n24_N7ee773623fooEv)();
extern void ABISELECT(_ZThn16_N7ee773623fooEv,_ZThn8_N7ee773623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee773623fooEv,_ZTv0_n16_N7ee773623fooEv)();
extern void ABISELECT(_ZThn32_N7ee773623fooEv,_ZThn16_N7ee773623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee773623fooEv,_ZTv0_n12_N7ee773623fooEv)();
extern void ABISELECT(_ZThn48_N7ee773623fooEv,_ZThn24_N7ee773623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee773623barEv,_ZTv0_n16_N7ee773623barEv)();
extern void ABISELECT(_ZThn48_N7ee773623barEv,_ZThn24_N7ee773623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77362[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77362[0]),
  (VTBL_ENTRY)&_ZN7ee773623fooEv,
  (VTBL_ENTRY)&_ZN7ee773623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee773623barEv,_ZTv0_n20_N7ee773623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee773623fooEv,_ZTv0_n24_N7ee773623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee773623fooEv,_ZTv0_n16_N7ee773623fooEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee773623fooEv,_ZTv0_n12_N7ee773623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee773623barEv,_ZTv0_n16_N7ee773623barEv),
};
extern VTBL_ENTRY _ZTV7ee77362[];
extern void _ZN6dd73623barEv();
extern void _ZN6dd73623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7362__7ee77362[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&_ZN6dd73623barEv,
  (VTBL_ENTRY)&_ZN6dd73623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv)();
extern void ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc362__6dd7362__7ee77362[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv)();
extern void ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv)();
extern void ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7362__7ee77362[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv),
};
extern void _ZN5cc3623fooEv();
static  VTBL_ENTRY _tg__ZTV5cc362__7ee77362[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&_ZN5cc3623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv)();
extern void ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv)() __attribute__((weak));
extern void _ZN4bb623barEv();
static  VTBL_ENTRY _tg__ZTV4bb62__5cc362__7ee77362[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc362[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv),
  (VTBL_ENTRY)&_ZN4bb623barEv,
};
static  VTT_ENTRY vtt_ee77362[] = {
  {&(_ZTV7ee77362[5]),  5,26},
  {&(_ZTV7ee77362[13]),  13,26},
  {&(_ZTV7ee77362[19]),  19,26},
  {&(_ZTV7ee77362[24]),  24,26},
  {&(_tg__ZTV6dd7362__7ee77362[4]),  4,6},
  {&(_tg__ZTV5cc362__6dd7362__7ee77362[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7362__7ee77362[4]),  4,6},
  {&(_tg__ZTV5cc362__7ee77362[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc362__7ee77362[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77362[];
extern  VTBL_ENTRY _ZTV7ee77362[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77362[];
static VTBL_ENTRY alt_thunk_names1159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc3623fooEv,_ZTv0_n12_N5cc3623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc3623fooEv,_ZThn8_N5cc3623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623barEv,_ZTv0_n16_N6dd73623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623barEv,_ZThn16_N6dd73623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd73623fooEv,_ZTv0_n12_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd73623fooEv,_ZThn16_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd73623fooEv,_ZTv0_n16_N6dd73623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd73623fooEv,_ZThn8_N6dd73623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee773623barEv,_ZTv0_n16_N7ee773623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee773623barEv,_ZThn24_N7ee773623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee773623fooEv,_ZTv0_n12_N7ee773623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee773623fooEv,_ZThn24_N7ee773623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee773623fooEv,_ZTv0_n16_N7ee773623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee773623fooEv,_ZThn16_N7ee773623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee773623fooEv,_ZTv0_n24_N7ee773623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee773623fooEv,_ZThn8_N7ee773623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee773623barEv,_ZTv0_n20_N7ee773623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee773623barEv,_ZThn8_N7ee773623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77362 = {  "ee77362", // class name
  bases_ee77362, 4,
  &(vtc_ee77362[0]), // expected_vtbl_contents
  &(vtt_ee77362[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77362),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77362),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77362),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1159,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc462  : bb62 {
  int c;
  virtual void  bar(); // _ZN5cc4623barEv
  ~cc462(); // tgen
  cc462(); // tgen
};
//SIG(-1 cc462) C1{ BC2{ BC3{ v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  cc462 ::bar(){vfunc_called(this, "_ZN5cc4623barEv");}
cc462 ::~cc462(){ note_dtor("cc462", this);} // tgen
cc462 ::cc462(){ note_ctor("cc462", this);} // tgen

static void Test_cc462()
{
  extern Class_Descriptor cd_cc462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc462, buf);
    cc462 *dp, &lv = *(dp=new (buf) cc462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc462)");
    check_base_class_offset(lv, (aa2*)(bb62*), 0, "cc462");
    check_base_class_offset(lv, (bb62*), 0, "cc462");
    check_field_offset(lv, c, ABISELECT(16,12), "cc462.c");
    test_class_info(&lv, &cd_cc462);
    dp->~cc462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc462(Test_cc462, "cc462", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc462C1Ev();
extern void _ZN5cc462D1Ev();
Name_Map name_map_cc462[] = {
  NSPAIR(_ZN5cc462C1Ev),
  NSPAIR(_ZN5cc462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI5cc462[];
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_cc462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
Class_Descriptor cd_cc462 = {  "cc462", // class name
  bases_cc462, 2,
  &(vtc_cc462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc462),4, //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  dd0462  : cc462 {
  int d;
  ~dd0462(); // tgen
  dd0462(); // tgen
};
//SIG(-1 dd0462) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


dd0462 ::~dd0462(){ note_dtor("dd0462", this);} // tgen
dd0462 ::dd0462(){ note_ctor("dd0462", this);} // tgen

static void Test_dd0462()
{
  extern Class_Descriptor cd_dd0462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0462, buf);
    dd0462 *dp, &lv = *(dp=new (buf) dd0462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), 0, "dd0462");
    check_base_class_offset(lv, (bb62*)(cc462*), 0, "dd0462");
    check_base_class_offset(lv, (cc462*), 0, "dd0462");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0462.d");
    test_class_info(&lv, &cd_dd0462);
    dp->~dd0462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0462(Test_dd0462, "dd0462", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0462C1Ev();
extern void _ZN6dd0462D1Ev();
Name_Map name_map_dd0462[] = {
  NSPAIR(_ZN6dd0462C1Ev),
  NSPAIR(_ZN6dd0462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd0462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0462[];
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_dd0462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
Class_Descriptor cd_dd0462 = {  "dd0462", // class name
  bases_dd0462, 3,
  &(vtc_dd0462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0462),4, //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  ee00462  : dd0462 {
  int e;
  ~ee00462(); // tgen
  ee00462(); // tgen
};
//SIG(1 ee00462) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee00462 ::~ee00462(){ note_dtor("ee00462", this);} // tgen
ee00462 ::ee00462(){ note_ctor("ee00462", this);} // tgen

static void Test_ee00462()
{
  extern Class_Descriptor cd_ee00462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00462, buf);
    ee00462 *dp, &lv = *(dp=new (buf) ee00462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), 0, "ee00462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), 0, "ee00462");
    check_base_class_offset(lv, (cc462*)(dd0462*), 0, "ee00462");
    check_base_class_offset(lv, (dd0462*), 0, "ee00462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00462.e");
    test_class_info(&lv, &cd_ee00462);
    dp->~ee00462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00462(Test_ee00462, "ee00462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00462C1Ev();
extern void _ZN7ee00462D1Ev();
Name_Map name_map_ee00462[] = {
  NSPAIR(_ZN7ee00462C1Ev),
  NSPAIR(_ZN7ee00462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee00462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00462[];
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee00462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTI7ee00462[];
extern  VTBL_ENTRY _ZTV7ee00462[];
Class_Descriptor cd_ee00462 = {  "ee00462", // class name
  bases_ee00462, 4,
  &(vtc_ee00462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00462),4, //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  ee10462  : virtual dd0462 {
  int e;
  ~ee10462(); // tgen
  ee10462(); // tgen
};
//SIG(1 ee10462) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee10462 ::~ee10462(){ note_dtor("ee10462", this);} // tgen
ee10462 ::ee10462(){ note_ctor("ee10462", this);} // tgen

static void Test_ee10462()
{
  extern Class_Descriptor cd_ee10462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10462, buf);
    ee10462 *dp, &lv = *(dp=new (buf) ee10462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee10462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee10462");
    check_base_class_offset(lv, (cc462*)(dd0462*), ABISELECT(16,8), "ee10462");
    check_base_class_offset(lv, (dd0462*), ABISELECT(16,8), "ee10462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10462.e");
    test_class_info(&lv, &cd_ee10462);
    dp->~ee10462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10462(Test_ee10462, "ee10462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10462C1Ev();
extern void _ZN7ee10462D1Ev();
Name_Map name_map_ee10462[] = {
  NSPAIR(_ZN7ee10462C1Ev),
  NSPAIR(_ZN7ee10462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee10462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10462[];
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee10462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10462[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee10462[];
static  VTT_ENTRY vtt_ee10462[] = {
  {&(_ZTV7ee10462[3]),  3,9},
  {&(_ZTV7ee10462[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10462[];
extern  VTBL_ENTRY _ZTV7ee10462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10462[];
Class_Descriptor cd_ee10462 = {  "ee10462", // class name
  bases_ee10462, 4,
  &(vtc_ee10462[0]), // expected_vtbl_contents
  &(vtt_ee10462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10462),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10462),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  ee20462  : dd0462 {
  int e;
  virtual void  foo(); // _ZN7ee204623fooEv
  ~ee20462(); // tgen
  ee20462(); // tgen
};
//SIG(1 ee20462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee20462 ::foo(){vfunc_called(this, "_ZN7ee204623fooEv");}
ee20462 ::~ee20462(){ note_dtor("ee20462", this);} // tgen
ee20462 ::ee20462(){ note_ctor("ee20462", this);} // tgen

static void Test_ee20462()
{
  extern Class_Descriptor cd_ee20462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20462, buf);
    ee20462 *dp, &lv = *(dp=new (buf) ee20462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), 0, "ee20462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), 0, "ee20462");
    check_base_class_offset(lv, (cc462*)(dd0462*), 0, "ee20462");
    check_base_class_offset(lv, (dd0462*), 0, "ee20462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20462.e");
    test_class_info(&lv, &cd_ee20462);
    dp->~ee20462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20462(Test_ee20462, "ee20462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20462C1Ev();
extern void _ZN7ee20462D1Ev();
Name_Map name_map_ee20462[] = {
  NSPAIR(_ZN7ee20462C1Ev),
  NSPAIR(_ZN7ee20462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee20462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20462[];
extern void _ZN7ee204623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee20462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20462[0]),
  (VTBL_ENTRY)&_ZN7ee204623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTI7ee20462[];
extern  VTBL_ENTRY _ZTV7ee20462[];
Class_Descriptor cd_ee20462 = {  "ee20462", // class name
  bases_ee20462, 4,
  &(vtc_ee20462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20462),4, //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  ee30462  : virtual dd0462 {
  int e;
  virtual void  foo(); // _ZN7ee304623fooEv
  ~ee30462(); // tgen
  ee30462(); // tgen
};
//SIG(1 ee30462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee30462 ::foo(){vfunc_called(this, "_ZN7ee304623fooEv");}
ee30462 ::~ee30462(){ note_dtor("ee30462", this);} // tgen
ee30462 ::ee30462(){ note_ctor("ee30462", this);} // tgen

static void Test_ee30462()
{
  extern Class_Descriptor cd_ee30462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30462, buf);
    ee30462 *dp, &lv = *(dp=new (buf) ee30462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee30462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee30462");
    check_base_class_offset(lv, (cc462*)(dd0462*), ABISELECT(16,8), "ee30462");
    check_base_class_offset(lv, (dd0462*), ABISELECT(16,8), "ee30462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30462.e");
    test_class_info(&lv, &cd_ee30462);
    dp->~ee30462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30462(Test_ee30462, "ee30462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30462C1Ev();
extern void _ZN7ee30462D1Ev();
Name_Map name_map_ee30462[] = {
  NSPAIR(_ZN7ee30462C1Ev),
  NSPAIR(_ZN7ee30462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee30462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30462[];
extern void _ZN7ee304623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee304623fooEv,_ZTv0_n12_N7ee304623fooEv)();
extern void ABISELECT(_ZThn16_N7ee304623fooEv,_ZThn8_N7ee304623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee30462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30462[0]),
  (VTBL_ENTRY)&_ZN7ee304623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee304623fooEv,_ZTv0_n12_N7ee304623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee30462[];
static  VTT_ENTRY vtt_ee30462[] = {
  {&(_ZTV7ee30462[3]),  3,10},
  {&(_ZTV7ee30462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30462[];
extern  VTBL_ENTRY _ZTV7ee30462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30462[];
static VTBL_ENTRY alt_thunk_names1160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee304623fooEv,_ZTv0_n12_N7ee304623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee304623fooEv,_ZThn8_N7ee304623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30462 = {  "ee30462", // class name
  bases_ee30462, 4,
  &(vtc_ee30462[0]), // expected_vtbl_contents
  &(vtt_ee30462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1160,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40462  : dd0462 {
  int e;
  virtual void  bar(); // _ZN7ee404623barEv
  ~ee40462(); // tgen
  ee40462(); // tgen
};
//SIG(1 ee40462) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee40462 ::bar(){vfunc_called(this, "_ZN7ee404623barEv");}
ee40462 ::~ee40462(){ note_dtor("ee40462", this);} // tgen
ee40462 ::ee40462(){ note_ctor("ee40462", this);} // tgen

static void Test_ee40462()
{
  extern Class_Descriptor cd_ee40462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40462, buf);
    ee40462 *dp, &lv = *(dp=new (buf) ee40462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), 0, "ee40462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), 0, "ee40462");
    check_base_class_offset(lv, (cc462*)(dd0462*), 0, "ee40462");
    check_base_class_offset(lv, (dd0462*), 0, "ee40462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40462.e");
    test_class_info(&lv, &cd_ee40462);
    dp->~ee40462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40462(Test_ee40462, "ee40462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40462C1Ev();
extern void _ZN7ee40462D1Ev();
Name_Map name_map_ee40462[] = {
  NSPAIR(_ZN7ee40462C1Ev),
  NSPAIR(_ZN7ee40462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee40462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40462[];
extern void _ZN4bb623fooEv();
extern void _ZN7ee404623barEv();
static  VTBL_ENTRY vtc_ee40462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN7ee404623barEv,
};
extern VTBL_ENTRY _ZTI7ee40462[];
extern  VTBL_ENTRY _ZTV7ee40462[];
Class_Descriptor cd_ee40462 = {  "ee40462", // class name
  bases_ee40462, 4,
  &(vtc_ee40462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40462),4, //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  ee50462  : virtual dd0462 {
  int e;
  virtual void  bar(); // _ZN7ee504623barEv
  ~ee50462(); // tgen
  ee50462(); // tgen
};
//SIG(1 ee50462) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee50462 ::bar(){vfunc_called(this, "_ZN7ee504623barEv");}
ee50462 ::~ee50462(){ note_dtor("ee50462", this);} // tgen
ee50462 ::ee50462(){ note_ctor("ee50462", this);} // tgen

static void Test_ee50462()
{
  extern Class_Descriptor cd_ee50462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50462, buf);
    ee50462 *dp, &lv = *(dp=new (buf) ee50462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee50462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee50462");
    check_base_class_offset(lv, (cc462*)(dd0462*), ABISELECT(16,8), "ee50462");
    check_base_class_offset(lv, (dd0462*), ABISELECT(16,8), "ee50462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50462.e");
    test_class_info(&lv, &cd_ee50462);
    dp->~ee50462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50462(Test_ee50462, "ee50462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50462C1Ev();
extern void _ZN7ee50462D1Ev();
Name_Map name_map_ee50462[] = {
  NSPAIR(_ZN7ee50462C1Ev),
  NSPAIR(_ZN7ee50462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee50462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50462[];
extern void _ZN7ee504623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee504623barEv,_ZTv0_n16_N7ee504623barEv)();
extern void ABISELECT(_ZThn16_N7ee504623barEv,_ZThn8_N7ee504623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50462[0]),
  (VTBL_ENTRY)&_ZN7ee504623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee504623barEv,_ZTv0_n16_N7ee504623barEv),
};
extern VTBL_ENTRY _ZTV7ee50462[];
static  VTT_ENTRY vtt_ee50462[] = {
  {&(_ZTV7ee50462[3]),  3,10},
  {&(_ZTV7ee50462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50462[];
extern  VTBL_ENTRY _ZTV7ee50462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50462[];
static VTBL_ENTRY alt_thunk_names1161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee504623barEv,_ZTv0_n16_N7ee504623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee504623barEv,_ZThn8_N7ee504623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50462 = {  "ee50462", // class name
  bases_ee50462, 4,
  &(vtc_ee50462[0]), // expected_vtbl_contents
  &(vtt_ee50462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1161,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60462  : dd0462 {
  int e;
  virtual void  foo(); // _ZN7ee604623fooEv
  virtual void  bar(); // _ZN7ee604623barEv
  ~ee60462(); // tgen
  ee60462(); // tgen
};
//SIG(1 ee60462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee60462 ::foo(){vfunc_called(this, "_ZN7ee604623fooEv");}
void  ee60462 ::bar(){vfunc_called(this, "_ZN7ee604623barEv");}
ee60462 ::~ee60462(){ note_dtor("ee60462", this);} // tgen
ee60462 ::ee60462(){ note_ctor("ee60462", this);} // tgen

static void Test_ee60462()
{
  extern Class_Descriptor cd_ee60462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60462, buf);
    ee60462 *dp, &lv = *(dp=new (buf) ee60462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), 0, "ee60462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), 0, "ee60462");
    check_base_class_offset(lv, (cc462*)(dd0462*), 0, "ee60462");
    check_base_class_offset(lv, (dd0462*), 0, "ee60462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60462.e");
    test_class_info(&lv, &cd_ee60462);
    dp->~ee60462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60462(Test_ee60462, "ee60462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60462C1Ev();
extern void _ZN7ee60462D1Ev();
Name_Map name_map_ee60462[] = {
  NSPAIR(_ZN7ee60462C1Ev),
  NSPAIR(_ZN7ee60462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee60462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60462[];
extern void _ZN7ee604623fooEv();
extern void _ZN7ee604623barEv();
static  VTBL_ENTRY vtc_ee60462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60462[0]),
  (VTBL_ENTRY)&_ZN7ee604623fooEv,
  (VTBL_ENTRY)&_ZN7ee604623barEv,
};
extern VTBL_ENTRY _ZTI7ee60462[];
extern  VTBL_ENTRY _ZTV7ee60462[];
Class_Descriptor cd_ee60462 = {  "ee60462", // class name
  bases_ee60462, 4,
  &(vtc_ee60462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60462),4, //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  ee70462  : virtual dd0462 {
  int e;
  virtual void  foo(); // _ZN7ee704623fooEv
  virtual void  bar(); // _ZN7ee704623barEv
  ~ee70462(); // tgen
  ee70462(); // tgen
};
//SIG(1 ee70462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee70462 ::foo(){vfunc_called(this, "_ZN7ee704623fooEv");}
void  ee70462 ::bar(){vfunc_called(this, "_ZN7ee704623barEv");}
ee70462 ::~ee70462(){ note_dtor("ee70462", this);} // tgen
ee70462 ::ee70462(){ note_ctor("ee70462", this);} // tgen

static void Test_ee70462()
{
  extern Class_Descriptor cd_ee70462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70462, buf);
    ee70462 *dp, &lv = *(dp=new (buf) ee70462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee70462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd0462*), ABISELECT(16,8), "ee70462");
    check_base_class_offset(lv, (cc462*)(dd0462*), ABISELECT(16,8), "ee70462");
    check_base_class_offset(lv, (dd0462*), ABISELECT(16,8), "ee70462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70462.e");
    test_class_info(&lv, &cd_ee70462);
    dp->~ee70462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70462(Test_ee70462, "ee70462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70462C1Ev();
extern void _ZN7ee70462D1Ev();
Name_Map name_map_ee70462[] = {
  NSPAIR(_ZN7ee70462C1Ev),
  NSPAIR(_ZN7ee70462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd0462;
extern VTBL_ENTRY _ZTI6dd0462[];
extern  VTBL_ENTRY _ZTV6dd0462[];
static Base_Class bases_ee70462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0462,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70462[];
extern void _ZN7ee704623fooEv();
extern void _ZN7ee704623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee704623fooEv,_ZTv0_n12_N7ee704623fooEv)();
extern void ABISELECT(_ZThn16_N7ee704623fooEv,_ZThn8_N7ee704623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee704623barEv,_ZTv0_n16_N7ee704623barEv)();
extern void ABISELECT(_ZThn16_N7ee704623barEv,_ZThn8_N7ee704623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70462[0]),
  (VTBL_ENTRY)&_ZN7ee704623fooEv,
  (VTBL_ENTRY)&_ZN7ee704623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee704623fooEv,_ZTv0_n12_N7ee704623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee704623barEv,_ZTv0_n16_N7ee704623barEv),
};
extern VTBL_ENTRY _ZTV7ee70462[];
static  VTT_ENTRY vtt_ee70462[] = {
  {&(_ZTV7ee70462[3]),  3,11},
  {&(_ZTV7ee70462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70462[];
extern  VTBL_ENTRY _ZTV7ee70462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70462[];
static VTBL_ENTRY alt_thunk_names1162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee704623barEv,_ZTv0_n16_N7ee704623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee704623barEv,_ZThn8_N7ee704623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee704623fooEv,_ZTv0_n12_N7ee704623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee704623fooEv,_ZThn8_N7ee704623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70462 = {  "ee70462", // class name
  bases_ee70462, 4,
  &(vtc_ee70462[0]), // expected_vtbl_contents
  &(vtt_ee70462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1162,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1462  : virtual cc462 {
  int d;
  ~dd1462(); // tgen
  dd1462(); // tgen
};
//SIG(-1 dd1462) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


dd1462 ::~dd1462(){ note_dtor("dd1462", this);} // tgen
dd1462 ::dd1462(){ note_ctor("dd1462", this);} // tgen

static void Test_dd1462()
{
  extern Class_Descriptor cd_dd1462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1462, buf);
    dd1462 *dp, &lv = *(dp=new (buf) dd1462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,8), "dd1462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,8), "dd1462");
    check_base_class_offset(lv, (cc462*), ABISELECT(16,8), "dd1462");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1462.d");
    test_class_info(&lv, &cd_dd1462);
    dp->~dd1462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1462(Test_dd1462, "dd1462", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1462C1Ev();
extern void _ZN6dd1462D1Ev();
Name_Map name_map_dd1462[] = {
  NSPAIR(_ZN6dd1462C1Ev),
  NSPAIR(_ZN6dd1462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd1462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1462[];
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_dd1462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV6dd1462[];
static  VTT_ENTRY vtt_dd1462[] = {
  {&(_ZTV6dd1462[3]),  3,9},
  {&(_ZTV6dd1462[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
Class_Descriptor cd_dd1462 = {  "dd1462", // class name
  bases_dd1462, 3,
  &(vtc_dd1462[0]), // expected_vtbl_contents
  &(vtt_dd1462[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1462),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1462),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  ee01462  : dd1462 {
  int e;
  ~ee01462(); // tgen
  ee01462(); // tgen
};
//SIG(1 ee01462) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee01462 ::~ee01462(){ note_dtor("ee01462", this);} // tgen
ee01462 ::ee01462(){ note_ctor("ee01462", this);} // tgen

static void Test_ee01462()
{
  extern Class_Descriptor cd_ee01462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01462, buf);
    ee01462 *dp, &lv = *(dp=new (buf) ee01462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee01462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee01462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(16,12), "ee01462");
    check_base_class_offset(lv, (dd1462*), 0, "ee01462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01462.e");
    test_class_info(&lv, &cd_ee01462);
    dp->~ee01462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01462(Test_ee01462, "ee01462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01462C1Ev();
extern void _ZN7ee01462D1Ev();
Name_Map name_map_ee01462[] = {
  NSPAIR(_ZN7ee01462C1Ev),
  NSPAIR(_ZN7ee01462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee01462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01462[];
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee01462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01462[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee01462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee01462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee01462[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee01462[] = {
  {&(_ZTV7ee01462[3]),  3,9},
  {&(_tg__ZTV6dd1462__7ee01462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee01462[4]),  4,6},
  {&(_ZTV7ee01462[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01462[];
extern  VTBL_ENTRY _ZTV7ee01462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01462[];
Class_Descriptor cd_ee01462 = {  "ee01462", // class name
  bases_ee01462, 4,
  &(vtc_ee01462[0]), // expected_vtbl_contents
  &(vtt_ee01462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01462),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01462),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  ee11462  : virtual dd1462 {
  int e;
  ~ee11462(); // tgen
  ee11462(); // tgen
};
//SIG(1 ee11462) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee11462 ::~ee11462(){ note_dtor("ee11462", this);} // tgen
ee11462 ::ee11462(){ note_ctor("ee11462", this);} // tgen

static void Test_ee11462()
{
  extern Class_Descriptor cd_ee11462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11462, buf);
    ee11462 *dp, &lv = *(dp=new (buf) ee11462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee11462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee11462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(32,16), "ee11462");
    check_base_class_offset(lv, (dd1462*), ABISELECT(16,8), "ee11462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11462.e");
    test_class_info(&lv, &cd_ee11462);
    dp->~ee11462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11462(Test_ee11462, "ee11462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11462C1Ev();
extern void _ZN7ee11462D1Ev();
Name_Map name_map_ee11462[] = {
  NSPAIR(_ZN7ee11462C1Ev),
  NSPAIR(_ZN7ee11462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee11462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11462[];
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee11462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11462[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11462[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee11462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee11462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee11462[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee11462[] = {
  {&(_ZTV7ee11462[4]),  4,13},
  {&(_ZTV7ee11462[7]),  7,13},
  {&(_ZTV7ee11462[11]),  11,13},
  {&(_tg__ZTV6dd1462__7ee11462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee11462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11462[];
extern  VTBL_ENTRY _ZTV7ee11462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11462[];
Class_Descriptor cd_ee11462 = {  "ee11462", // class name
  bases_ee11462, 4,
  &(vtc_ee11462[0]), // expected_vtbl_contents
  &(vtt_ee11462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11462),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11462),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  ee21462  : dd1462 {
  int e;
  virtual void  foo(); // _ZN7ee214623fooEv
  ~ee21462(); // tgen
  ee21462(); // tgen
};
//SIG(1 ee21462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee21462 ::foo(){vfunc_called(this, "_ZN7ee214623fooEv");}
ee21462 ::~ee21462(){ note_dtor("ee21462", this);} // tgen
ee21462 ::ee21462(){ note_ctor("ee21462", this);} // tgen

static void Test_ee21462()
{
  extern Class_Descriptor cd_ee21462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21462, buf);
    ee21462 *dp, &lv = *(dp=new (buf) ee21462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee21462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee21462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(16,12), "ee21462");
    check_base_class_offset(lv, (dd1462*), 0, "ee21462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21462.e");
    test_class_info(&lv, &cd_ee21462);
    dp->~ee21462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21462(Test_ee21462, "ee21462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21462C1Ev();
extern void _ZN7ee21462D1Ev();
Name_Map name_map_ee21462[] = {
  NSPAIR(_ZN7ee21462C1Ev),
  NSPAIR(_ZN7ee21462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee21462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21462[];
extern void _ZN7ee214623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee214623fooEv,_ZTv0_n12_N7ee214623fooEv)();
extern void ABISELECT(_ZThn16_N7ee214623fooEv,_ZThn12_N7ee214623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee21462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21462[0]),
  (VTBL_ENTRY)&_ZN7ee214623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee214623fooEv,_ZTv0_n12_N7ee214623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee21462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee21462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee21462[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee21462[] = {
  {&(_ZTV7ee21462[3]),  3,10},
  {&(_tg__ZTV6dd1462__7ee21462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee21462[4]),  4,6},
  {&(_ZTV7ee21462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21462[];
extern  VTBL_ENTRY _ZTV7ee21462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21462[];
static VTBL_ENTRY alt_thunk_names1163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee214623fooEv,_ZTv0_n12_N7ee214623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee214623fooEv,_ZThn12_N7ee214623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21462 = {  "ee21462", // class name
  bases_ee21462, 4,
  &(vtc_ee21462[0]), // expected_vtbl_contents
  &(vtt_ee21462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1163,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31462  : virtual dd1462 {
  int e;
  virtual void  foo(); // _ZN7ee314623fooEv
  ~ee31462(); // tgen
  ee31462(); // tgen
};
//SIG(1 ee31462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee31462 ::foo(){vfunc_called(this, "_ZN7ee314623fooEv");}
ee31462 ::~ee31462(){ note_dtor("ee31462", this);} // tgen
ee31462 ::ee31462(){ note_ctor("ee31462", this);} // tgen

static void Test_ee31462()
{
  extern Class_Descriptor cd_ee31462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31462, buf);
    ee31462 *dp, &lv = *(dp=new (buf) ee31462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee31462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee31462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(32,16), "ee31462");
    check_base_class_offset(lv, (dd1462*), ABISELECT(16,8), "ee31462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31462.e");
    test_class_info(&lv, &cd_ee31462);
    dp->~ee31462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31462(Test_ee31462, "ee31462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31462C1Ev();
extern void _ZN7ee31462D1Ev();
Name_Map name_map_ee31462[] = {
  NSPAIR(_ZN7ee31462C1Ev),
  NSPAIR(_ZN7ee31462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee31462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31462[];
extern void _ZN7ee314623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee314623fooEv,_ZTv0_n12_N7ee314623fooEv)();
extern void ABISELECT(_ZThn32_N7ee314623fooEv,_ZThn16_N7ee314623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee31462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31462[0]),
  (VTBL_ENTRY)&_ZN7ee314623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31462[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee314623fooEv,_ZTv0_n12_N7ee314623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee31462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee31462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee31462[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee31462[] = {
  {&(_ZTV7ee31462[4]),  4,14},
  {&(_ZTV7ee31462[8]),  8,14},
  {&(_ZTV7ee31462[12]),  12,14},
  {&(_tg__ZTV6dd1462__7ee31462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee31462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31462[];
extern  VTBL_ENTRY _ZTV7ee31462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31462[];
static VTBL_ENTRY alt_thunk_names1164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee314623fooEv,_ZTv0_n12_N7ee314623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee314623fooEv,_ZThn16_N7ee314623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31462 = {  "ee31462", // class name
  bases_ee31462, 4,
  &(vtc_ee31462[0]), // expected_vtbl_contents
  &(vtt_ee31462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31462),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1164,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41462  : dd1462 {
  int e;
  virtual void  bar(); // _ZN7ee414623barEv
  ~ee41462(); // tgen
  ee41462(); // tgen
};
//SIG(1 ee41462) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee41462 ::bar(){vfunc_called(this, "_ZN7ee414623barEv");}
ee41462 ::~ee41462(){ note_dtor("ee41462", this);} // tgen
ee41462 ::ee41462(){ note_ctor("ee41462", this);} // tgen

static void Test_ee41462()
{
  extern Class_Descriptor cd_ee41462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41462, buf);
    ee41462 *dp, &lv = *(dp=new (buf) ee41462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee41462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee41462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(16,12), "ee41462");
    check_base_class_offset(lv, (dd1462*), 0, "ee41462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41462.e");
    test_class_info(&lv, &cd_ee41462);
    dp->~ee41462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41462(Test_ee41462, "ee41462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41462C1Ev();
extern void _ZN7ee41462D1Ev();
Name_Map name_map_ee41462[] = {
  NSPAIR(_ZN7ee41462C1Ev),
  NSPAIR(_ZN7ee41462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee41462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41462[];
extern void _ZN7ee414623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee414623barEv,_ZTv0_n16_N7ee414623barEv)();
extern void ABISELECT(_ZThn16_N7ee414623barEv,_ZThn12_N7ee414623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41462[0]),
  (VTBL_ENTRY)&_ZN7ee414623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee414623barEv,_ZTv0_n16_N7ee414623barEv),
};
extern VTBL_ENTRY _ZTV7ee41462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee41462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee41462[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee41462[] = {
  {&(_ZTV7ee41462[3]),  3,10},
  {&(_tg__ZTV6dd1462__7ee41462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee41462[4]),  4,6},
  {&(_ZTV7ee41462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41462[];
extern  VTBL_ENTRY _ZTV7ee41462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41462[];
static VTBL_ENTRY alt_thunk_names1165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee414623barEv,_ZTv0_n16_N7ee414623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee414623barEv,_ZThn12_N7ee414623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41462 = {  "ee41462", // class name
  bases_ee41462, 4,
  &(vtc_ee41462[0]), // expected_vtbl_contents
  &(vtt_ee41462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1165,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51462  : virtual dd1462 {
  int e;
  virtual void  bar(); // _ZN7ee514623barEv
  ~ee51462(); // tgen
  ee51462(); // tgen
};
//SIG(1 ee51462) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee51462 ::bar(){vfunc_called(this, "_ZN7ee514623barEv");}
ee51462 ::~ee51462(){ note_dtor("ee51462", this);} // tgen
ee51462 ::ee51462(){ note_ctor("ee51462", this);} // tgen

static void Test_ee51462()
{
  extern Class_Descriptor cd_ee51462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51462, buf);
    ee51462 *dp, &lv = *(dp=new (buf) ee51462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee51462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee51462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(32,16), "ee51462");
    check_base_class_offset(lv, (dd1462*), ABISELECT(16,8), "ee51462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51462.e");
    test_class_info(&lv, &cd_ee51462);
    dp->~ee51462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51462(Test_ee51462, "ee51462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51462C1Ev();
extern void _ZN7ee51462D1Ev();
Name_Map name_map_ee51462[] = {
  NSPAIR(_ZN7ee51462C1Ev),
  NSPAIR(_ZN7ee51462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee51462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51462[];
extern void _ZN7ee514623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee514623barEv,_ZTv0_n16_N7ee514623barEv)();
extern void ABISELECT(_ZThn32_N7ee514623barEv,_ZThn16_N7ee514623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51462[0]),
  (VTBL_ENTRY)&_ZN7ee514623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51462[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee514623barEv,_ZTv0_n16_N7ee514623barEv),
};
extern VTBL_ENTRY _ZTV7ee51462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee51462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee51462[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee51462[] = {
  {&(_ZTV7ee51462[4]),  4,14},
  {&(_ZTV7ee51462[8]),  8,14},
  {&(_ZTV7ee51462[12]),  12,14},
  {&(_tg__ZTV6dd1462__7ee51462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee51462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51462[];
extern  VTBL_ENTRY _ZTV7ee51462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51462[];
static VTBL_ENTRY alt_thunk_names1166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee514623barEv,_ZTv0_n16_N7ee514623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee514623barEv,_ZThn16_N7ee514623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51462 = {  "ee51462", // class name
  bases_ee51462, 4,
  &(vtc_ee51462[0]), // expected_vtbl_contents
  &(vtt_ee51462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51462),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1166,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61462  : dd1462 {
  int e;
  virtual void  foo(); // _ZN7ee614623fooEv
  virtual void  bar(); // _ZN7ee614623barEv
  ~ee61462(); // tgen
  ee61462(); // tgen
};
//SIG(1 ee61462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee61462 ::foo(){vfunc_called(this, "_ZN7ee614623fooEv");}
void  ee61462 ::bar(){vfunc_called(this, "_ZN7ee614623barEv");}
ee61462 ::~ee61462(){ note_dtor("ee61462", this);} // tgen
ee61462 ::ee61462(){ note_ctor("ee61462", this);} // tgen

static void Test_ee61462()
{
  extern Class_Descriptor cd_ee61462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61462, buf);
    ee61462 *dp, &lv = *(dp=new (buf) ee61462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee61462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee61462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(16,12), "ee61462");
    check_base_class_offset(lv, (dd1462*), 0, "ee61462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61462.e");
    test_class_info(&lv, &cd_ee61462);
    dp->~ee61462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61462(Test_ee61462, "ee61462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61462C1Ev();
extern void _ZN7ee61462D1Ev();
Name_Map name_map_ee61462[] = {
  NSPAIR(_ZN7ee61462C1Ev),
  NSPAIR(_ZN7ee61462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee61462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61462[];
extern void _ZN7ee614623fooEv();
extern void _ZN7ee614623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee614623fooEv,_ZTv0_n12_N7ee614623fooEv)();
extern void ABISELECT(_ZThn16_N7ee614623fooEv,_ZThn12_N7ee614623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee614623barEv,_ZTv0_n16_N7ee614623barEv)();
extern void ABISELECT(_ZThn16_N7ee614623barEv,_ZThn12_N7ee614623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61462[0]),
  (VTBL_ENTRY)&_ZN7ee614623fooEv,
  (VTBL_ENTRY)&_ZN7ee614623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee614623fooEv,_ZTv0_n12_N7ee614623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee614623barEv,_ZTv0_n16_N7ee614623barEv),
};
extern VTBL_ENTRY _ZTV7ee61462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee61462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee61462[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee61462[] = {
  {&(_ZTV7ee61462[3]),  3,11},
  {&(_tg__ZTV6dd1462__7ee61462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee61462[4]),  4,6},
  {&(_ZTV7ee61462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61462[];
extern  VTBL_ENTRY _ZTV7ee61462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61462[];
static VTBL_ENTRY alt_thunk_names1167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee614623barEv,_ZTv0_n16_N7ee614623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee614623barEv,_ZThn12_N7ee614623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee614623fooEv,_ZTv0_n12_N7ee614623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee614623fooEv,_ZThn12_N7ee614623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61462 = {  "ee61462", // class name
  bases_ee61462, 4,
  &(vtc_ee61462[0]), // expected_vtbl_contents
  &(vtt_ee61462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1167,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71462  : virtual dd1462 {
  int e;
  virtual void  foo(); // _ZN7ee714623fooEv
  virtual void  bar(); // _ZN7ee714623barEv
  ~ee71462(); // tgen
  ee71462(); // tgen
};
//SIG(1 ee71462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee71462 ::foo(){vfunc_called(this, "_ZN7ee714623fooEv");}
void  ee71462 ::bar(){vfunc_called(this, "_ZN7ee714623barEv");}
ee71462 ::~ee71462(){ note_dtor("ee71462", this);} // tgen
ee71462 ::ee71462(){ note_ctor("ee71462", this);} // tgen

static void Test_ee71462()
{
  extern Class_Descriptor cd_ee71462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71462, buf);
    ee71462 *dp, &lv = *(dp=new (buf) ee71462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee71462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee71462");
    check_base_class_offset(lv, (cc462*)(dd1462*), ABISELECT(32,16), "ee71462");
    check_base_class_offset(lv, (dd1462*), ABISELECT(16,8), "ee71462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71462.e");
    test_class_info(&lv, &cd_ee71462);
    dp->~ee71462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71462(Test_ee71462, "ee71462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71462C1Ev();
extern void _ZN7ee71462D1Ev();
Name_Map name_map_ee71462[] = {
  NSPAIR(_ZN7ee71462C1Ev),
  NSPAIR(_ZN7ee71462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd1462;
extern VTBL_ENTRY _ZTI6dd1462[];
extern  VTBL_ENTRY _ZTV6dd1462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1462[];
static Base_Class bases_ee71462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1462,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71462[];
extern void _ZN7ee714623fooEv();
extern void _ZN7ee714623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee714623fooEv,_ZTv0_n12_N7ee714623fooEv)();
extern void ABISELECT(_ZThn32_N7ee714623fooEv,_ZThn16_N7ee714623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee714623barEv,_ZTv0_n16_N7ee714623barEv)();
extern void ABISELECT(_ZThn32_N7ee714623barEv,_ZThn16_N7ee714623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71462[0]),
  (VTBL_ENTRY)&_ZN7ee714623fooEv,
  (VTBL_ENTRY)&_ZN7ee714623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71462[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee714623fooEv,_ZTv0_n12_N7ee714623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee714623barEv,_ZTv0_n16_N7ee714623barEv),
};
extern VTBL_ENTRY _ZTV7ee71462[];
static  VTBL_ENTRY _tg__ZTV6dd1462__7ee71462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
};
extern void _ZN4bb623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd1462__7ee71462[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee71462[] = {
  {&(_ZTV7ee71462[4]),  4,15},
  {&(_ZTV7ee71462[9]),  9,15},
  {&(_ZTV7ee71462[13]),  13,15},
  {&(_tg__ZTV6dd1462__7ee71462[3]),  3,3},
  {&(_tg__ZTV5cc462__6dd1462__7ee71462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71462[];
extern  VTBL_ENTRY _ZTV7ee71462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71462[];
static VTBL_ENTRY alt_thunk_names1168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee714623barEv,_ZTv0_n16_N7ee714623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee714623barEv,_ZThn16_N7ee714623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee714623fooEv,_ZTv0_n12_N7ee714623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee714623fooEv,_ZThn16_N7ee714623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71462 = {  "ee71462", // class name
  bases_ee71462, 4,
  &(vtc_ee71462[0]), // expected_vtbl_contents
  &(vtt_ee71462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71462),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1168,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2462  : cc462 {
  int d;
  virtual void  foo(); // _ZN6dd24623fooEv
  ~dd2462(); // tgen
  dd2462(); // tgen
};
//SIG(-1 dd2462) C1{ BC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd2462 ::foo(){vfunc_called(this, "_ZN6dd24623fooEv");}
dd2462 ::~dd2462(){ note_dtor("dd2462", this);} // tgen
dd2462 ::dd2462(){ note_ctor("dd2462", this);} // tgen

static void Test_dd2462()
{
  extern Class_Descriptor cd_dd2462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2462, buf);
    dd2462 *dp, &lv = *(dp=new (buf) dd2462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), 0, "dd2462");
    check_base_class_offset(lv, (bb62*)(cc462*), 0, "dd2462");
    check_base_class_offset(lv, (cc462*), 0, "dd2462");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2462.d");
    test_class_info(&lv, &cd_dd2462);
    dp->~dd2462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2462(Test_dd2462, "dd2462", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2462C1Ev();
extern void _ZN6dd2462D1Ev();
Name_Map name_map_dd2462[] = {
  NSPAIR(_ZN6dd2462C1Ev),
  NSPAIR(_ZN6dd2462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd2462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2462[];
extern void _ZN6dd24623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_dd2462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2462[0]),
  (VTBL_ENTRY)&_ZN6dd24623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
Class_Descriptor cd_dd2462 = {  "dd2462", // class name
  bases_dd2462, 3,
  &(vtc_dd2462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2462),4, //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  ee02462  : dd2462 {
  int e;
  ~ee02462(); // tgen
  ee02462(); // tgen
};
//SIG(1 ee02462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee02462 ::~ee02462(){ note_dtor("ee02462", this);} // tgen
ee02462 ::ee02462(){ note_ctor("ee02462", this);} // tgen

static void Test_ee02462()
{
  extern Class_Descriptor cd_ee02462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02462, buf);
    ee02462 *dp, &lv = *(dp=new (buf) ee02462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), 0, "ee02462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), 0, "ee02462");
    check_base_class_offset(lv, (cc462*)(dd2462*), 0, "ee02462");
    check_base_class_offset(lv, (dd2462*), 0, "ee02462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02462.e");
    test_class_info(&lv, &cd_ee02462);
    dp->~ee02462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02462(Test_ee02462, "ee02462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02462C1Ev();
extern void _ZN7ee02462D1Ev();
Name_Map name_map_ee02462[] = {
  NSPAIR(_ZN7ee02462C1Ev),
  NSPAIR(_ZN7ee02462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee02462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02462[];
extern void _ZN6dd24623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee02462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02462[0]),
  (VTBL_ENTRY)&_ZN6dd24623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTI7ee02462[];
extern  VTBL_ENTRY _ZTV7ee02462[];
Class_Descriptor cd_ee02462 = {  "ee02462", // class name
  bases_ee02462, 4,
  &(vtc_ee02462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02462),4, //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  ee12462  : virtual dd2462 {
  int e;
  ~ee12462(); // tgen
  ee12462(); // tgen
};
//SIG(1 ee12462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee12462 ::~ee12462(){ note_dtor("ee12462", this);} // tgen
ee12462 ::ee12462(){ note_ctor("ee12462", this);} // tgen

static void Test_ee12462()
{
  extern Class_Descriptor cd_ee12462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12462, buf);
    ee12462 *dp, &lv = *(dp=new (buf) ee12462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee12462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee12462");
    check_base_class_offset(lv, (cc462*)(dd2462*), ABISELECT(16,8), "ee12462");
    check_base_class_offset(lv, (dd2462*), ABISELECT(16,8), "ee12462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12462.e");
    test_class_info(&lv, &cd_ee12462);
    dp->~ee12462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12462(Test_ee12462, "ee12462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12462C1Ev();
extern void _ZN7ee12462D1Ev();
Name_Map name_map_ee12462[] = {
  NSPAIR(_ZN7ee12462C1Ev),
  NSPAIR(_ZN7ee12462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee12462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12462[];
extern void _ZN6dd24623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee12462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12462[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12462[0]),
  (VTBL_ENTRY)&_ZN6dd24623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee12462[];
static  VTT_ENTRY vtt_ee12462[] = {
  {&(_ZTV7ee12462[3]),  3,9},
  {&(_ZTV7ee12462[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12462[];
extern  VTBL_ENTRY _ZTV7ee12462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12462[];
Class_Descriptor cd_ee12462 = {  "ee12462", // class name
  bases_ee12462, 4,
  &(vtc_ee12462[0]), // expected_vtbl_contents
  &(vtt_ee12462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12462),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12462),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  ee22462  : dd2462 {
  int e;
  virtual void  foo(); // _ZN7ee224623fooEv
  ~ee22462(); // tgen
  ee22462(); // tgen
};
//SIG(1 ee22462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee22462 ::foo(){vfunc_called(this, "_ZN7ee224623fooEv");}
ee22462 ::~ee22462(){ note_dtor("ee22462", this);} // tgen
ee22462 ::ee22462(){ note_ctor("ee22462", this);} // tgen

static void Test_ee22462()
{
  extern Class_Descriptor cd_ee22462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22462, buf);
    ee22462 *dp, &lv = *(dp=new (buf) ee22462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), 0, "ee22462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), 0, "ee22462");
    check_base_class_offset(lv, (cc462*)(dd2462*), 0, "ee22462");
    check_base_class_offset(lv, (dd2462*), 0, "ee22462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22462.e");
    test_class_info(&lv, &cd_ee22462);
    dp->~ee22462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22462(Test_ee22462, "ee22462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22462C1Ev();
extern void _ZN7ee22462D1Ev();
Name_Map name_map_ee22462[] = {
  NSPAIR(_ZN7ee22462C1Ev),
  NSPAIR(_ZN7ee22462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee22462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22462[];
extern void _ZN7ee224623fooEv();
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee22462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22462[0]),
  (VTBL_ENTRY)&_ZN7ee224623fooEv,
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTI7ee22462[];
extern  VTBL_ENTRY _ZTV7ee22462[];
Class_Descriptor cd_ee22462 = {  "ee22462", // class name
  bases_ee22462, 4,
  &(vtc_ee22462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22462),4, //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  ee32462  : virtual dd2462 {
  int e;
  virtual void  foo(); // _ZN7ee324623fooEv
  ~ee32462(); // tgen
  ee32462(); // tgen
};
//SIG(1 ee32462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee32462 ::foo(){vfunc_called(this, "_ZN7ee324623fooEv");}
ee32462 ::~ee32462(){ note_dtor("ee32462", this);} // tgen
ee32462 ::ee32462(){ note_ctor("ee32462", this);} // tgen

static void Test_ee32462()
{
  extern Class_Descriptor cd_ee32462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32462, buf);
    ee32462 *dp, &lv = *(dp=new (buf) ee32462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee32462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee32462");
    check_base_class_offset(lv, (cc462*)(dd2462*), ABISELECT(16,8), "ee32462");
    check_base_class_offset(lv, (dd2462*), ABISELECT(16,8), "ee32462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32462.e");
    test_class_info(&lv, &cd_ee32462);
    dp->~ee32462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32462(Test_ee32462, "ee32462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32462C1Ev();
extern void _ZN7ee32462D1Ev();
Name_Map name_map_ee32462[] = {
  NSPAIR(_ZN7ee32462C1Ev),
  NSPAIR(_ZN7ee32462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee32462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32462[];
extern void _ZN7ee324623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee324623fooEv,_ZTv0_n12_N7ee324623fooEv)();
extern void ABISELECT(_ZThn16_N7ee324623fooEv,_ZThn8_N7ee324623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee32462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32462[0]),
  (VTBL_ENTRY)&_ZN7ee324623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee324623fooEv,_ZTv0_n12_N7ee324623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee32462[];
static  VTT_ENTRY vtt_ee32462[] = {
  {&(_ZTV7ee32462[3]),  3,10},
  {&(_ZTV7ee32462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32462[];
extern  VTBL_ENTRY _ZTV7ee32462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32462[];
static VTBL_ENTRY alt_thunk_names1169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee324623fooEv,_ZTv0_n12_N7ee324623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee324623fooEv,_ZThn8_N7ee324623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32462 = {  "ee32462", // class name
  bases_ee32462, 4,
  &(vtc_ee32462[0]), // expected_vtbl_contents
  &(vtt_ee32462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1169,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42462  : dd2462 {
  int e;
  virtual void  bar(); // _ZN7ee424623barEv
  ~ee42462(); // tgen
  ee42462(); // tgen
};
//SIG(1 ee42462) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee42462 ::bar(){vfunc_called(this, "_ZN7ee424623barEv");}
ee42462 ::~ee42462(){ note_dtor("ee42462", this);} // tgen
ee42462 ::ee42462(){ note_ctor("ee42462", this);} // tgen

static void Test_ee42462()
{
  extern Class_Descriptor cd_ee42462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42462, buf);
    ee42462 *dp, &lv = *(dp=new (buf) ee42462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), 0, "ee42462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), 0, "ee42462");
    check_base_class_offset(lv, (cc462*)(dd2462*), 0, "ee42462");
    check_base_class_offset(lv, (dd2462*), 0, "ee42462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42462.e");
    test_class_info(&lv, &cd_ee42462);
    dp->~ee42462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42462(Test_ee42462, "ee42462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42462C1Ev();
extern void _ZN7ee42462D1Ev();
Name_Map name_map_ee42462[] = {
  NSPAIR(_ZN7ee42462C1Ev),
  NSPAIR(_ZN7ee42462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee42462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42462[];
extern void _ZN6dd24623fooEv();
extern void _ZN7ee424623barEv();
static  VTBL_ENTRY vtc_ee42462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42462[0]),
  (VTBL_ENTRY)&_ZN6dd24623fooEv,
  (VTBL_ENTRY)&_ZN7ee424623barEv,
};
extern VTBL_ENTRY _ZTI7ee42462[];
extern  VTBL_ENTRY _ZTV7ee42462[];
Class_Descriptor cd_ee42462 = {  "ee42462", // class name
  bases_ee42462, 4,
  &(vtc_ee42462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42462),4, //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  ee52462  : virtual dd2462 {
  int e;
  virtual void  bar(); // _ZN7ee524623barEv
  ~ee52462(); // tgen
  ee52462(); // tgen
};
//SIG(1 ee52462) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee52462 ::bar(){vfunc_called(this, "_ZN7ee524623barEv");}
ee52462 ::~ee52462(){ note_dtor("ee52462", this);} // tgen
ee52462 ::ee52462(){ note_ctor("ee52462", this);} // tgen

static void Test_ee52462()
{
  extern Class_Descriptor cd_ee52462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52462, buf);
    ee52462 *dp, &lv = *(dp=new (buf) ee52462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee52462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee52462");
    check_base_class_offset(lv, (cc462*)(dd2462*), ABISELECT(16,8), "ee52462");
    check_base_class_offset(lv, (dd2462*), ABISELECT(16,8), "ee52462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52462.e");
    test_class_info(&lv, &cd_ee52462);
    dp->~ee52462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52462(Test_ee52462, "ee52462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52462C1Ev();
extern void _ZN7ee52462D1Ev();
Name_Map name_map_ee52462[] = {
  NSPAIR(_ZN7ee52462C1Ev),
  NSPAIR(_ZN7ee52462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee52462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52462[];
extern void _ZN7ee524623barEv();
extern void _ZN6dd24623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee524623barEv,_ZTv0_n16_N7ee524623barEv)();
extern void ABISELECT(_ZThn16_N7ee524623barEv,_ZThn8_N7ee524623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52462[0]),
  (VTBL_ENTRY)&_ZN7ee524623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52462[0]),
  (VTBL_ENTRY)&_ZN6dd24623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee524623barEv,_ZTv0_n16_N7ee524623barEv),
};
extern VTBL_ENTRY _ZTV7ee52462[];
static  VTT_ENTRY vtt_ee52462[] = {
  {&(_ZTV7ee52462[3]),  3,10},
  {&(_ZTV7ee52462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52462[];
extern  VTBL_ENTRY _ZTV7ee52462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52462[];
static VTBL_ENTRY alt_thunk_names1170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee524623barEv,_ZTv0_n16_N7ee524623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee524623barEv,_ZThn8_N7ee524623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52462 = {  "ee52462", // class name
  bases_ee52462, 4,
  &(vtc_ee52462[0]), // expected_vtbl_contents
  &(vtt_ee52462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62462  : dd2462 {
  int e;
  virtual void  foo(); // _ZN7ee624623fooEv
  virtual void  bar(); // _ZN7ee624623barEv
  ~ee62462(); // tgen
  ee62462(); // tgen
};
//SIG(1 ee62462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62462 ::foo(){vfunc_called(this, "_ZN7ee624623fooEv");}
void  ee62462 ::bar(){vfunc_called(this, "_ZN7ee624623barEv");}
ee62462 ::~ee62462(){ note_dtor("ee62462", this);} // tgen
ee62462 ::ee62462(){ note_ctor("ee62462", this);} // tgen

static void Test_ee62462()
{
  extern Class_Descriptor cd_ee62462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62462, buf);
    ee62462 *dp, &lv = *(dp=new (buf) ee62462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), 0, "ee62462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), 0, "ee62462");
    check_base_class_offset(lv, (cc462*)(dd2462*), 0, "ee62462");
    check_base_class_offset(lv, (dd2462*), 0, "ee62462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62462.e");
    test_class_info(&lv, &cd_ee62462);
    dp->~ee62462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62462(Test_ee62462, "ee62462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62462C1Ev();
extern void _ZN7ee62462D1Ev();
Name_Map name_map_ee62462[] = {
  NSPAIR(_ZN7ee62462C1Ev),
  NSPAIR(_ZN7ee62462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee62462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62462[];
extern void _ZN7ee624623fooEv();
extern void _ZN7ee624623barEv();
static  VTBL_ENTRY vtc_ee62462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62462[0]),
  (VTBL_ENTRY)&_ZN7ee624623fooEv,
  (VTBL_ENTRY)&_ZN7ee624623barEv,
};
extern VTBL_ENTRY _ZTI7ee62462[];
extern  VTBL_ENTRY _ZTV7ee62462[];
Class_Descriptor cd_ee62462 = {  "ee62462", // class name
  bases_ee62462, 4,
  &(vtc_ee62462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62462),4, //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  ee72462  : virtual dd2462 {
  int e;
  virtual void  foo(); // _ZN7ee724623fooEv
  virtual void  bar(); // _ZN7ee724623barEv
  ~ee72462(); // tgen
  ee72462(); // tgen
};
//SIG(1 ee72462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72462 ::foo(){vfunc_called(this, "_ZN7ee724623fooEv");}
void  ee72462 ::bar(){vfunc_called(this, "_ZN7ee724623barEv");}
ee72462 ::~ee72462(){ note_dtor("ee72462", this);} // tgen
ee72462 ::ee72462(){ note_ctor("ee72462", this);} // tgen

static void Test_ee72462()
{
  extern Class_Descriptor cd_ee72462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72462, buf);
    ee72462 *dp, &lv = *(dp=new (buf) ee72462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee72462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd2462*), ABISELECT(16,8), "ee72462");
    check_base_class_offset(lv, (cc462*)(dd2462*), ABISELECT(16,8), "ee72462");
    check_base_class_offset(lv, (dd2462*), ABISELECT(16,8), "ee72462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72462.e");
    test_class_info(&lv, &cd_ee72462);
    dp->~ee72462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72462(Test_ee72462, "ee72462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72462C1Ev();
extern void _ZN7ee72462D1Ev();
Name_Map name_map_ee72462[] = {
  NSPAIR(_ZN7ee72462C1Ev),
  NSPAIR(_ZN7ee72462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd2462;
extern VTBL_ENTRY _ZTI6dd2462[];
extern  VTBL_ENTRY _ZTV6dd2462[];
static Base_Class bases_ee72462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2462,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72462[];
extern void _ZN7ee724623fooEv();
extern void _ZN7ee724623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee724623fooEv,_ZTv0_n12_N7ee724623fooEv)();
extern void ABISELECT(_ZThn16_N7ee724623fooEv,_ZThn8_N7ee724623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee724623barEv,_ZTv0_n16_N7ee724623barEv)();
extern void ABISELECT(_ZThn16_N7ee724623barEv,_ZThn8_N7ee724623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72462[0]),
  (VTBL_ENTRY)&_ZN7ee724623fooEv,
  (VTBL_ENTRY)&_ZN7ee724623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee724623fooEv,_ZTv0_n12_N7ee724623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee724623barEv,_ZTv0_n16_N7ee724623barEv),
};
extern VTBL_ENTRY _ZTV7ee72462[];
static  VTT_ENTRY vtt_ee72462[] = {
  {&(_ZTV7ee72462[3]),  3,11},
  {&(_ZTV7ee72462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72462[];
extern  VTBL_ENTRY _ZTV7ee72462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72462[];
static VTBL_ENTRY alt_thunk_names1171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee724623barEv,_ZTv0_n16_N7ee724623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee724623barEv,_ZThn8_N7ee724623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee724623fooEv,_ZTv0_n12_N7ee724623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee724623fooEv,_ZThn8_N7ee724623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72462 = {  "ee72462", // class name
  bases_ee72462, 4,
  &(vtc_ee72462[0]), // expected_vtbl_contents
  &(vtt_ee72462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1171,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3462  : virtual cc462 {
  int d;
  virtual void  foo(); // _ZN6dd34623fooEv
  ~dd3462(); // tgen
  dd3462(); // tgen
};
//SIG(-1 dd3462) C1{ VBC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd3462 ::foo(){vfunc_called(this, "_ZN6dd34623fooEv");}
dd3462 ::~dd3462(){ note_dtor("dd3462", this);} // tgen
dd3462 ::dd3462(){ note_ctor("dd3462", this);} // tgen

static void Test_dd3462()
{
  extern Class_Descriptor cd_dd3462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3462, buf);
    dd3462 *dp, &lv = *(dp=new (buf) dd3462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,8), "dd3462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,8), "dd3462");
    check_base_class_offset(lv, (cc462*), ABISELECT(16,8), "dd3462");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3462.d");
    test_class_info(&lv, &cd_dd3462);
    dp->~dd3462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3462(Test_dd3462, "dd3462", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3462C1Ev();
extern void _ZN6dd3462D1Ev();
Name_Map name_map_dd3462[] = {
  NSPAIR(_ZN6dd3462C1Ev),
  NSPAIR(_ZN6dd3462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd3462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3462[];
extern void _ZN6dd34623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_dd3462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV6dd3462[];
static  VTT_ENTRY vtt_dd3462[] = {
  {&(_ZTV6dd3462[3]),  3,10},
  {&(_ZTV6dd3462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static VTBL_ENTRY alt_thunk_names1172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3462 = {  "dd3462", // class name
  bases_dd3462, 3,
  &(vtc_dd3462[0]), // expected_vtbl_contents
  &(vtt_dd3462[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3462),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1172,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03462  : dd3462 {
  int e;
  ~ee03462(); // tgen
  ee03462(); // tgen
};
//SIG(1 ee03462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee03462 ::~ee03462(){ note_dtor("ee03462", this);} // tgen
ee03462 ::ee03462(){ note_ctor("ee03462", this);} // tgen

static void Test_ee03462()
{
  extern Class_Descriptor cd_ee03462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03462, buf);
    ee03462 *dp, &lv = *(dp=new (buf) ee03462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee03462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee03462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(16,12), "ee03462");
    check_base_class_offset(lv, (dd3462*), 0, "ee03462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03462.e");
    test_class_info(&lv, &cd_ee03462);
    dp->~ee03462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03462(Test_ee03462, "ee03462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03462C1Ev();
extern void _ZN7ee03462D1Ev();
Name_Map name_map_ee03462[] = {
  NSPAIR(_ZN7ee03462C1Ev),
  NSPAIR(_ZN7ee03462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee03462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03462[];
extern void _ZN6dd34623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee03462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee03462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee03462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee03462[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee03462[] = {
  {&(_ZTV7ee03462[3]),  3,10},
  {&(_tg__ZTV6dd3462__7ee03462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee03462[4]),  4,6},
  {&(_ZTV7ee03462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03462[];
extern  VTBL_ENTRY _ZTV7ee03462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03462[];
static VTBL_ENTRY alt_thunk_names1173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03462 = {  "ee03462", // class name
  bases_ee03462, 4,
  &(vtc_ee03462[0]), // expected_vtbl_contents
  &(vtt_ee03462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1173,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13462  : virtual dd3462 {
  int e;
  ~ee13462(); // tgen
  ee13462(); // tgen
};
//SIG(1 ee13462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee13462 ::~ee13462(){ note_dtor("ee13462", this);} // tgen
ee13462 ::ee13462(){ note_ctor("ee13462", this);} // tgen

static void Test_ee13462()
{
  extern Class_Descriptor cd_ee13462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13462, buf);
    ee13462 *dp, &lv = *(dp=new (buf) ee13462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee13462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee13462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(32,16), "ee13462");
    check_base_class_offset(lv, (dd3462*), ABISELECT(16,8), "ee13462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13462.e");
    test_class_info(&lv, &cd_ee13462);
    dp->~ee13462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13462(Test_ee13462, "ee13462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13462C1Ev();
extern void _ZN7ee13462D1Ev();
Name_Map name_map_ee13462[] = {
  NSPAIR(_ZN7ee13462C1Ev),
  NSPAIR(_ZN7ee13462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee13462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13462[];
extern void _ZN6dd34623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee13462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13462[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee13462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee13462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee13462[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee13462[] = {
  {&(_ZTV7ee13462[4]),  4,15},
  {&(_ZTV7ee13462[8]),  8,15},
  {&(_ZTV7ee13462[13]),  13,15},
  {&(_tg__ZTV6dd3462__7ee13462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee13462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13462[];
extern  VTBL_ENTRY _ZTV7ee13462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13462[];
static VTBL_ENTRY alt_thunk_names1174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13462 = {  "ee13462", // class name
  bases_ee13462, 4,
  &(vtc_ee13462[0]), // expected_vtbl_contents
  &(vtt_ee13462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13462),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1174,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23462  : dd3462 {
  int e;
  virtual void  foo(); // _ZN7ee234623fooEv
  ~ee23462(); // tgen
  ee23462(); // tgen
};
//SIG(1 ee23462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee23462 ::foo(){vfunc_called(this, "_ZN7ee234623fooEv");}
ee23462 ::~ee23462(){ note_dtor("ee23462", this);} // tgen
ee23462 ::ee23462(){ note_ctor("ee23462", this);} // tgen

static void Test_ee23462()
{
  extern Class_Descriptor cd_ee23462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23462, buf);
    ee23462 *dp, &lv = *(dp=new (buf) ee23462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee23462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee23462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(16,12), "ee23462");
    check_base_class_offset(lv, (dd3462*), 0, "ee23462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23462.e");
    test_class_info(&lv, &cd_ee23462);
    dp->~ee23462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23462(Test_ee23462, "ee23462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23462C1Ev();
extern void _ZN7ee23462D1Ev();
Name_Map name_map_ee23462[] = {
  NSPAIR(_ZN7ee23462C1Ev),
  NSPAIR(_ZN7ee23462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee23462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23462[];
extern void _ZN7ee234623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee234623fooEv,_ZTv0_n12_N7ee234623fooEv)();
extern void ABISELECT(_ZThn16_N7ee234623fooEv,_ZThn12_N7ee234623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee23462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23462[0]),
  (VTBL_ENTRY)&_ZN7ee234623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee234623fooEv,_ZTv0_n12_N7ee234623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee23462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee23462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee23462[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee23462[] = {
  {&(_ZTV7ee23462[3]),  3,10},
  {&(_tg__ZTV6dd3462__7ee23462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee23462[4]),  4,6},
  {&(_ZTV7ee23462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23462[];
extern  VTBL_ENTRY _ZTV7ee23462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23462[];
static VTBL_ENTRY alt_thunk_names1175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee234623fooEv,_ZTv0_n12_N7ee234623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee234623fooEv,_ZThn12_N7ee234623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23462 = {  "ee23462", // class name
  bases_ee23462, 4,
  &(vtc_ee23462[0]), // expected_vtbl_contents
  &(vtt_ee23462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1175,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33462  : virtual dd3462 {
  int e;
  virtual void  foo(); // _ZN7ee334623fooEv
  ~ee33462(); // tgen
  ee33462(); // tgen
};
//SIG(1 ee33462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee33462 ::foo(){vfunc_called(this, "_ZN7ee334623fooEv");}
ee33462 ::~ee33462(){ note_dtor("ee33462", this);} // tgen
ee33462 ::ee33462(){ note_ctor("ee33462", this);} // tgen

static void Test_ee33462()
{
  extern Class_Descriptor cd_ee33462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33462, buf);
    ee33462 *dp, &lv = *(dp=new (buf) ee33462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee33462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee33462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(32,16), "ee33462");
    check_base_class_offset(lv, (dd3462*), ABISELECT(16,8), "ee33462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33462.e");
    test_class_info(&lv, &cd_ee33462);
    dp->~ee33462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33462(Test_ee33462, "ee33462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33462C1Ev();
extern void _ZN7ee33462D1Ev();
Name_Map name_map_ee33462[] = {
  NSPAIR(_ZN7ee33462C1Ev),
  NSPAIR(_ZN7ee33462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee33462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33462[];
extern void _ZN7ee334623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee334623fooEv,_ZTv0_n16_N7ee334623fooEv)();
extern void ABISELECT(_ZThn16_N7ee334623fooEv,_ZThn8_N7ee334623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee334623fooEv,_ZTv0_n12_N7ee334623fooEv)();
extern void ABISELECT(_ZThn32_N7ee334623fooEv,_ZThn16_N7ee334623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY vtc_ee33462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33462[0]),
  (VTBL_ENTRY)&_ZN7ee334623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee334623fooEv,_ZTv0_n16_N7ee334623fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee334623fooEv,_ZTv0_n12_N7ee334623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
extern VTBL_ENTRY _ZTV7ee33462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee33462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee33462[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee33462[] = {
  {&(_ZTV7ee33462[4]),  4,16},
  {&(_ZTV7ee33462[9]),  9,16},
  {&(_ZTV7ee33462[14]),  14,16},
  {&(_tg__ZTV6dd3462__7ee33462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee33462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33462[];
extern  VTBL_ENTRY _ZTV7ee33462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33462[];
static VTBL_ENTRY alt_thunk_names1176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee334623fooEv,_ZTv0_n12_N7ee334623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee334623fooEv,_ZThn16_N7ee334623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee334623fooEv,_ZTv0_n16_N7ee334623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee334623fooEv,_ZThn8_N7ee334623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33462 = {  "ee33462", // class name
  bases_ee33462, 4,
  &(vtc_ee33462[0]), // expected_vtbl_contents
  &(vtt_ee33462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33462),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1176,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43462  : dd3462 {
  int e;
  virtual void  bar(); // _ZN7ee434623barEv
  ~ee43462(); // tgen
  ee43462(); // tgen
};
//SIG(1 ee43462) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee43462 ::bar(){vfunc_called(this, "_ZN7ee434623barEv");}
ee43462 ::~ee43462(){ note_dtor("ee43462", this);} // tgen
ee43462 ::ee43462(){ note_ctor("ee43462", this);} // tgen

static void Test_ee43462()
{
  extern Class_Descriptor cd_ee43462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43462, buf);
    ee43462 *dp, &lv = *(dp=new (buf) ee43462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee43462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee43462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(16,12), "ee43462");
    check_base_class_offset(lv, (dd3462*), 0, "ee43462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43462.e");
    test_class_info(&lv, &cd_ee43462);
    dp->~ee43462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43462(Test_ee43462, "ee43462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43462C1Ev();
extern void _ZN7ee43462D1Ev();
Name_Map name_map_ee43462[] = {
  NSPAIR(_ZN7ee43462C1Ev),
  NSPAIR(_ZN7ee43462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee43462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43462[];
extern void _ZN6dd34623fooEv();
extern void _ZN7ee434623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee434623barEv,_ZTv0_n16_N7ee434623barEv)();
extern void ABISELECT(_ZThn16_N7ee434623barEv,_ZThn12_N7ee434623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
  (VTBL_ENTRY)&_ZN7ee434623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee434623barEv,_ZTv0_n16_N7ee434623barEv),
};
extern VTBL_ENTRY _ZTV7ee43462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee43462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee43462[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee43462[] = {
  {&(_ZTV7ee43462[3]),  3,11},
  {&(_tg__ZTV6dd3462__7ee43462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee43462[4]),  4,6},
  {&(_ZTV7ee43462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43462[];
extern  VTBL_ENTRY _ZTV7ee43462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43462[];
static VTBL_ENTRY alt_thunk_names1177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee434623barEv,_ZTv0_n16_N7ee434623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee434623barEv,_ZThn12_N7ee434623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43462 = {  "ee43462", // class name
  bases_ee43462, 4,
  &(vtc_ee43462[0]), // expected_vtbl_contents
  &(vtt_ee43462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1177,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53462  : virtual dd3462 {
  int e;
  virtual void  bar(); // _ZN7ee534623barEv
  ~ee53462(); // tgen
  ee53462(); // tgen
};
//SIG(1 ee53462) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee53462 ::bar(){vfunc_called(this, "_ZN7ee534623barEv");}
ee53462 ::~ee53462(){ note_dtor("ee53462", this);} // tgen
ee53462 ::ee53462(){ note_ctor("ee53462", this);} // tgen

static void Test_ee53462()
{
  extern Class_Descriptor cd_ee53462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53462, buf);
    ee53462 *dp, &lv = *(dp=new (buf) ee53462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee53462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee53462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(32,16), "ee53462");
    check_base_class_offset(lv, (dd3462*), ABISELECT(16,8), "ee53462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53462.e");
    test_class_info(&lv, &cd_ee53462);
    dp->~ee53462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53462(Test_ee53462, "ee53462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53462C1Ev();
extern void _ZN7ee53462D1Ev();
Name_Map name_map_ee53462[] = {
  NSPAIR(_ZN7ee53462C1Ev),
  NSPAIR(_ZN7ee53462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee53462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53462[];
extern void _ZN7ee534623barEv();
extern void _ZN6dd34623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee534623barEv,_ZTv0_n16_N7ee534623barEv)();
extern void ABISELECT(_ZThn32_N7ee534623barEv,_ZThn16_N7ee534623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53462[0]),
  (VTBL_ENTRY)&_ZN7ee534623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee534623barEv,_ZTv0_n16_N7ee534623barEv),
};
extern VTBL_ENTRY _ZTV7ee53462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee53462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee53462[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee53462[] = {
  {&(_ZTV7ee53462[4]),  4,16},
  {&(_ZTV7ee53462[9]),  9,16},
  {&(_ZTV7ee53462[14]),  14,16},
  {&(_tg__ZTV6dd3462__7ee53462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee53462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53462[];
extern  VTBL_ENTRY _ZTV7ee53462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53462[];
static VTBL_ENTRY alt_thunk_names1178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee534623barEv,_ZTv0_n16_N7ee534623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee534623barEv,_ZThn16_N7ee534623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53462 = {  "ee53462", // class name
  bases_ee53462, 4,
  &(vtc_ee53462[0]), // expected_vtbl_contents
  &(vtt_ee53462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53462),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1178,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63462  : dd3462 {
  int e;
  virtual void  foo(); // _ZN7ee634623fooEv
  virtual void  bar(); // _ZN7ee634623barEv
  ~ee63462(); // tgen
  ee63462(); // tgen
};
//SIG(1 ee63462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63462 ::foo(){vfunc_called(this, "_ZN7ee634623fooEv");}
void  ee63462 ::bar(){vfunc_called(this, "_ZN7ee634623barEv");}
ee63462 ::~ee63462(){ note_dtor("ee63462", this);} // tgen
ee63462 ::ee63462(){ note_ctor("ee63462", this);} // tgen

static void Test_ee63462()
{
  extern Class_Descriptor cd_ee63462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63462, buf);
    ee63462 *dp, &lv = *(dp=new (buf) ee63462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee63462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee63462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(16,12), "ee63462");
    check_base_class_offset(lv, (dd3462*), 0, "ee63462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63462.e");
    test_class_info(&lv, &cd_ee63462);
    dp->~ee63462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63462(Test_ee63462, "ee63462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63462C1Ev();
extern void _ZN7ee63462D1Ev();
Name_Map name_map_ee63462[] = {
  NSPAIR(_ZN7ee63462C1Ev),
  NSPAIR(_ZN7ee63462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee63462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63462[];
extern void _ZN7ee634623fooEv();
extern void _ZN7ee634623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee634623fooEv,_ZTv0_n12_N7ee634623fooEv)();
extern void ABISELECT(_ZThn16_N7ee634623fooEv,_ZThn12_N7ee634623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee634623barEv,_ZTv0_n16_N7ee634623barEv)();
extern void ABISELECT(_ZThn16_N7ee634623barEv,_ZThn12_N7ee634623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63462[0]),
  (VTBL_ENTRY)&_ZN7ee634623fooEv,
  (VTBL_ENTRY)&_ZN7ee634623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee634623fooEv,_ZTv0_n12_N7ee634623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee634623barEv,_ZTv0_n16_N7ee634623barEv),
};
extern VTBL_ENTRY _ZTV7ee63462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee63462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee63462[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee63462[] = {
  {&(_ZTV7ee63462[3]),  3,11},
  {&(_tg__ZTV6dd3462__7ee63462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee63462[4]),  4,6},
  {&(_ZTV7ee63462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63462[];
extern  VTBL_ENTRY _ZTV7ee63462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63462[];
static VTBL_ENTRY alt_thunk_names1179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn12_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee634623barEv,_ZTv0_n16_N7ee634623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee634623barEv,_ZThn12_N7ee634623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee634623fooEv,_ZTv0_n12_N7ee634623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee634623fooEv,_ZThn12_N7ee634623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63462 = {  "ee63462", // class name
  bases_ee63462, 4,
  &(vtc_ee63462[0]), // expected_vtbl_contents
  &(vtt_ee63462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1179,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73462  : virtual dd3462 {
  int e;
  virtual void  foo(); // _ZN7ee734623fooEv
  virtual void  bar(); // _ZN7ee734623barEv
  ~ee73462(); // tgen
  ee73462(); // tgen
};
//SIG(1 ee73462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73462 ::foo(){vfunc_called(this, "_ZN7ee734623fooEv");}
void  ee73462 ::bar(){vfunc_called(this, "_ZN7ee734623barEv");}
ee73462 ::~ee73462(){ note_dtor("ee73462", this);} // tgen
ee73462 ::ee73462(){ note_ctor("ee73462", this);} // tgen

static void Test_ee73462()
{
  extern Class_Descriptor cd_ee73462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73462, buf);
    ee73462 *dp, &lv = *(dp=new (buf) ee73462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee73462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee73462");
    check_base_class_offset(lv, (cc462*)(dd3462*), ABISELECT(32,16), "ee73462");
    check_base_class_offset(lv, (dd3462*), ABISELECT(16,8), "ee73462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73462.e");
    test_class_info(&lv, &cd_ee73462);
    dp->~ee73462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73462(Test_ee73462, "ee73462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73462C1Ev();
extern void _ZN7ee73462D1Ev();
Name_Map name_map_ee73462[] = {
  NSPAIR(_ZN7ee73462C1Ev),
  NSPAIR(_ZN7ee73462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd3462;
extern VTBL_ENTRY _ZTI6dd3462[];
extern  VTBL_ENTRY _ZTV6dd3462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3462[];
static Base_Class bases_ee73462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3462,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73462[];
extern void _ZN7ee734623fooEv();
extern void _ZN7ee734623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee734623fooEv,_ZTv0_n16_N7ee734623fooEv)();
extern void ABISELECT(_ZThn16_N7ee734623fooEv,_ZThn8_N7ee734623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee734623fooEv,_ZTv0_n12_N7ee734623fooEv)();
extern void ABISELECT(_ZThn32_N7ee734623fooEv,_ZThn16_N7ee734623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee734623barEv,_ZTv0_n16_N7ee734623barEv)();
extern void ABISELECT(_ZThn32_N7ee734623barEv,_ZThn16_N7ee734623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73462[0]),
  (VTBL_ENTRY)&_ZN7ee734623fooEv,
  (VTBL_ENTRY)&_ZN7ee734623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee734623fooEv,_ZTv0_n16_N7ee734623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee734623fooEv,_ZTv0_n12_N7ee734623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee734623barEv,_ZTv0_n16_N7ee734623barEv),
};
extern VTBL_ENTRY _ZTV7ee73462[];
extern void _ZN6dd34623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3462__7ee73462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&_ZN6dd34623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv)();
extern void ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv)() __attribute__((weak));
extern void _ZN5cc4623barEv();
static  VTBL_ENTRY _tg__ZTV5cc462__6dd3462__7ee73462[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv),
  (VTBL_ENTRY)&_ZN5cc4623barEv,
};
static  VTT_ENTRY vtt_ee73462[] = {
  {&(_ZTV7ee73462[4]),  4,17},
  {&(_ZTV7ee73462[10]),  10,17},
  {&(_ZTV7ee73462[15]),  15,17},
  {&(_tg__ZTV6dd3462__7ee73462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd3462__7ee73462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73462[];
extern  VTBL_ENTRY _ZTV7ee73462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73462[];
static VTBL_ENTRY alt_thunk_names1180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd34623fooEv,_ZTv0_n12_N6dd34623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd34623fooEv,_ZThn8_N6dd34623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee734623barEv,_ZTv0_n16_N7ee734623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee734623barEv,_ZThn16_N7ee734623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee734623fooEv,_ZTv0_n12_N7ee734623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee734623fooEv,_ZThn16_N7ee734623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee734623fooEv,_ZTv0_n16_N7ee734623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee734623fooEv,_ZThn8_N7ee734623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73462 = {  "ee73462", // class name
  bases_ee73462, 4,
  &(vtc_ee73462[0]), // expected_vtbl_contents
  &(vtt_ee73462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73462),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1180,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4462  : cc462 {
  int d;
  virtual void  bar(); // _ZN6dd44623barEv
  ~dd4462(); // tgen
  dd4462(); // tgen
};
//SIG(-1 dd4462) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd4462 ::bar(){vfunc_called(this, "_ZN6dd44623barEv");}
dd4462 ::~dd4462(){ note_dtor("dd4462", this);} // tgen
dd4462 ::dd4462(){ note_ctor("dd4462", this);} // tgen

static void Test_dd4462()
{
  extern Class_Descriptor cd_dd4462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4462, buf);
    dd4462 *dp, &lv = *(dp=new (buf) dd4462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), 0, "dd4462");
    check_base_class_offset(lv, (bb62*)(cc462*), 0, "dd4462");
    check_base_class_offset(lv, (cc462*), 0, "dd4462");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4462.d");
    test_class_info(&lv, &cd_dd4462);
    dp->~dd4462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4462(Test_dd4462, "dd4462", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4462C1Ev();
extern void _ZN6dd4462D1Ev();
Name_Map name_map_dd4462[] = {
  NSPAIR(_ZN6dd4462C1Ev),
  NSPAIR(_ZN6dd4462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd4462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4462[];
extern void _ZN4bb623fooEv();
extern void _ZN6dd44623barEv();
static  VTBL_ENTRY vtc_dd4462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN6dd44623barEv,
};
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
Class_Descriptor cd_dd4462 = {  "dd4462", // class name
  bases_dd4462, 3,
  &(vtc_dd4462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4462),4, //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  ee04462  : dd4462 {
  int e;
  ~ee04462(); // tgen
  ee04462(); // tgen
};
//SIG(1 ee04462) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee04462 ::~ee04462(){ note_dtor("ee04462", this);} // tgen
ee04462 ::ee04462(){ note_ctor("ee04462", this);} // tgen

static void Test_ee04462()
{
  extern Class_Descriptor cd_ee04462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04462, buf);
    ee04462 *dp, &lv = *(dp=new (buf) ee04462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), 0, "ee04462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), 0, "ee04462");
    check_base_class_offset(lv, (cc462*)(dd4462*), 0, "ee04462");
    check_base_class_offset(lv, (dd4462*), 0, "ee04462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04462.e");
    test_class_info(&lv, &cd_ee04462);
    dp->~ee04462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04462(Test_ee04462, "ee04462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04462C1Ev();
extern void _ZN7ee04462D1Ev();
Name_Map name_map_ee04462[] = {
  NSPAIR(_ZN7ee04462C1Ev),
  NSPAIR(_ZN7ee04462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee04462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04462[];
extern void _ZN4bb623fooEv();
extern void _ZN6dd44623barEv();
static  VTBL_ENTRY vtc_ee04462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN6dd44623barEv,
};
extern VTBL_ENTRY _ZTI7ee04462[];
extern  VTBL_ENTRY _ZTV7ee04462[];
Class_Descriptor cd_ee04462 = {  "ee04462", // class name
  bases_ee04462, 4,
  &(vtc_ee04462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04462),4, //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  ee14462  : virtual dd4462 {
  int e;
  ~ee14462(); // tgen
  ee14462(); // tgen
};
//SIG(1 ee14462) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee14462 ::~ee14462(){ note_dtor("ee14462", this);} // tgen
ee14462 ::ee14462(){ note_ctor("ee14462", this);} // tgen

static void Test_ee14462()
{
  extern Class_Descriptor cd_ee14462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14462, buf);
    ee14462 *dp, &lv = *(dp=new (buf) ee14462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee14462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee14462");
    check_base_class_offset(lv, (cc462*)(dd4462*), ABISELECT(16,8), "ee14462");
    check_base_class_offset(lv, (dd4462*), ABISELECT(16,8), "ee14462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14462.e");
    test_class_info(&lv, &cd_ee14462);
    dp->~ee14462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14462(Test_ee14462, "ee14462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14462C1Ev();
extern void _ZN7ee14462D1Ev();
Name_Map name_map_ee14462[] = {
  NSPAIR(_ZN7ee14462C1Ev),
  NSPAIR(_ZN7ee14462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee14462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14462[];
extern void _ZN4bb623fooEv();
extern void _ZN6dd44623barEv();
static  VTBL_ENTRY vtc_ee14462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14462[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN6dd44623barEv,
};
extern VTBL_ENTRY _ZTV7ee14462[];
static  VTT_ENTRY vtt_ee14462[] = {
  {&(_ZTV7ee14462[3]),  3,9},
  {&(_ZTV7ee14462[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14462[];
extern  VTBL_ENTRY _ZTV7ee14462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14462[];
Class_Descriptor cd_ee14462 = {  "ee14462", // class name
  bases_ee14462, 4,
  &(vtc_ee14462[0]), // expected_vtbl_contents
  &(vtt_ee14462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14462),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14462),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  ee24462  : dd4462 {
  int e;
  virtual void  foo(); // _ZN7ee244623fooEv
  ~ee24462(); // tgen
  ee24462(); // tgen
};
//SIG(1 ee24462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee24462 ::foo(){vfunc_called(this, "_ZN7ee244623fooEv");}
ee24462 ::~ee24462(){ note_dtor("ee24462", this);} // tgen
ee24462 ::ee24462(){ note_ctor("ee24462", this);} // tgen

static void Test_ee24462()
{
  extern Class_Descriptor cd_ee24462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24462, buf);
    ee24462 *dp, &lv = *(dp=new (buf) ee24462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), 0, "ee24462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), 0, "ee24462");
    check_base_class_offset(lv, (cc462*)(dd4462*), 0, "ee24462");
    check_base_class_offset(lv, (dd4462*), 0, "ee24462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24462.e");
    test_class_info(&lv, &cd_ee24462);
    dp->~ee24462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24462(Test_ee24462, "ee24462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24462C1Ev();
extern void _ZN7ee24462D1Ev();
Name_Map name_map_ee24462[] = {
  NSPAIR(_ZN7ee24462C1Ev),
  NSPAIR(_ZN7ee24462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee24462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24462[];
extern void _ZN7ee244623fooEv();
extern void _ZN6dd44623barEv();
static  VTBL_ENTRY vtc_ee24462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24462[0]),
  (VTBL_ENTRY)&_ZN7ee244623fooEv,
  (VTBL_ENTRY)&_ZN6dd44623barEv,
};
extern VTBL_ENTRY _ZTI7ee24462[];
extern  VTBL_ENTRY _ZTV7ee24462[];
Class_Descriptor cd_ee24462 = {  "ee24462", // class name
  bases_ee24462, 4,
  &(vtc_ee24462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24462),4, //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  ee34462  : virtual dd4462 {
  int e;
  virtual void  foo(); // _ZN7ee344623fooEv
  ~ee34462(); // tgen
  ee34462(); // tgen
};
//SIG(1 ee34462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee34462 ::foo(){vfunc_called(this, "_ZN7ee344623fooEv");}
ee34462 ::~ee34462(){ note_dtor("ee34462", this);} // tgen
ee34462 ::ee34462(){ note_ctor("ee34462", this);} // tgen

static void Test_ee34462()
{
  extern Class_Descriptor cd_ee34462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34462, buf);
    ee34462 *dp, &lv = *(dp=new (buf) ee34462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee34462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee34462");
    check_base_class_offset(lv, (cc462*)(dd4462*), ABISELECT(16,8), "ee34462");
    check_base_class_offset(lv, (dd4462*), ABISELECT(16,8), "ee34462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34462.e");
    test_class_info(&lv, &cd_ee34462);
    dp->~ee34462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34462(Test_ee34462, "ee34462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34462C1Ev();
extern void _ZN7ee34462D1Ev();
Name_Map name_map_ee34462[] = {
  NSPAIR(_ZN7ee34462C1Ev),
  NSPAIR(_ZN7ee34462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee34462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34462[];
extern void _ZN7ee344623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee344623fooEv,_ZTv0_n12_N7ee344623fooEv)();
extern void ABISELECT(_ZThn16_N7ee344623fooEv,_ZThn8_N7ee344623fooEv)() __attribute__((weak));
extern void _ZN6dd44623barEv();
static  VTBL_ENTRY vtc_ee34462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34462[0]),
  (VTBL_ENTRY)&_ZN7ee344623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee344623fooEv,_ZTv0_n12_N7ee344623fooEv),
  (VTBL_ENTRY)&_ZN6dd44623barEv,
};
extern VTBL_ENTRY _ZTV7ee34462[];
static  VTT_ENTRY vtt_ee34462[] = {
  {&(_ZTV7ee34462[3]),  3,10},
  {&(_ZTV7ee34462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34462[];
extern  VTBL_ENTRY _ZTV7ee34462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34462[];
static VTBL_ENTRY alt_thunk_names1181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee344623fooEv,_ZTv0_n12_N7ee344623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee344623fooEv,_ZThn8_N7ee344623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34462 = {  "ee34462", // class name
  bases_ee34462, 4,
  &(vtc_ee34462[0]), // expected_vtbl_contents
  &(vtt_ee34462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1181,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44462  : dd4462 {
  int e;
  virtual void  bar(); // _ZN7ee444623barEv
  ~ee44462(); // tgen
  ee44462(); // tgen
};
//SIG(1 ee44462) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee44462 ::bar(){vfunc_called(this, "_ZN7ee444623barEv");}
ee44462 ::~ee44462(){ note_dtor("ee44462", this);} // tgen
ee44462 ::ee44462(){ note_ctor("ee44462", this);} // tgen

static void Test_ee44462()
{
  extern Class_Descriptor cd_ee44462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44462, buf);
    ee44462 *dp, &lv = *(dp=new (buf) ee44462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), 0, "ee44462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), 0, "ee44462");
    check_base_class_offset(lv, (cc462*)(dd4462*), 0, "ee44462");
    check_base_class_offset(lv, (dd4462*), 0, "ee44462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44462.e");
    test_class_info(&lv, &cd_ee44462);
    dp->~ee44462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44462(Test_ee44462, "ee44462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44462C1Ev();
extern void _ZN7ee44462D1Ev();
Name_Map name_map_ee44462[] = {
  NSPAIR(_ZN7ee44462C1Ev),
  NSPAIR(_ZN7ee44462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee44462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44462[];
extern void _ZN4bb623fooEv();
extern void _ZN7ee444623barEv();
static  VTBL_ENTRY vtc_ee44462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&_ZN7ee444623barEv,
};
extern VTBL_ENTRY _ZTI7ee44462[];
extern  VTBL_ENTRY _ZTV7ee44462[];
Class_Descriptor cd_ee44462 = {  "ee44462", // class name
  bases_ee44462, 4,
  &(vtc_ee44462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44462),4, //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  ee54462  : virtual dd4462 {
  int e;
  virtual void  bar(); // _ZN7ee544623barEv
  ~ee54462(); // tgen
  ee54462(); // tgen
};
//SIG(1 ee54462) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee54462 ::bar(){vfunc_called(this, "_ZN7ee544623barEv");}
ee54462 ::~ee54462(){ note_dtor("ee54462", this);} // tgen
ee54462 ::ee54462(){ note_ctor("ee54462", this);} // tgen

static void Test_ee54462()
{
  extern Class_Descriptor cd_ee54462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54462, buf);
    ee54462 *dp, &lv = *(dp=new (buf) ee54462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee54462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee54462");
    check_base_class_offset(lv, (cc462*)(dd4462*), ABISELECT(16,8), "ee54462");
    check_base_class_offset(lv, (dd4462*), ABISELECT(16,8), "ee54462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54462.e");
    test_class_info(&lv, &cd_ee54462);
    dp->~ee54462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54462(Test_ee54462, "ee54462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54462C1Ev();
extern void _ZN7ee54462D1Ev();
Name_Map name_map_ee54462[] = {
  NSPAIR(_ZN7ee54462C1Ev),
  NSPAIR(_ZN7ee54462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee54462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54462[];
extern void _ZN7ee544623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee544623barEv,_ZTv0_n16_N7ee544623barEv)();
extern void ABISELECT(_ZThn16_N7ee544623barEv,_ZThn8_N7ee544623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54462[0]),
  (VTBL_ENTRY)&_ZN7ee544623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee544623barEv,_ZTv0_n16_N7ee544623barEv),
};
extern VTBL_ENTRY _ZTV7ee54462[];
static  VTT_ENTRY vtt_ee54462[] = {
  {&(_ZTV7ee54462[3]),  3,10},
  {&(_ZTV7ee54462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54462[];
extern  VTBL_ENTRY _ZTV7ee54462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54462[];
static VTBL_ENTRY alt_thunk_names1182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee544623barEv,_ZTv0_n16_N7ee544623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee544623barEv,_ZThn8_N7ee544623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54462 = {  "ee54462", // class name
  bases_ee54462, 4,
  &(vtc_ee54462[0]), // expected_vtbl_contents
  &(vtt_ee54462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1182,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64462  : dd4462 {
  int e;
  virtual void  foo(); // _ZN7ee644623fooEv
  virtual void  bar(); // _ZN7ee644623barEv
  ~ee64462(); // tgen
  ee64462(); // tgen
};
//SIG(1 ee64462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64462 ::foo(){vfunc_called(this, "_ZN7ee644623fooEv");}
void  ee64462 ::bar(){vfunc_called(this, "_ZN7ee644623barEv");}
ee64462 ::~ee64462(){ note_dtor("ee64462", this);} // tgen
ee64462 ::ee64462(){ note_ctor("ee64462", this);} // tgen

static void Test_ee64462()
{
  extern Class_Descriptor cd_ee64462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64462, buf);
    ee64462 *dp, &lv = *(dp=new (buf) ee64462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), 0, "ee64462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), 0, "ee64462");
    check_base_class_offset(lv, (cc462*)(dd4462*), 0, "ee64462");
    check_base_class_offset(lv, (dd4462*), 0, "ee64462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64462.e");
    test_class_info(&lv, &cd_ee64462);
    dp->~ee64462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64462(Test_ee64462, "ee64462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64462C1Ev();
extern void _ZN7ee64462D1Ev();
Name_Map name_map_ee64462[] = {
  NSPAIR(_ZN7ee64462C1Ev),
  NSPAIR(_ZN7ee64462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee64462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64462[];
extern void _ZN7ee644623fooEv();
extern void _ZN7ee644623barEv();
static  VTBL_ENTRY vtc_ee64462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64462[0]),
  (VTBL_ENTRY)&_ZN7ee644623fooEv,
  (VTBL_ENTRY)&_ZN7ee644623barEv,
};
extern VTBL_ENTRY _ZTI7ee64462[];
extern  VTBL_ENTRY _ZTV7ee64462[];
Class_Descriptor cd_ee64462 = {  "ee64462", // class name
  bases_ee64462, 4,
  &(vtc_ee64462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64462),4, //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  ee74462  : virtual dd4462 {
  int e;
  virtual void  foo(); // _ZN7ee744623fooEv
  virtual void  bar(); // _ZN7ee744623barEv
  ~ee74462(); // tgen
  ee74462(); // tgen
};
//SIG(1 ee74462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74462 ::foo(){vfunc_called(this, "_ZN7ee744623fooEv");}
void  ee74462 ::bar(){vfunc_called(this, "_ZN7ee744623barEv");}
ee74462 ::~ee74462(){ note_dtor("ee74462", this);} // tgen
ee74462 ::ee74462(){ note_ctor("ee74462", this);} // tgen

static void Test_ee74462()
{
  extern Class_Descriptor cd_ee74462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74462, buf);
    ee74462 *dp, &lv = *(dp=new (buf) ee74462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee74462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd4462*), ABISELECT(16,8), "ee74462");
    check_base_class_offset(lv, (cc462*)(dd4462*), ABISELECT(16,8), "ee74462");
    check_base_class_offset(lv, (dd4462*), ABISELECT(16,8), "ee74462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74462.e");
    test_class_info(&lv, &cd_ee74462);
    dp->~ee74462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74462(Test_ee74462, "ee74462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74462C1Ev();
extern void _ZN7ee74462D1Ev();
Name_Map name_map_ee74462[] = {
  NSPAIR(_ZN7ee74462C1Ev),
  NSPAIR(_ZN7ee74462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd4462;
extern VTBL_ENTRY _ZTI6dd4462[];
extern  VTBL_ENTRY _ZTV6dd4462[];
static Base_Class bases_ee74462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4462,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74462[];
extern void _ZN7ee744623fooEv();
extern void _ZN7ee744623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee744623fooEv,_ZTv0_n12_N7ee744623fooEv)();
extern void ABISELECT(_ZThn16_N7ee744623fooEv,_ZThn8_N7ee744623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee744623barEv,_ZTv0_n16_N7ee744623barEv)();
extern void ABISELECT(_ZThn16_N7ee744623barEv,_ZThn8_N7ee744623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74462[0]),
  (VTBL_ENTRY)&_ZN7ee744623fooEv,
  (VTBL_ENTRY)&_ZN7ee744623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee744623fooEv,_ZTv0_n12_N7ee744623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee744623barEv,_ZTv0_n16_N7ee744623barEv),
};
extern VTBL_ENTRY _ZTV7ee74462[];
static  VTT_ENTRY vtt_ee74462[] = {
  {&(_ZTV7ee74462[3]),  3,11},
  {&(_ZTV7ee74462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74462[];
extern  VTBL_ENTRY _ZTV7ee74462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74462[];
static VTBL_ENTRY alt_thunk_names1183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee744623barEv,_ZTv0_n16_N7ee744623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee744623barEv,_ZThn8_N7ee744623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee744623fooEv,_ZTv0_n12_N7ee744623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee744623fooEv,_ZThn8_N7ee744623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74462 = {  "ee74462", // class name
  bases_ee74462, 4,
  &(vtc_ee74462[0]), // expected_vtbl_contents
  &(vtt_ee74462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1183,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5462  : virtual cc462 {
  int d;
  virtual void  bar(); // _ZN6dd54623barEv
  ~dd5462(); // tgen
  dd5462(); // tgen
};
//SIG(-1 dd5462) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd5462 ::bar(){vfunc_called(this, "_ZN6dd54623barEv");}
dd5462 ::~dd5462(){ note_dtor("dd5462", this);} // tgen
dd5462 ::dd5462(){ note_ctor("dd5462", this);} // tgen

static void Test_dd5462()
{
  extern Class_Descriptor cd_dd5462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5462, buf);
    dd5462 *dp, &lv = *(dp=new (buf) dd5462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,8), "dd5462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,8), "dd5462");
    check_base_class_offset(lv, (cc462*), ABISELECT(16,8), "dd5462");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5462.d");
    test_class_info(&lv, &cd_dd5462);
    dp->~dd5462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5462(Test_dd5462, "dd5462", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5462C1Ev();
extern void _ZN6dd5462D1Ev();
Name_Map name_map_dd5462[] = {
  NSPAIR(_ZN6dd5462C1Ev),
  NSPAIR(_ZN6dd5462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd5462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5462[];
extern void _ZN6dd54623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
extern VTBL_ENTRY _ZTV6dd5462[];
static  VTT_ENTRY vtt_dd5462[] = {
  {&(_ZTV6dd5462[3]),  3,10},
  {&(_ZTV6dd5462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static VTBL_ENTRY alt_thunk_names1184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5462 = {  "dd5462", // class name
  bases_dd5462, 3,
  &(vtc_dd5462[0]), // expected_vtbl_contents
  &(vtt_dd5462[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5462),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1184,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05462  : dd5462 {
  int e;
  ~ee05462(); // tgen
  ee05462(); // tgen
};
//SIG(1 ee05462) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee05462 ::~ee05462(){ note_dtor("ee05462", this);} // tgen
ee05462 ::ee05462(){ note_ctor("ee05462", this);} // tgen

static void Test_ee05462()
{
  extern Class_Descriptor cd_ee05462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05462, buf);
    ee05462 *dp, &lv = *(dp=new (buf) ee05462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee05462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee05462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(16,12), "ee05462");
    check_base_class_offset(lv, (dd5462*), 0, "ee05462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05462.e");
    test_class_info(&lv, &cd_ee05462);
    dp->~ee05462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05462(Test_ee05462, "ee05462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05462C1Ev();
extern void _ZN7ee05462D1Ev();
Name_Map name_map_ee05462[] = {
  NSPAIR(_ZN7ee05462C1Ev),
  NSPAIR(_ZN7ee05462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee05462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05462[];
extern void _ZN6dd54623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
extern VTBL_ENTRY _ZTV7ee05462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee05462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee05462[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee05462[] = {
  {&(_ZTV7ee05462[3]),  3,10},
  {&(_tg__ZTV6dd5462__7ee05462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee05462[4]),  4,6},
  {&(_ZTV7ee05462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05462[];
extern  VTBL_ENTRY _ZTV7ee05462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05462[];
static VTBL_ENTRY alt_thunk_names1185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05462 = {  "ee05462", // class name
  bases_ee05462, 4,
  &(vtc_ee05462[0]), // expected_vtbl_contents
  &(vtt_ee05462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1185,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15462  : virtual dd5462 {
  int e;
  ~ee15462(); // tgen
  ee15462(); // tgen
};
//SIG(1 ee15462) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee15462 ::~ee15462(){ note_dtor("ee15462", this);} // tgen
ee15462 ::ee15462(){ note_ctor("ee15462", this);} // tgen

static void Test_ee15462()
{
  extern Class_Descriptor cd_ee15462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15462, buf);
    ee15462 *dp, &lv = *(dp=new (buf) ee15462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee15462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee15462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(32,16), "ee15462");
    check_base_class_offset(lv, (dd5462*), ABISELECT(16,8), "ee15462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15462.e");
    test_class_info(&lv, &cd_ee15462);
    dp->~ee15462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15462(Test_ee15462, "ee15462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15462C1Ev();
extern void _ZN7ee15462D1Ev();
Name_Map name_map_ee15462[] = {
  NSPAIR(_ZN7ee15462C1Ev),
  NSPAIR(_ZN7ee15462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee15462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15462[];
extern void _ZN6dd54623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15462[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
extern VTBL_ENTRY _ZTV7ee15462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee15462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee15462[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee15462[] = {
  {&(_ZTV7ee15462[4]),  4,15},
  {&(_ZTV7ee15462[8]),  8,15},
  {&(_ZTV7ee15462[13]),  13,15},
  {&(_tg__ZTV6dd5462__7ee15462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee15462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15462[];
extern  VTBL_ENTRY _ZTV7ee15462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15462[];
static VTBL_ENTRY alt_thunk_names1186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15462 = {  "ee15462", // class name
  bases_ee15462, 4,
  &(vtc_ee15462[0]), // expected_vtbl_contents
  &(vtt_ee15462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15462),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1186,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25462  : dd5462 {
  int e;
  virtual void  foo(); // _ZN7ee254623fooEv
  ~ee25462(); // tgen
  ee25462(); // tgen
};
//SIG(1 ee25462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee25462 ::foo(){vfunc_called(this, "_ZN7ee254623fooEv");}
ee25462 ::~ee25462(){ note_dtor("ee25462", this);} // tgen
ee25462 ::ee25462(){ note_ctor("ee25462", this);} // tgen

static void Test_ee25462()
{
  extern Class_Descriptor cd_ee25462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25462, buf);
    ee25462 *dp, &lv = *(dp=new (buf) ee25462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee25462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee25462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(16,12), "ee25462");
    check_base_class_offset(lv, (dd5462*), 0, "ee25462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25462.e");
    test_class_info(&lv, &cd_ee25462);
    dp->~ee25462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25462(Test_ee25462, "ee25462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25462C1Ev();
extern void _ZN7ee25462D1Ev();
Name_Map name_map_ee25462[] = {
  NSPAIR(_ZN7ee25462C1Ev),
  NSPAIR(_ZN7ee25462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee25462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25462[];
extern void _ZN6dd54623barEv();
extern void _ZN7ee254623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee254623fooEv,_ZTv0_n12_N7ee254623fooEv)();
extern void ABISELECT(_ZThn16_N7ee254623fooEv,_ZThn12_N7ee254623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
  (VTBL_ENTRY)&_ZN7ee254623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee254623fooEv,_ZTv0_n12_N7ee254623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
extern VTBL_ENTRY _ZTV7ee25462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee25462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee25462[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee25462[] = {
  {&(_ZTV7ee25462[3]),  3,11},
  {&(_tg__ZTV6dd5462__7ee25462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee25462[4]),  4,6},
  {&(_ZTV7ee25462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25462[];
extern  VTBL_ENTRY _ZTV7ee25462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25462[];
static VTBL_ENTRY alt_thunk_names1187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee254623fooEv,_ZTv0_n12_N7ee254623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee254623fooEv,_ZThn12_N7ee254623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25462 = {  "ee25462", // class name
  bases_ee25462, 4,
  &(vtc_ee25462[0]), // expected_vtbl_contents
  &(vtt_ee25462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1187,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35462  : virtual dd5462 {
  int e;
  virtual void  foo(); // _ZN7ee354623fooEv
  ~ee35462(); // tgen
  ee35462(); // tgen
};
//SIG(1 ee35462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee35462 ::foo(){vfunc_called(this, "_ZN7ee354623fooEv");}
ee35462 ::~ee35462(){ note_dtor("ee35462", this);} // tgen
ee35462 ::ee35462(){ note_ctor("ee35462", this);} // tgen

static void Test_ee35462()
{
  extern Class_Descriptor cd_ee35462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35462, buf);
    ee35462 *dp, &lv = *(dp=new (buf) ee35462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee35462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee35462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(32,16), "ee35462");
    check_base_class_offset(lv, (dd5462*), ABISELECT(16,8), "ee35462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35462.e");
    test_class_info(&lv, &cd_ee35462);
    dp->~ee35462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35462(Test_ee35462, "ee35462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35462C1Ev();
extern void _ZN7ee35462D1Ev();
Name_Map name_map_ee35462[] = {
  NSPAIR(_ZN7ee35462C1Ev),
  NSPAIR(_ZN7ee35462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee35462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35462[];
extern void _ZN7ee354623fooEv();
extern void _ZN6dd54623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee354623fooEv,_ZTv0_n12_N7ee354623fooEv)();
extern void ABISELECT(_ZThn32_N7ee354623fooEv,_ZThn16_N7ee354623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35462[0]),
  (VTBL_ENTRY)&_ZN7ee354623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee354623fooEv,_ZTv0_n12_N7ee354623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
extern VTBL_ENTRY _ZTV7ee35462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee35462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee35462[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee35462[] = {
  {&(_ZTV7ee35462[4]),  4,16},
  {&(_ZTV7ee35462[9]),  9,16},
  {&(_ZTV7ee35462[14]),  14,16},
  {&(_tg__ZTV6dd5462__7ee35462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee35462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35462[];
extern  VTBL_ENTRY _ZTV7ee35462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35462[];
static VTBL_ENTRY alt_thunk_names1188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee354623fooEv,_ZTv0_n12_N7ee354623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee354623fooEv,_ZThn16_N7ee354623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35462 = {  "ee35462", // class name
  bases_ee35462, 4,
  &(vtc_ee35462[0]), // expected_vtbl_contents
  &(vtt_ee35462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35462),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45462  : dd5462 {
  int e;
  virtual void  bar(); // _ZN7ee454623barEv
  ~ee45462(); // tgen
  ee45462(); // tgen
};
//SIG(1 ee45462) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee45462 ::bar(){vfunc_called(this, "_ZN7ee454623barEv");}
ee45462 ::~ee45462(){ note_dtor("ee45462", this);} // tgen
ee45462 ::ee45462(){ note_ctor("ee45462", this);} // tgen

static void Test_ee45462()
{
  extern Class_Descriptor cd_ee45462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45462, buf);
    ee45462 *dp, &lv = *(dp=new (buf) ee45462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee45462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee45462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(16,12), "ee45462");
    check_base_class_offset(lv, (dd5462*), 0, "ee45462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45462.e");
    test_class_info(&lv, &cd_ee45462);
    dp->~ee45462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45462(Test_ee45462, "ee45462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45462C1Ev();
extern void _ZN7ee45462D1Ev();
Name_Map name_map_ee45462[] = {
  NSPAIR(_ZN7ee45462C1Ev),
  NSPAIR(_ZN7ee45462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee45462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45462[];
extern void _ZN7ee454623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee454623barEv,_ZTv0_n16_N7ee454623barEv)();
extern void ABISELECT(_ZThn16_N7ee454623barEv,_ZThn12_N7ee454623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45462[0]),
  (VTBL_ENTRY)&_ZN7ee454623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee454623barEv,_ZTv0_n16_N7ee454623barEv),
};
extern VTBL_ENTRY _ZTV7ee45462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee45462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee45462[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee45462[] = {
  {&(_ZTV7ee45462[3]),  3,10},
  {&(_tg__ZTV6dd5462__7ee45462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee45462[4]),  4,6},
  {&(_ZTV7ee45462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45462[];
extern  VTBL_ENTRY _ZTV7ee45462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45462[];
static VTBL_ENTRY alt_thunk_names1189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee454623barEv,_ZTv0_n16_N7ee454623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee454623barEv,_ZThn12_N7ee454623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45462 = {  "ee45462", // class name
  bases_ee45462, 4,
  &(vtc_ee45462[0]), // expected_vtbl_contents
  &(vtt_ee45462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1189,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55462  : virtual dd5462 {
  int e;
  virtual void  bar(); // _ZN7ee554623barEv
  ~ee55462(); // tgen
  ee55462(); // tgen
};
//SIG(1 ee55462) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee55462 ::bar(){vfunc_called(this, "_ZN7ee554623barEv");}
ee55462 ::~ee55462(){ note_dtor("ee55462", this);} // tgen
ee55462 ::ee55462(){ note_ctor("ee55462", this);} // tgen

static void Test_ee55462()
{
  extern Class_Descriptor cd_ee55462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55462, buf);
    ee55462 *dp, &lv = *(dp=new (buf) ee55462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee55462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee55462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(32,16), "ee55462");
    check_base_class_offset(lv, (dd5462*), ABISELECT(16,8), "ee55462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55462.e");
    test_class_info(&lv, &cd_ee55462);
    dp->~ee55462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55462(Test_ee55462, "ee55462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55462C1Ev();
extern void _ZN7ee55462D1Ev();
Name_Map name_map_ee55462[] = {
  NSPAIR(_ZN7ee55462C1Ev),
  NSPAIR(_ZN7ee55462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee55462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55462[];
extern void _ZN7ee554623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee554623barEv,_ZTv0_n16_N7ee554623barEv)();
extern void ABISELECT(_ZThn16_N7ee554623barEv,_ZThn8_N7ee554623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee554623barEv,_ZTv0_n16_N7ee554623barEv)();
extern void ABISELECT(_ZThn32_N7ee554623barEv,_ZThn16_N7ee554623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55462[0]),
  (VTBL_ENTRY)&_ZN7ee554623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee554623barEv,_ZTv0_n16_N7ee554623barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee554623barEv,_ZTv0_n16_N7ee554623barEv),
};
extern VTBL_ENTRY _ZTV7ee55462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee55462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee55462[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee55462[] = {
  {&(_ZTV7ee55462[4]),  4,16},
  {&(_ZTV7ee55462[9]),  9,16},
  {&(_ZTV7ee55462[14]),  14,16},
  {&(_tg__ZTV6dd5462__7ee55462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee55462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55462[];
extern  VTBL_ENTRY _ZTV7ee55462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55462[];
static VTBL_ENTRY alt_thunk_names1190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee554623barEv,_ZTv0_n16_N7ee554623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee554623barEv,_ZThn16_N7ee554623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee554623barEv,_ZThn8_N7ee554623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55462 = {  "ee55462", // class name
  bases_ee55462, 4,
  &(vtc_ee55462[0]), // expected_vtbl_contents
  &(vtt_ee55462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55462),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1190,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65462  : dd5462 {
  int e;
  virtual void  foo(); // _ZN7ee654623fooEv
  virtual void  bar(); // _ZN7ee654623barEv
  ~ee65462(); // tgen
  ee65462(); // tgen
};
//SIG(1 ee65462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65462 ::foo(){vfunc_called(this, "_ZN7ee654623fooEv");}
void  ee65462 ::bar(){vfunc_called(this, "_ZN7ee654623barEv");}
ee65462 ::~ee65462(){ note_dtor("ee65462", this);} // tgen
ee65462 ::ee65462(){ note_ctor("ee65462", this);} // tgen

static void Test_ee65462()
{
  extern Class_Descriptor cd_ee65462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65462, buf);
    ee65462 *dp, &lv = *(dp=new (buf) ee65462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee65462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee65462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(16,12), "ee65462");
    check_base_class_offset(lv, (dd5462*), 0, "ee65462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65462.e");
    test_class_info(&lv, &cd_ee65462);
    dp->~ee65462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65462(Test_ee65462, "ee65462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65462C1Ev();
extern void _ZN7ee65462D1Ev();
Name_Map name_map_ee65462[] = {
  NSPAIR(_ZN7ee65462C1Ev),
  NSPAIR(_ZN7ee65462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee65462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65462[];
extern void _ZN7ee654623barEv();
extern void _ZN7ee654623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee654623fooEv,_ZTv0_n12_N7ee654623fooEv)();
extern void ABISELECT(_ZThn16_N7ee654623fooEv,_ZThn12_N7ee654623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee654623barEv,_ZTv0_n16_N7ee654623barEv)();
extern void ABISELECT(_ZThn16_N7ee654623barEv,_ZThn12_N7ee654623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65462[0]),
  (VTBL_ENTRY)&_ZN7ee654623barEv,
  (VTBL_ENTRY)&_ZN7ee654623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee654623fooEv,_ZTv0_n12_N7ee654623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee654623barEv,_ZTv0_n16_N7ee654623barEv),
};
extern VTBL_ENTRY _ZTV7ee65462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee65462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee65462[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee65462[] = {
  {&(_ZTV7ee65462[3]),  3,11},
  {&(_tg__ZTV6dd5462__7ee65462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee65462[4]),  4,6},
  {&(_ZTV7ee65462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65462[];
extern  VTBL_ENTRY _ZTV7ee65462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65462[];
static VTBL_ENTRY alt_thunk_names1191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn12_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee654623barEv,_ZTv0_n16_N7ee654623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee654623barEv,_ZThn12_N7ee654623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee654623fooEv,_ZTv0_n12_N7ee654623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee654623fooEv,_ZThn12_N7ee654623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65462 = {  "ee65462", // class name
  bases_ee65462, 4,
  &(vtc_ee65462[0]), // expected_vtbl_contents
  &(vtt_ee65462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1191,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75462  : virtual dd5462 {
  int e;
  virtual void  foo(); // _ZN7ee754623fooEv
  virtual void  bar(); // _ZN7ee754623barEv
  ~ee75462(); // tgen
  ee75462(); // tgen
};
//SIG(1 ee75462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75462 ::foo(){vfunc_called(this, "_ZN7ee754623fooEv");}
void  ee75462 ::bar(){vfunc_called(this, "_ZN7ee754623barEv");}
ee75462 ::~ee75462(){ note_dtor("ee75462", this);} // tgen
ee75462 ::ee75462(){ note_ctor("ee75462", this);} // tgen

static void Test_ee75462()
{
  extern Class_Descriptor cd_ee75462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75462, buf);
    ee75462 *dp, &lv = *(dp=new (buf) ee75462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee75462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee75462");
    check_base_class_offset(lv, (cc462*)(dd5462*), ABISELECT(32,16), "ee75462");
    check_base_class_offset(lv, (dd5462*), ABISELECT(16,8), "ee75462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75462.e");
    test_class_info(&lv, &cd_ee75462);
    dp->~ee75462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75462(Test_ee75462, "ee75462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75462C1Ev();
extern void _ZN7ee75462D1Ev();
Name_Map name_map_ee75462[] = {
  NSPAIR(_ZN7ee75462C1Ev),
  NSPAIR(_ZN7ee75462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd5462;
extern VTBL_ENTRY _ZTI6dd5462[];
extern  VTBL_ENTRY _ZTV6dd5462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5462[];
static Base_Class bases_ee75462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5462,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75462[];
extern void _ZN7ee754623fooEv();
extern void _ZN7ee754623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee754623barEv,_ZTv0_n16_N7ee754623barEv)();
extern void ABISELECT(_ZThn16_N7ee754623barEv,_ZThn8_N7ee754623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee754623fooEv,_ZTv0_n12_N7ee754623fooEv)();
extern void ABISELECT(_ZThn32_N7ee754623fooEv,_ZThn16_N7ee754623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee754623barEv,_ZTv0_n16_N7ee754623barEv)();
extern void ABISELECT(_ZThn32_N7ee754623barEv,_ZThn16_N7ee754623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75462[0]),
  (VTBL_ENTRY)&_ZN7ee754623fooEv,
  (VTBL_ENTRY)&_ZN7ee754623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee754623barEv,_ZTv0_n16_N7ee754623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee754623fooEv,_ZTv0_n12_N7ee754623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee754623barEv,_ZTv0_n16_N7ee754623barEv),
};
extern VTBL_ENTRY _ZTV7ee75462[];
extern void _ZN6dd54623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5462__7ee75462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN6dd54623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv)();
extern void ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd5462__7ee75462[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5462[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv),
};
static  VTT_ENTRY vtt_ee75462[] = {
  {&(_ZTV7ee75462[4]),  4,17},
  {&(_ZTV7ee75462[10]),  10,17},
  {&(_ZTV7ee75462[15]),  15,17},
  {&(_tg__ZTV6dd5462__7ee75462[3]),  3,4},
  {&(_tg__ZTV5cc462__6dd5462__7ee75462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75462[];
extern  VTBL_ENTRY _ZTV7ee75462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75462[];
static VTBL_ENTRY alt_thunk_names1192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd54623barEv,_ZTv0_n16_N6dd54623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd54623barEv,_ZThn8_N6dd54623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee754623fooEv,_ZTv0_n12_N7ee754623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee754623fooEv,_ZThn16_N7ee754623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee754623barEv,_ZTv0_n16_N7ee754623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee754623barEv,_ZThn16_N7ee754623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee754623barEv,_ZThn8_N7ee754623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75462 = {  "ee75462", // class name
  bases_ee75462, 4,
  &(vtc_ee75462[0]), // expected_vtbl_contents
  &(vtt_ee75462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75462),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1192,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6462  : cc462 {
  int d;
  virtual void  bar(); // _ZN6dd64623barEv
  virtual void  foo(); // _ZN6dd64623fooEv
  ~dd6462(); // tgen
  dd6462(); // tgen
};
//SIG(-1 dd6462) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd6462 ::bar(){vfunc_called(this, "_ZN6dd64623barEv");}
void  dd6462 ::foo(){vfunc_called(this, "_ZN6dd64623fooEv");}
dd6462 ::~dd6462(){ note_dtor("dd6462", this);} // tgen
dd6462 ::dd6462(){ note_ctor("dd6462", this);} // tgen

static void Test_dd6462()
{
  extern Class_Descriptor cd_dd6462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6462, buf);
    dd6462 *dp, &lv = *(dp=new (buf) dd6462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), 0, "dd6462");
    check_base_class_offset(lv, (bb62*)(cc462*), 0, "dd6462");
    check_base_class_offset(lv, (cc462*), 0, "dd6462");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6462.d");
    test_class_info(&lv, &cd_dd6462);
    dp->~dd6462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6462(Test_dd6462, "dd6462", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6462C1Ev();
extern void _ZN6dd6462D1Ev();
Name_Map name_map_dd6462[] = {
  NSPAIR(_ZN6dd6462C1Ev),
  NSPAIR(_ZN6dd6462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd6462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6462[];
extern void _ZN6dd64623fooEv();
extern void _ZN6dd64623barEv();
static  VTBL_ENTRY vtc_dd6462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6462[0]),
  (VTBL_ENTRY)&_ZN6dd64623fooEv,
  (VTBL_ENTRY)&_ZN6dd64623barEv,
};
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
Class_Descriptor cd_dd6462 = {  "dd6462", // class name
  bases_dd6462, 3,
  &(vtc_dd6462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6462),4, //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  ee06462  : dd6462 {
  int e;
  ~ee06462(); // tgen
  ee06462(); // tgen
};
//SIG(1 ee06462) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee06462 ::~ee06462(){ note_dtor("ee06462", this);} // tgen
ee06462 ::ee06462(){ note_ctor("ee06462", this);} // tgen

static void Test_ee06462()
{
  extern Class_Descriptor cd_ee06462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06462, buf);
    ee06462 *dp, &lv = *(dp=new (buf) ee06462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), 0, "ee06462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), 0, "ee06462");
    check_base_class_offset(lv, (cc462*)(dd6462*), 0, "ee06462");
    check_base_class_offset(lv, (dd6462*), 0, "ee06462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06462.e");
    test_class_info(&lv, &cd_ee06462);
    dp->~ee06462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06462(Test_ee06462, "ee06462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06462C1Ev();
extern void _ZN7ee06462D1Ev();
Name_Map name_map_ee06462[] = {
  NSPAIR(_ZN7ee06462C1Ev),
  NSPAIR(_ZN7ee06462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee06462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06462[];
extern void _ZN6dd64623fooEv();
extern void _ZN6dd64623barEv();
static  VTBL_ENTRY vtc_ee06462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06462[0]),
  (VTBL_ENTRY)&_ZN6dd64623fooEv,
  (VTBL_ENTRY)&_ZN6dd64623barEv,
};
extern VTBL_ENTRY _ZTI7ee06462[];
extern  VTBL_ENTRY _ZTV7ee06462[];
Class_Descriptor cd_ee06462 = {  "ee06462", // class name
  bases_ee06462, 4,
  &(vtc_ee06462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06462),4, //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  ee16462  : virtual dd6462 {
  int e;
  ~ee16462(); // tgen
  ee16462(); // tgen
};
//SIG(1 ee16462) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee16462 ::~ee16462(){ note_dtor("ee16462", this);} // tgen
ee16462 ::ee16462(){ note_ctor("ee16462", this);} // tgen

static void Test_ee16462()
{
  extern Class_Descriptor cd_ee16462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16462, buf);
    ee16462 *dp, &lv = *(dp=new (buf) ee16462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee16462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee16462");
    check_base_class_offset(lv, (cc462*)(dd6462*), ABISELECT(16,8), "ee16462");
    check_base_class_offset(lv, (dd6462*), ABISELECT(16,8), "ee16462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16462.e");
    test_class_info(&lv, &cd_ee16462);
    dp->~ee16462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16462(Test_ee16462, "ee16462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16462C1Ev();
extern void _ZN7ee16462D1Ev();
Name_Map name_map_ee16462[] = {
  NSPAIR(_ZN7ee16462C1Ev),
  NSPAIR(_ZN7ee16462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee16462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16462[];
extern void _ZN6dd64623fooEv();
extern void _ZN6dd64623barEv();
static  VTBL_ENTRY vtc_ee16462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16462[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16462[0]),
  (VTBL_ENTRY)&_ZN6dd64623fooEv,
  (VTBL_ENTRY)&_ZN6dd64623barEv,
};
extern VTBL_ENTRY _ZTV7ee16462[];
static  VTT_ENTRY vtt_ee16462[] = {
  {&(_ZTV7ee16462[3]),  3,9},
  {&(_ZTV7ee16462[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16462[];
extern  VTBL_ENTRY _ZTV7ee16462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16462[];
Class_Descriptor cd_ee16462 = {  "ee16462", // class name
  bases_ee16462, 4,
  &(vtc_ee16462[0]), // expected_vtbl_contents
  &(vtt_ee16462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16462),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16462),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  ee26462  : dd6462 {
  int e;
  virtual void  foo(); // _ZN7ee264623fooEv
  ~ee26462(); // tgen
  ee26462(); // tgen
};
//SIG(1 ee26462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26462 ::foo(){vfunc_called(this, "_ZN7ee264623fooEv");}
ee26462 ::~ee26462(){ note_dtor("ee26462", this);} // tgen
ee26462 ::ee26462(){ note_ctor("ee26462", this);} // tgen

static void Test_ee26462()
{
  extern Class_Descriptor cd_ee26462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26462, buf);
    ee26462 *dp, &lv = *(dp=new (buf) ee26462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), 0, "ee26462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), 0, "ee26462");
    check_base_class_offset(lv, (cc462*)(dd6462*), 0, "ee26462");
    check_base_class_offset(lv, (dd6462*), 0, "ee26462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26462.e");
    test_class_info(&lv, &cd_ee26462);
    dp->~ee26462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26462(Test_ee26462, "ee26462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26462C1Ev();
extern void _ZN7ee26462D1Ev();
Name_Map name_map_ee26462[] = {
  NSPAIR(_ZN7ee26462C1Ev),
  NSPAIR(_ZN7ee26462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee26462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26462[];
extern void _ZN7ee264623fooEv();
extern void _ZN6dd64623barEv();
static  VTBL_ENTRY vtc_ee26462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26462[0]),
  (VTBL_ENTRY)&_ZN7ee264623fooEv,
  (VTBL_ENTRY)&_ZN6dd64623barEv,
};
extern VTBL_ENTRY _ZTI7ee26462[];
extern  VTBL_ENTRY _ZTV7ee26462[];
Class_Descriptor cd_ee26462 = {  "ee26462", // class name
  bases_ee26462, 4,
  &(vtc_ee26462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26462),4, //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  ee36462  : virtual dd6462 {
  int e;
  virtual void  foo(); // _ZN7ee364623fooEv
  ~ee36462(); // tgen
  ee36462(); // tgen
};
//SIG(1 ee36462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36462 ::foo(){vfunc_called(this, "_ZN7ee364623fooEv");}
ee36462 ::~ee36462(){ note_dtor("ee36462", this);} // tgen
ee36462 ::ee36462(){ note_ctor("ee36462", this);} // tgen

static void Test_ee36462()
{
  extern Class_Descriptor cd_ee36462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36462, buf);
    ee36462 *dp, &lv = *(dp=new (buf) ee36462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee36462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee36462");
    check_base_class_offset(lv, (cc462*)(dd6462*), ABISELECT(16,8), "ee36462");
    check_base_class_offset(lv, (dd6462*), ABISELECT(16,8), "ee36462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36462.e");
    test_class_info(&lv, &cd_ee36462);
    dp->~ee36462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36462(Test_ee36462, "ee36462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36462C1Ev();
extern void _ZN7ee36462D1Ev();
Name_Map name_map_ee36462[] = {
  NSPAIR(_ZN7ee36462C1Ev),
  NSPAIR(_ZN7ee36462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee36462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36462[];
extern void _ZN7ee364623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee364623fooEv,_ZTv0_n12_N7ee364623fooEv)();
extern void ABISELECT(_ZThn16_N7ee364623fooEv,_ZThn8_N7ee364623fooEv)() __attribute__((weak));
extern void _ZN6dd64623barEv();
static  VTBL_ENTRY vtc_ee36462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36462[0]),
  (VTBL_ENTRY)&_ZN7ee364623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee364623fooEv,_ZTv0_n12_N7ee364623fooEv),
  (VTBL_ENTRY)&_ZN6dd64623barEv,
};
extern VTBL_ENTRY _ZTV7ee36462[];
static  VTT_ENTRY vtt_ee36462[] = {
  {&(_ZTV7ee36462[3]),  3,10},
  {&(_ZTV7ee36462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36462[];
extern  VTBL_ENTRY _ZTV7ee36462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36462[];
static VTBL_ENTRY alt_thunk_names1193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee364623fooEv,_ZTv0_n12_N7ee364623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee364623fooEv,_ZThn8_N7ee364623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36462 = {  "ee36462", // class name
  bases_ee36462, 4,
  &(vtc_ee36462[0]), // expected_vtbl_contents
  &(vtt_ee36462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1193,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46462  : dd6462 {
  int e;
  virtual void  bar(); // _ZN7ee464623barEv
  ~ee46462(); // tgen
  ee46462(); // tgen
};
//SIG(1 ee46462) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46462 ::bar(){vfunc_called(this, "_ZN7ee464623barEv");}
ee46462 ::~ee46462(){ note_dtor("ee46462", this);} // tgen
ee46462 ::ee46462(){ note_ctor("ee46462", this);} // tgen

static void Test_ee46462()
{
  extern Class_Descriptor cd_ee46462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46462, buf);
    ee46462 *dp, &lv = *(dp=new (buf) ee46462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), 0, "ee46462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), 0, "ee46462");
    check_base_class_offset(lv, (cc462*)(dd6462*), 0, "ee46462");
    check_base_class_offset(lv, (dd6462*), 0, "ee46462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46462.e");
    test_class_info(&lv, &cd_ee46462);
    dp->~ee46462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46462(Test_ee46462, "ee46462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46462C1Ev();
extern void _ZN7ee46462D1Ev();
Name_Map name_map_ee46462[] = {
  NSPAIR(_ZN7ee46462C1Ev),
  NSPAIR(_ZN7ee46462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee46462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46462[];
extern void _ZN6dd64623fooEv();
extern void _ZN7ee464623barEv();
static  VTBL_ENTRY vtc_ee46462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46462[0]),
  (VTBL_ENTRY)&_ZN6dd64623fooEv,
  (VTBL_ENTRY)&_ZN7ee464623barEv,
};
extern VTBL_ENTRY _ZTI7ee46462[];
extern  VTBL_ENTRY _ZTV7ee46462[];
Class_Descriptor cd_ee46462 = {  "ee46462", // class name
  bases_ee46462, 4,
  &(vtc_ee46462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46462),4, //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  ee56462  : virtual dd6462 {
  int e;
  virtual void  bar(); // _ZN7ee564623barEv
  ~ee56462(); // tgen
  ee56462(); // tgen
};
//SIG(1 ee56462) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56462 ::bar(){vfunc_called(this, "_ZN7ee564623barEv");}
ee56462 ::~ee56462(){ note_dtor("ee56462", this);} // tgen
ee56462 ::ee56462(){ note_ctor("ee56462", this);} // tgen

static void Test_ee56462()
{
  extern Class_Descriptor cd_ee56462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56462, buf);
    ee56462 *dp, &lv = *(dp=new (buf) ee56462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee56462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee56462");
    check_base_class_offset(lv, (cc462*)(dd6462*), ABISELECT(16,8), "ee56462");
    check_base_class_offset(lv, (dd6462*), ABISELECT(16,8), "ee56462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56462.e");
    test_class_info(&lv, &cd_ee56462);
    dp->~ee56462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56462(Test_ee56462, "ee56462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56462C1Ev();
extern void _ZN7ee56462D1Ev();
Name_Map name_map_ee56462[] = {
  NSPAIR(_ZN7ee56462C1Ev),
  NSPAIR(_ZN7ee56462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee56462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56462[];
extern void _ZN7ee564623barEv();
extern void _ZN6dd64623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee564623barEv,_ZTv0_n16_N7ee564623barEv)();
extern void ABISELECT(_ZThn16_N7ee564623barEv,_ZThn8_N7ee564623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56462[0]),
  (VTBL_ENTRY)&_ZN7ee564623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56462[0]),
  (VTBL_ENTRY)&_ZN6dd64623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee564623barEv,_ZTv0_n16_N7ee564623barEv),
};
extern VTBL_ENTRY _ZTV7ee56462[];
static  VTT_ENTRY vtt_ee56462[] = {
  {&(_ZTV7ee56462[3]),  3,10},
  {&(_ZTV7ee56462[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56462[];
extern  VTBL_ENTRY _ZTV7ee56462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56462[];
static VTBL_ENTRY alt_thunk_names1194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee564623barEv,_ZTv0_n16_N7ee564623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee564623barEv,_ZThn8_N7ee564623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56462 = {  "ee56462", // class name
  bases_ee56462, 4,
  &(vtc_ee56462[0]), // expected_vtbl_contents
  &(vtt_ee56462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56462),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1194,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66462  : dd6462 {
  int e;
  virtual void  foo(); // _ZN7ee664623fooEv
  virtual void  bar(); // _ZN7ee664623barEv
  ~ee66462(); // tgen
  ee66462(); // tgen
};
//SIG(1 ee66462) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66462 ::foo(){vfunc_called(this, "_ZN7ee664623fooEv");}
void  ee66462 ::bar(){vfunc_called(this, "_ZN7ee664623barEv");}
ee66462 ::~ee66462(){ note_dtor("ee66462", this);} // tgen
ee66462 ::ee66462(){ note_ctor("ee66462", this);} // tgen

static void Test_ee66462()
{
  extern Class_Descriptor cd_ee66462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66462, buf);
    ee66462 *dp, &lv = *(dp=new (buf) ee66462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), 0, "ee66462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), 0, "ee66462");
    check_base_class_offset(lv, (cc462*)(dd6462*), 0, "ee66462");
    check_base_class_offset(lv, (dd6462*), 0, "ee66462");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66462.e");
    test_class_info(&lv, &cd_ee66462);
    dp->~ee66462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66462(Test_ee66462, "ee66462", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66462C1Ev();
extern void _ZN7ee66462D1Ev();
Name_Map name_map_ee66462[] = {
  NSPAIR(_ZN7ee66462C1Ev),
  NSPAIR(_ZN7ee66462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee66462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66462[];
extern void _ZN7ee664623fooEv();
extern void _ZN7ee664623barEv();
static  VTBL_ENTRY vtc_ee66462[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66462[0]),
  (VTBL_ENTRY)&_ZN7ee664623fooEv,
  (VTBL_ENTRY)&_ZN7ee664623barEv,
};
extern VTBL_ENTRY _ZTI7ee66462[];
extern  VTBL_ENTRY _ZTV7ee66462[];
Class_Descriptor cd_ee66462 = {  "ee66462", // class name
  bases_ee66462, 4,
  &(vtc_ee66462[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66462),4, //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  ee76462  : virtual dd6462 {
  int e;
  virtual void  foo(); // _ZN7ee764623fooEv
  virtual void  bar(); // _ZN7ee764623barEv
  ~ee76462(); // tgen
  ee76462(); // tgen
};
//SIG(1 ee76462) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76462 ::foo(){vfunc_called(this, "_ZN7ee764623fooEv");}
void  ee76462 ::bar(){vfunc_called(this, "_ZN7ee764623barEv");}
ee76462 ::~ee76462(){ note_dtor("ee76462", this);} // tgen
ee76462 ::ee76462(){ note_ctor("ee76462", this);} // tgen

static void Test_ee76462()
{
  extern Class_Descriptor cd_ee76462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76462, buf);
    ee76462 *dp, &lv = *(dp=new (buf) ee76462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee76462");
    check_base_class_offset(lv, (bb62*)(cc462*)(dd6462*), ABISELECT(16,8), "ee76462");
    check_base_class_offset(lv, (cc462*)(dd6462*), ABISELECT(16,8), "ee76462");
    check_base_class_offset(lv, (dd6462*), ABISELECT(16,8), "ee76462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76462.e");
    test_class_info(&lv, &cd_ee76462);
    dp->~ee76462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76462(Test_ee76462, "ee76462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76462C1Ev();
extern void _ZN7ee76462D1Ev();
Name_Map name_map_ee76462[] = {
  NSPAIR(_ZN7ee76462C1Ev),
  NSPAIR(_ZN7ee76462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd6462;
extern VTBL_ENTRY _ZTI6dd6462[];
extern  VTBL_ENTRY _ZTV6dd6462[];
static Base_Class bases_ee76462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6462,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76462[];
extern void _ZN7ee764623fooEv();
extern void _ZN7ee764623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee764623fooEv,_ZTv0_n12_N7ee764623fooEv)();
extern void ABISELECT(_ZThn16_N7ee764623fooEv,_ZThn8_N7ee764623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee764623barEv,_ZTv0_n16_N7ee764623barEv)();
extern void ABISELECT(_ZThn16_N7ee764623barEv,_ZThn8_N7ee764623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76462[0]),
  (VTBL_ENTRY)&_ZN7ee764623fooEv,
  (VTBL_ENTRY)&_ZN7ee764623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee764623fooEv,_ZTv0_n12_N7ee764623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee764623barEv,_ZTv0_n16_N7ee764623barEv),
};
extern VTBL_ENTRY _ZTV7ee76462[];
static  VTT_ENTRY vtt_ee76462[] = {
  {&(_ZTV7ee76462[3]),  3,11},
  {&(_ZTV7ee76462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76462[];
extern  VTBL_ENTRY _ZTV7ee76462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76462[];
static VTBL_ENTRY alt_thunk_names1195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee764623barEv,_ZTv0_n16_N7ee764623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee764623barEv,_ZThn8_N7ee764623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee764623fooEv,_ZTv0_n12_N7ee764623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee764623fooEv,_ZThn8_N7ee764623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76462 = {  "ee76462", // class name
  bases_ee76462, 4,
  &(vtc_ee76462[0]), // expected_vtbl_contents
  &(vtt_ee76462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76462),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1195,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7462  : virtual cc462 {
  int d;
  virtual void  bar(); // _ZN6dd74623barEv
  virtual void  foo(); // _ZN6dd74623fooEv
  ~dd7462(); // tgen
  dd7462(); // tgen
};
//SIG(-1 dd7462) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd7462 ::bar(){vfunc_called(this, "_ZN6dd74623barEv");}
void  dd7462 ::foo(){vfunc_called(this, "_ZN6dd74623fooEv");}
dd7462 ::~dd7462(){ note_dtor("dd7462", this);} // tgen
dd7462 ::dd7462(){ note_ctor("dd7462", this);} // tgen

static void Test_dd7462()
{
  extern Class_Descriptor cd_dd7462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7462, buf);
    dd7462 *dp, &lv = *(dp=new (buf) dd7462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,8), "dd7462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,8), "dd7462");
    check_base_class_offset(lv, (cc462*), ABISELECT(16,8), "dd7462");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7462.d");
    test_class_info(&lv, &cd_dd7462);
    dp->~dd7462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7462(Test_dd7462, "dd7462", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7462C1Ev();
extern void _ZN6dd7462D1Ev();
Name_Map name_map_dd7462[] = {
  NSPAIR(_ZN6dd7462C1Ev),
  NSPAIR(_ZN6dd7462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
static Base_Class bases_dd7462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
extern VTBL_ENTRY _ZTV6dd7462[];
static  VTT_ENTRY vtt_dd7462[] = {
  {&(_ZTV6dd7462[3]),  3,11},
  {&(_ZTV6dd7462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static VTBL_ENTRY alt_thunk_names1196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7462 = {  "dd7462", // class name
  bases_dd7462, 3,
  &(vtc_dd7462[0]), // expected_vtbl_contents
  &(vtt_dd7462[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7462),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1196,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07462  : dd7462 {
  int e;
  ~ee07462(); // tgen
  ee07462(); // tgen
};
//SIG(1 ee07462) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee07462 ::~ee07462(){ note_dtor("ee07462", this);} // tgen
ee07462 ::ee07462(){ note_ctor("ee07462", this);} // tgen

static void Test_ee07462()
{
  extern Class_Descriptor cd_ee07462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07462, buf);
    ee07462 *dp, &lv = *(dp=new (buf) ee07462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee07462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee07462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(16,12), "ee07462");
    check_base_class_offset(lv, (dd7462*), 0, "ee07462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07462.e");
    test_class_info(&lv, &cd_ee07462);
    dp->~ee07462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07462(Test_ee07462, "ee07462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07462C1Ev();
extern void _ZN7ee07462D1Ev();
Name_Map name_map_ee07462[] = {
  NSPAIR(_ZN7ee07462C1Ev),
  NSPAIR(_ZN7ee07462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee07462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
extern VTBL_ENTRY _ZTV7ee07462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee07462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee07462[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee07462[] = {
  {&(_ZTV7ee07462[3]),  3,11},
  {&(_tg__ZTV6dd7462__7ee07462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee07462[4]),  4,6},
  {&(_ZTV7ee07462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07462[];
extern  VTBL_ENTRY _ZTV7ee07462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07462[];
static VTBL_ENTRY alt_thunk_names1197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07462 = {  "ee07462", // class name
  bases_ee07462, 4,
  &(vtc_ee07462[0]), // expected_vtbl_contents
  &(vtt_ee07462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1197,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17462  : virtual dd7462 {
  int e;
  ~ee17462(); // tgen
  ee17462(); // tgen
};
//SIG(1 ee17462) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee17462 ::~ee17462(){ note_dtor("ee17462", this);} // tgen
ee17462 ::ee17462(){ note_ctor("ee17462", this);} // tgen

static void Test_ee17462()
{
  extern Class_Descriptor cd_ee17462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17462, buf);
    ee17462 *dp, &lv = *(dp=new (buf) ee17462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee17462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee17462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(32,16), "ee17462");
    check_base_class_offset(lv, (dd7462*), ABISELECT(16,8), "ee17462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17462.e");
    test_class_info(&lv, &cd_ee17462);
    dp->~ee17462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17462(Test_ee17462, "ee17462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17462C1Ev();
extern void _ZN7ee17462D1Ev();
Name_Map name_map_ee17462[] = {
  NSPAIR(_ZN7ee17462C1Ev),
  NSPAIR(_ZN7ee17462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee17462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17462[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
extern VTBL_ENTRY _ZTV7ee17462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee17462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee17462[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee17462[] = {
  {&(_ZTV7ee17462[4]),  4,17},
  {&(_ZTV7ee17462[9]),  9,17},
  {&(_ZTV7ee17462[15]),  15,17},
  {&(_tg__ZTV6dd7462__7ee17462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee17462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17462[];
extern  VTBL_ENTRY _ZTV7ee17462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17462[];
static VTBL_ENTRY alt_thunk_names1198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17462 = {  "ee17462", // class name
  bases_ee17462, 4,
  &(vtc_ee17462[0]), // expected_vtbl_contents
  &(vtt_ee17462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17462),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1198,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27462  : dd7462 {
  int e;
  virtual void  foo(); // _ZN7ee274623fooEv
  ~ee27462(); // tgen
  ee27462(); // tgen
};
//SIG(1 ee27462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27462 ::foo(){vfunc_called(this, "_ZN7ee274623fooEv");}
ee27462 ::~ee27462(){ note_dtor("ee27462", this);} // tgen
ee27462 ::ee27462(){ note_ctor("ee27462", this);} // tgen

static void Test_ee27462()
{
  extern Class_Descriptor cd_ee27462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27462, buf);
    ee27462 *dp, &lv = *(dp=new (buf) ee27462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee27462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee27462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(16,12), "ee27462");
    check_base_class_offset(lv, (dd7462*), 0, "ee27462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27462.e");
    test_class_info(&lv, &cd_ee27462);
    dp->~ee27462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27462(Test_ee27462, "ee27462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27462C1Ev();
extern void _ZN7ee27462D1Ev();
Name_Map name_map_ee27462[] = {
  NSPAIR(_ZN7ee27462C1Ev),
  NSPAIR(_ZN7ee27462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee27462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27462[];
extern void _ZN6dd74623barEv();
extern void _ZN7ee274623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee274623fooEv,_ZTv0_n12_N7ee274623fooEv)();
extern void ABISELECT(_ZThn16_N7ee274623fooEv,_ZThn12_N7ee274623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN7ee274623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee274623fooEv,_ZTv0_n12_N7ee274623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
extern VTBL_ENTRY _ZTV7ee27462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee27462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee27462[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee27462[] = {
  {&(_ZTV7ee27462[3]),  3,11},
  {&(_tg__ZTV6dd7462__7ee27462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee27462[4]),  4,6},
  {&(_ZTV7ee27462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27462[];
extern  VTBL_ENTRY _ZTV7ee27462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27462[];
static VTBL_ENTRY alt_thunk_names1199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee274623fooEv,_ZTv0_n12_N7ee274623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee274623fooEv,_ZThn12_N7ee274623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27462 = {  "ee27462", // class name
  bases_ee27462, 4,
  &(vtc_ee27462[0]), // expected_vtbl_contents
  &(vtt_ee27462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1199,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37462  : virtual dd7462 {
  int e;
  virtual void  foo(); // _ZN7ee374623fooEv
  ~ee37462(); // tgen
  ee37462(); // tgen
};
//SIG(1 ee37462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37462 ::foo(){vfunc_called(this, "_ZN7ee374623fooEv");}
ee37462 ::~ee37462(){ note_dtor("ee37462", this);} // tgen
ee37462 ::ee37462(){ note_ctor("ee37462", this);} // tgen

static void Test_ee37462()
{
  extern Class_Descriptor cd_ee37462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37462, buf);
    ee37462 *dp, &lv = *(dp=new (buf) ee37462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee37462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee37462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(32,16), "ee37462");
    check_base_class_offset(lv, (dd7462*), ABISELECT(16,8), "ee37462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37462.e");
    test_class_info(&lv, &cd_ee37462);
    dp->~ee37462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37462(Test_ee37462, "ee37462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37462C1Ev();
extern void _ZN7ee37462D1Ev();
Name_Map name_map_ee37462[] = {
  NSPAIR(_ZN7ee37462C1Ev),
  NSPAIR(_ZN7ee37462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee37462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37462[];
extern void _ZN7ee374623fooEv();
extern void _ZN6dd74623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee374623fooEv,_ZTv0_n20_N7ee374623fooEv)();
extern void ABISELECT(_ZThn16_N7ee374623fooEv,_ZThn8_N7ee374623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee374623fooEv,_ZTv0_n12_N7ee374623fooEv)();
extern void ABISELECT(_ZThn32_N7ee374623fooEv,_ZThn16_N7ee374623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37462[0]),
  (VTBL_ENTRY)&_ZN7ee374623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee374623fooEv,_ZTv0_n20_N7ee374623fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee374623fooEv,_ZTv0_n12_N7ee374623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
extern VTBL_ENTRY _ZTV7ee37462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee37462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee37462[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee37462[] = {
  {&(_ZTV7ee37462[4]),  4,18},
  {&(_ZTV7ee37462[10]),  10,18},
  {&(_ZTV7ee37462[16]),  16,18},
  {&(_tg__ZTV6dd7462__7ee37462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee37462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37462[];
extern  VTBL_ENTRY _ZTV7ee37462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37462[];
static VTBL_ENTRY alt_thunk_names1200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee374623fooEv,_ZTv0_n12_N7ee374623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee374623fooEv,_ZThn16_N7ee374623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee374623fooEv,_ZTv0_n20_N7ee374623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee374623fooEv,_ZThn8_N7ee374623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37462 = {  "ee37462", // class name
  bases_ee37462, 4,
  &(vtc_ee37462[0]), // expected_vtbl_contents
  &(vtt_ee37462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37462),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1200,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47462  : dd7462 {
  int e;
  virtual void  bar(); // _ZN7ee474623barEv
  ~ee47462(); // tgen
  ee47462(); // tgen
};
//SIG(1 ee47462) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47462 ::bar(){vfunc_called(this, "_ZN7ee474623barEv");}
ee47462 ::~ee47462(){ note_dtor("ee47462", this);} // tgen
ee47462 ::ee47462(){ note_ctor("ee47462", this);} // tgen

static void Test_ee47462()
{
  extern Class_Descriptor cd_ee47462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47462, buf);
    ee47462 *dp, &lv = *(dp=new (buf) ee47462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee47462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee47462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(16,12), "ee47462");
    check_base_class_offset(lv, (dd7462*), 0, "ee47462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47462.e");
    test_class_info(&lv, &cd_ee47462);
    dp->~ee47462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47462(Test_ee47462, "ee47462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47462C1Ev();
extern void _ZN7ee47462D1Ev();
Name_Map name_map_ee47462[] = {
  NSPAIR(_ZN7ee47462C1Ev),
  NSPAIR(_ZN7ee47462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee47462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47462[];
extern void _ZN7ee474623barEv();
extern void _ZN6dd74623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee474623barEv,_ZTv0_n16_N7ee474623barEv)();
extern void ABISELECT(_ZThn16_N7ee474623barEv,_ZThn12_N7ee474623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47462[0]),
  (VTBL_ENTRY)&_ZN7ee474623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee474623barEv,_ZTv0_n16_N7ee474623barEv),
};
extern VTBL_ENTRY _ZTV7ee47462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee47462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee47462[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee47462[] = {
  {&(_ZTV7ee47462[3]),  3,11},
  {&(_tg__ZTV6dd7462__7ee47462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee47462[4]),  4,6},
  {&(_ZTV7ee47462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47462[];
extern  VTBL_ENTRY _ZTV7ee47462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47462[];
static VTBL_ENTRY alt_thunk_names1201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee474623barEv,_ZTv0_n16_N7ee474623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee474623barEv,_ZThn12_N7ee474623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47462 = {  "ee47462", // class name
  bases_ee47462, 4,
  &(vtc_ee47462[0]), // expected_vtbl_contents
  &(vtt_ee47462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1201,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57462  : virtual dd7462 {
  int e;
  virtual void  bar(); // _ZN7ee574623barEv
  ~ee57462(); // tgen
  ee57462(); // tgen
};
//SIG(1 ee57462) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57462 ::bar(){vfunc_called(this, "_ZN7ee574623barEv");}
ee57462 ::~ee57462(){ note_dtor("ee57462", this);} // tgen
ee57462 ::ee57462(){ note_ctor("ee57462", this);} // tgen

static void Test_ee57462()
{
  extern Class_Descriptor cd_ee57462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57462, buf);
    ee57462 *dp, &lv = *(dp=new (buf) ee57462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee57462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee57462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(32,16), "ee57462");
    check_base_class_offset(lv, (dd7462*), ABISELECT(16,8), "ee57462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57462.e");
    test_class_info(&lv, &cd_ee57462);
    dp->~ee57462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57462(Test_ee57462, "ee57462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57462C1Ev();
extern void _ZN7ee57462D1Ev();
Name_Map name_map_ee57462[] = {
  NSPAIR(_ZN7ee57462C1Ev),
  NSPAIR(_ZN7ee57462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee57462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57462[];
extern void _ZN7ee574623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee574623barEv,_ZTv0_n16_N7ee574623barEv)();
extern void ABISELECT(_ZThn16_N7ee574623barEv,_ZThn8_N7ee574623barEv)() __attribute__((weak));
extern void _ZN6dd74623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee574623barEv,_ZTv0_n16_N7ee574623barEv)();
extern void ABISELECT(_ZThn32_N7ee574623barEv,_ZThn16_N7ee574623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57462[0]),
  (VTBL_ENTRY)&_ZN7ee574623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee574623barEv,_ZTv0_n16_N7ee574623barEv),
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee574623barEv,_ZTv0_n16_N7ee574623barEv),
};
extern VTBL_ENTRY _ZTV7ee57462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee57462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee57462[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee57462[] = {
  {&(_ZTV7ee57462[4]),  4,18},
  {&(_ZTV7ee57462[10]),  10,18},
  {&(_ZTV7ee57462[16]),  16,18},
  {&(_tg__ZTV6dd7462__7ee57462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee57462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57462[];
extern  VTBL_ENTRY _ZTV7ee57462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57462[];
static VTBL_ENTRY alt_thunk_names1202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee574623barEv,_ZTv0_n16_N7ee574623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee574623barEv,_ZThn16_N7ee574623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee574623barEv,_ZThn8_N7ee574623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57462 = {  "ee57462", // class name
  bases_ee57462, 4,
  &(vtc_ee57462[0]), // expected_vtbl_contents
  &(vtt_ee57462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57462),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1202,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67462  : dd7462 {
  int e;
  virtual void  foo(); // _ZN7ee674623fooEv
  virtual void  bar(); // _ZN7ee674623barEv
  ~ee67462(); // tgen
  ee67462(); // tgen
};
//SIG(1 ee67462) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67462 ::foo(){vfunc_called(this, "_ZN7ee674623fooEv");}
void  ee67462 ::bar(){vfunc_called(this, "_ZN7ee674623barEv");}
ee67462 ::~ee67462(){ note_dtor("ee67462", this);} // tgen
ee67462 ::ee67462(){ note_ctor("ee67462", this);} // tgen

static void Test_ee67462()
{
  extern Class_Descriptor cd_ee67462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67462, buf);
    ee67462 *dp, &lv = *(dp=new (buf) ee67462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(16,12), "ee67462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(16,12), "ee67462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(16,12), "ee67462");
    check_base_class_offset(lv, (dd7462*), 0, "ee67462");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67462.e");
    test_class_info(&lv, &cd_ee67462);
    dp->~ee67462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67462(Test_ee67462, "ee67462", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67462C1Ev();
extern void _ZN7ee67462D1Ev();
Name_Map name_map_ee67462[] = {
  NSPAIR(_ZN7ee67462C1Ev),
  NSPAIR(_ZN7ee67462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee67462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc462,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67462[];
extern void _ZN7ee674623barEv();
extern void _ZN7ee674623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee674623fooEv,_ZTv0_n12_N7ee674623fooEv)();
extern void ABISELECT(_ZThn16_N7ee674623fooEv,_ZThn12_N7ee674623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee674623barEv,_ZTv0_n16_N7ee674623barEv)();
extern void ABISELECT(_ZThn16_N7ee674623barEv,_ZThn12_N7ee674623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67462[0]),
  (VTBL_ENTRY)&_ZN7ee674623barEv,
  (VTBL_ENTRY)&_ZN7ee674623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee674623fooEv,_ZTv0_n12_N7ee674623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee674623barEv,_ZTv0_n16_N7ee674623barEv),
};
extern VTBL_ENTRY _ZTV7ee67462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee67462[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee67462[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee67462[] = {
  {&(_ZTV7ee67462[3]),  3,11},
  {&(_tg__ZTV6dd7462__7ee67462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee67462[4]),  4,6},
  {&(_ZTV7ee67462[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67462[];
extern  VTBL_ENTRY _ZTV7ee67462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67462[];
static VTBL_ENTRY alt_thunk_names1203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn12_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn12_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee674623barEv,_ZTv0_n16_N7ee674623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee674623barEv,_ZThn12_N7ee674623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee674623fooEv,_ZTv0_n12_N7ee674623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee674623fooEv,_ZThn12_N7ee674623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67462 = {  "ee67462", // class name
  bases_ee67462, 4,
  &(vtc_ee67462[0]), // expected_vtbl_contents
  &(vtt_ee67462[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67462),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67462),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67462),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1203,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77462  : virtual dd7462 {
  int e;
  virtual void  foo(); // _ZN7ee774623fooEv
  virtual void  bar(); // _ZN7ee774623barEv
  ~ee77462(); // tgen
  ee77462(); // tgen
};
//SIG(1 ee77462) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77462 ::foo(){vfunc_called(this, "_ZN7ee774623fooEv");}
void  ee77462 ::bar(){vfunc_called(this, "_ZN7ee774623barEv");}
ee77462 ::~ee77462(){ note_dtor("ee77462", this);} // tgen
ee77462 ::ee77462(){ note_ctor("ee77462", this);} // tgen

static void Test_ee77462()
{
  extern Class_Descriptor cd_ee77462;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77462, buf);
    ee77462 *dp, &lv = *(dp=new (buf) ee77462());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77462)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77462)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc462*), ABISELECT(32,16), "ee77462");
    check_base_class_offset(lv, (bb62*)(cc462*), ABISELECT(32,16), "ee77462");
    check_base_class_offset(lv, (cc462*)(dd7462*), ABISELECT(32,16), "ee77462");
    check_base_class_offset(lv, (dd7462*), ABISELECT(16,8), "ee77462");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77462.e");
    test_class_info(&lv, &cd_ee77462);
    dp->~ee77462();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77462(Test_ee77462, "ee77462", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77462C1Ev();
extern void _ZN7ee77462D1Ev();
Name_Map name_map_ee77462[] = {
  NSPAIR(_ZN7ee77462C1Ev),
  NSPAIR(_ZN7ee77462D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc462;
extern VTBL_ENTRY _ZTI5cc462[];
extern  VTBL_ENTRY _ZTV5cc462[];
extern Class_Descriptor cd_dd7462;
extern VTBL_ENTRY _ZTI6dd7462[];
extern  VTBL_ENTRY _ZTV6dd7462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7462[];
static Base_Class bases_ee77462[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc462,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7462,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77462[];
extern void _ZN7ee774623fooEv();
extern void _ZN7ee774623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee774623barEv,_ZTv0_n16_N7ee774623barEv)();
extern void ABISELECT(_ZThn16_N7ee774623barEv,_ZThn8_N7ee774623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee774623fooEv,_ZTv0_n20_N7ee774623fooEv)();
extern void ABISELECT(_ZThn16_N7ee774623fooEv,_ZThn8_N7ee774623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee774623fooEv,_ZTv0_n12_N7ee774623fooEv)();
extern void ABISELECT(_ZThn32_N7ee774623fooEv,_ZThn16_N7ee774623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee774623barEv,_ZTv0_n16_N7ee774623barEv)();
extern void ABISELECT(_ZThn32_N7ee774623barEv,_ZThn16_N7ee774623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77462[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77462[0]),
  (VTBL_ENTRY)&_ZN7ee774623fooEv,
  (VTBL_ENTRY)&_ZN7ee774623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee774623barEv,_ZTv0_n16_N7ee774623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee774623fooEv,_ZTv0_n20_N7ee774623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee774623fooEv,_ZTv0_n12_N7ee774623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee774623barEv,_ZTv0_n16_N7ee774623barEv),
};
extern VTBL_ENTRY _ZTV7ee77462[];
extern void _ZN6dd74623barEv();
extern void _ZN6dd74623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7462__7ee77462[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&_ZN6dd74623barEv,
  (VTBL_ENTRY)&_ZN6dd74623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv)();
extern void ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv)();
extern void ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc462__6dd7462__7ee77462[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7462[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv),
};
static  VTT_ENTRY vtt_ee77462[] = {
  {&(_ZTV7ee77462[4]),  4,19},
  {&(_ZTV7ee77462[11]),  11,19},
  {&(_ZTV7ee77462[17]),  17,19},
  {&(_tg__ZTV6dd7462__7ee77462[3]),  3,5},
  {&(_tg__ZTV5cc462__6dd7462__7ee77462[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77462[];
extern  VTBL_ENTRY _ZTV7ee77462[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77462[];
static VTBL_ENTRY alt_thunk_names1204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd74623barEv,_ZTv0_n16_N6dd74623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623barEv,_ZThn8_N6dd74623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd74623fooEv,_ZTv0_n12_N6dd74623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd74623fooEv,_ZThn8_N6dd74623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee774623fooEv,_ZTv0_n12_N7ee774623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee774623fooEv,_ZThn16_N7ee774623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee774623fooEv,_ZTv0_n20_N7ee774623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee774623fooEv,_ZThn8_N7ee774623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee774623barEv,_ZTv0_n16_N7ee774623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee774623barEv,_ZThn16_N7ee774623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee774623barEv,_ZThn8_N7ee774623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77462 = {  "ee77462", // class name
  bases_ee77462, 4,
  &(vtc_ee77462[0]), // expected_vtbl_contents
  &(vtt_ee77462[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77462),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77462),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77462),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1204,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc562  : virtual bb62 {
  int c;
  virtual void  bar(); // _ZN5cc5623barEv
  ~cc562(); // tgen
  cc562(); // tgen
};
//SIG(-1 cc562) C1{ VBC2{ BC3{ v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  cc562 ::bar(){vfunc_called(this, "_ZN5cc5623barEv");}
cc562 ::~cc562(){ note_dtor("cc562", this);} // tgen
cc562 ::cc562(){ note_ctor("cc562", this);} // tgen

static void Test_cc562()
{
  extern Class_Descriptor cd_cc562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc562, buf);
    cc562 *dp, &lv = *(dp=new (buf) cc562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,8), "cc562");
    check_base_class_offset(lv, (bb62*), ABISELECT(16,8), "cc562");
    check_field_offset(lv, c, ABISELECT(8,4), "cc562.c");
    test_class_info(&lv, &cd_cc562);
    dp->~cc562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc562(Test_cc562, "cc562", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc562C1Ev();
extern void _ZN5cc562D1Ev();
Name_Map name_map_cc562[] = {
  NSPAIR(_ZN5cc562C1Ev),
  NSPAIR(_ZN5cc562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI5cc562[];
extern void _ZN5cc5623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_cc562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV5cc562[];
static  VTT_ENTRY vtt_cc562[] = {
  {&(_ZTV5cc562[3]),  3,10},
  {&(_ZTV5cc562[8]),  8,10},
};
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static VTBL_ENTRY alt_thunk_names1205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc562 = {  "cc562", // class name
  bases_cc562, 2,
  &(vtc_cc562[0]), // expected_vtbl_contents
  &(vtt_cc562[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc562),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc562),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1205,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0562  : cc562 {
  int d;
  ~dd0562(); // tgen
  dd0562(); // tgen
};
//SIG(-1 dd0562) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


dd0562 ::~dd0562(){ note_dtor("dd0562", this);} // tgen
dd0562 ::dd0562(){ note_ctor("dd0562", this);} // tgen

static void Test_dd0562()
{
  extern Class_Descriptor cd_dd0562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0562, buf);
    dd0562 *dp, &lv = *(dp=new (buf) dd0562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd0562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(16,12), "dd0562");
    check_base_class_offset(lv, (cc562*), 0, "dd0562");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0562.d");
    test_class_info(&lv, &cd_dd0562);
    dp->~dd0562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0562(Test_dd0562, "dd0562", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0562C1Ev();
extern void _ZN6dd0562D1Ev();
Name_Map name_map_dd0562[] = {
  NSPAIR(_ZN6dd0562C1Ev),
  NSPAIR(_ZN6dd0562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd0562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0562[];
extern void _ZN5cc5623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd0562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV6dd0562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd0562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd0562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd0562[] = {
  {&(_ZTV6dd0562[3]),  3,10},
  {&(_tg__ZTV5cc562__6dd0562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd0562[4]),  4,6},
  {&(_ZTV6dd0562[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static VTBL_ENTRY alt_thunk_names1206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0562 = {  "dd0562", // class name
  bases_dd0562, 3,
  &(vtc_dd0562[0]), // expected_vtbl_contents
  &(vtt_dd0562[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0562),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0562),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1206,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00562  : dd0562 {
  int e;
  ~ee00562(); // tgen
  ee00562(); // tgen
};
//SIG(1 ee00562) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee00562 ::~ee00562(){ note_dtor("ee00562", this);} // tgen
ee00562 ::ee00562(){ note_ctor("ee00562", this);} // tgen

static void Test_ee00562()
{
  extern Class_Descriptor cd_ee00562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00562, buf);
    ee00562 *dp, &lv = *(dp=new (buf) ee00562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee00562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(24,16), "ee00562");
    check_base_class_offset(lv, (cc562*)(dd0562*), 0, "ee00562");
    check_base_class_offset(lv, (dd0562*), 0, "ee00562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00562.e");
    test_class_info(&lv, &cd_ee00562);
    dp->~ee00562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00562(Test_ee00562, "ee00562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00562C1Ev();
extern void _ZN7ee00562D1Ev();
Name_Map name_map_ee00562[] = {
  NSPAIR(_ZN7ee00562C1Ev),
  NSPAIR(_ZN7ee00562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee00562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00562[];
extern void _ZN5cc5623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee00562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee00562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee00562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee00562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee00562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee00562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee00562[] = {
  {&(_ZTV7ee00562[3]),  3,10},
  {&(_tg__ZTV6dd0562__7ee00562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee00562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee00562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee00562[4]),  4,6},
  {&(_ZTV7ee00562[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee00562[];
extern  VTBL_ENTRY _ZTV7ee00562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00562[];
static VTBL_ENTRY alt_thunk_names1207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00562 = {  "ee00562", // class name
  bases_ee00562, 4,
  &(vtc_ee00562[0]), // expected_vtbl_contents
  &(vtt_ee00562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00562),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1207,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10562  : virtual dd0562 {
  int e;
  ~ee10562(); // tgen
  ee10562(); // tgen
};
//SIG(1 ee10562) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee10562 ::~ee10562(){ note_dtor("ee10562", this);} // tgen
ee10562 ::ee10562(){ note_ctor("ee10562", this);} // tgen

static void Test_ee10562()
{
  extern Class_Descriptor cd_ee10562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10562, buf);
    ee10562 *dp, &lv = *(dp=new (buf) ee10562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee10562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(32,20), "ee10562");
    check_base_class_offset(lv, (cc562*)(dd0562*), ABISELECT(16,8), "ee10562");
    check_base_class_offset(lv, (dd0562*), ABISELECT(16,8), "ee10562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10562.e");
    test_class_info(&lv, &cd_ee10562);
    dp->~ee10562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10562(Test_ee10562, "ee10562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10562C1Ev();
extern void _ZN7ee10562D1Ev();
Name_Map name_map_ee10562[] = {
  NSPAIR(_ZN7ee10562C1Ev),
  NSPAIR(_ZN7ee10562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee10562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10562[];
extern void _ZN5cc5623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee10562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10562[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee10562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee10562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee10562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee10562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee10562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee10562[] = {
  {&(_ZTV7ee10562[4]),  4,15},
  {&(_ZTV7ee10562[8]),  8,15},
  {&(_ZTV7ee10562[13]),  13,15},
  {&(_tg__ZTV6dd0562__7ee10562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee10562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee10562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee10562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10562[];
extern  VTBL_ENTRY _ZTV7ee10562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10562[];
static VTBL_ENTRY alt_thunk_names1208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10562 = {  "ee10562", // class name
  bases_ee10562, 4,
  &(vtc_ee10562[0]), // expected_vtbl_contents
  &(vtt_ee10562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10562),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1208,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20562  : dd0562 {
  int e;
  virtual void  foo(); // _ZN7ee205623fooEv
  ~ee20562(); // tgen
  ee20562(); // tgen
};
//SIG(1 ee20562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee20562 ::foo(){vfunc_called(this, "_ZN7ee205623fooEv");}
ee20562 ::~ee20562(){ note_dtor("ee20562", this);} // tgen
ee20562 ::ee20562(){ note_ctor("ee20562", this);} // tgen

static void Test_ee20562()
{
  extern Class_Descriptor cd_ee20562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20562, buf);
    ee20562 *dp, &lv = *(dp=new (buf) ee20562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee20562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(24,16), "ee20562");
    check_base_class_offset(lv, (cc562*)(dd0562*), 0, "ee20562");
    check_base_class_offset(lv, (dd0562*), 0, "ee20562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20562.e");
    test_class_info(&lv, &cd_ee20562);
    dp->~ee20562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20562(Test_ee20562, "ee20562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20562C1Ev();
extern void _ZN7ee20562D1Ev();
Name_Map name_map_ee20562[] = {
  NSPAIR(_ZN7ee20562C1Ev),
  NSPAIR(_ZN7ee20562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee20562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20562[];
extern void _ZN5cc5623barEv();
extern void _ZN7ee205623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee205623fooEv,_ZTv0_n12_N7ee205623fooEv)();
extern void ABISELECT(_ZThn24_N7ee205623fooEv,_ZThn16_N7ee205623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN7ee205623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee205623fooEv,_ZTv0_n12_N7ee205623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee20562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee20562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee20562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee20562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee20562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee20562[] = {
  {&(_ZTV7ee20562[3]),  3,11},
  {&(_tg__ZTV6dd0562__7ee20562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee20562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee20562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee20562[4]),  4,6},
  {&(_ZTV7ee20562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee20562[];
extern  VTBL_ENTRY _ZTV7ee20562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20562[];
static VTBL_ENTRY alt_thunk_names1209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee205623fooEv,_ZTv0_n12_N7ee205623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee205623fooEv,_ZThn16_N7ee205623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20562 = {  "ee20562", // class name
  bases_ee20562, 4,
  &(vtc_ee20562[0]), // expected_vtbl_contents
  &(vtt_ee20562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1209,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30562  : virtual dd0562 {
  int e;
  virtual void  foo(); // _ZN7ee305623fooEv
  ~ee30562(); // tgen
  ee30562(); // tgen
};
//SIG(1 ee30562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee30562 ::foo(){vfunc_called(this, "_ZN7ee305623fooEv");}
ee30562 ::~ee30562(){ note_dtor("ee30562", this);} // tgen
ee30562 ::ee30562(){ note_ctor("ee30562", this);} // tgen

static void Test_ee30562()
{
  extern Class_Descriptor cd_ee30562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30562, buf);
    ee30562 *dp, &lv = *(dp=new (buf) ee30562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee30562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(32,20), "ee30562");
    check_base_class_offset(lv, (cc562*)(dd0562*), ABISELECT(16,8), "ee30562");
    check_base_class_offset(lv, (dd0562*), ABISELECT(16,8), "ee30562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30562.e");
    test_class_info(&lv, &cd_ee30562);
    dp->~ee30562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30562(Test_ee30562, "ee30562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30562C1Ev();
extern void _ZN7ee30562D1Ev();
Name_Map name_map_ee30562[] = {
  NSPAIR(_ZN7ee30562C1Ev),
  NSPAIR(_ZN7ee30562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee30562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30562[];
extern void _ZN7ee305623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee305623fooEv,_ZTv0_n12_N7ee305623fooEv)();
extern void ABISELECT(_ZThn32_N7ee305623fooEv,_ZThn20_N7ee305623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30562[0]),
  (VTBL_ENTRY)&_ZN7ee305623fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee305623fooEv,_ZTv0_n12_N7ee305623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee30562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee30562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee30562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee30562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee30562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee30562[] = {
  {&(_ZTV7ee30562[4]),  4,16},
  {&(_ZTV7ee30562[9]),  9,16},
  {&(_ZTV7ee30562[14]),  14,16},
  {&(_tg__ZTV6dd0562__7ee30562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee30562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee30562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee30562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30562[];
extern  VTBL_ENTRY _ZTV7ee30562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30562[];
static VTBL_ENTRY alt_thunk_names1210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee305623fooEv,_ZTv0_n12_N7ee305623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee305623fooEv,_ZThn20_N7ee305623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30562 = {  "ee30562", // class name
  bases_ee30562, 4,
  &(vtc_ee30562[0]), // expected_vtbl_contents
  &(vtt_ee30562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1210,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40562  : dd0562 {
  int e;
  virtual void  bar(); // _ZN7ee405623barEv
  ~ee40562(); // tgen
  ee40562(); // tgen
};
//SIG(1 ee40562) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee40562 ::bar(){vfunc_called(this, "_ZN7ee405623barEv");}
ee40562 ::~ee40562(){ note_dtor("ee40562", this);} // tgen
ee40562 ::ee40562(){ note_ctor("ee40562", this);} // tgen

static void Test_ee40562()
{
  extern Class_Descriptor cd_ee40562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40562, buf);
    ee40562 *dp, &lv = *(dp=new (buf) ee40562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee40562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(24,16), "ee40562");
    check_base_class_offset(lv, (cc562*)(dd0562*), 0, "ee40562");
    check_base_class_offset(lv, (dd0562*), 0, "ee40562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40562.e");
    test_class_info(&lv, &cd_ee40562);
    dp->~ee40562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40562(Test_ee40562, "ee40562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40562C1Ev();
extern void _ZN7ee40562D1Ev();
Name_Map name_map_ee40562[] = {
  NSPAIR(_ZN7ee40562C1Ev),
  NSPAIR(_ZN7ee40562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee40562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40562[];
extern void _ZN7ee405623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee405623barEv,_ZTv0_n16_N7ee405623barEv)();
extern void ABISELECT(_ZThn24_N7ee405623barEv,_ZThn16_N7ee405623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40562[0]),
  (VTBL_ENTRY)&_ZN7ee405623barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee405623barEv,_ZTv0_n16_N7ee405623barEv),
};
extern VTBL_ENTRY _ZTV7ee40562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee40562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee40562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee40562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee40562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee40562[] = {
  {&(_ZTV7ee40562[3]),  3,10},
  {&(_tg__ZTV6dd0562__7ee40562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee40562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee40562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee40562[4]),  4,6},
  {&(_ZTV7ee40562[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee40562[];
extern  VTBL_ENTRY _ZTV7ee40562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40562[];
static VTBL_ENTRY alt_thunk_names1211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee405623barEv,_ZTv0_n16_N7ee405623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee405623barEv,_ZThn16_N7ee405623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40562 = {  "ee40562", // class name
  bases_ee40562, 4,
  &(vtc_ee40562[0]), // expected_vtbl_contents
  &(vtt_ee40562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40562),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1211,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50562  : virtual dd0562 {
  int e;
  virtual void  bar(); // _ZN7ee505623barEv
  ~ee50562(); // tgen
  ee50562(); // tgen
};
//SIG(1 ee50562) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee50562 ::bar(){vfunc_called(this, "_ZN7ee505623barEv");}
ee50562 ::~ee50562(){ note_dtor("ee50562", this);} // tgen
ee50562 ::ee50562(){ note_ctor("ee50562", this);} // tgen

static void Test_ee50562()
{
  extern Class_Descriptor cd_ee50562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50562, buf);
    ee50562 *dp, &lv = *(dp=new (buf) ee50562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee50562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(32,20), "ee50562");
    check_base_class_offset(lv, (cc562*)(dd0562*), ABISELECT(16,8), "ee50562");
    check_base_class_offset(lv, (dd0562*), ABISELECT(16,8), "ee50562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50562.e");
    test_class_info(&lv, &cd_ee50562);
    dp->~ee50562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50562(Test_ee50562, "ee50562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50562C1Ev();
extern void _ZN7ee50562D1Ev();
Name_Map name_map_ee50562[] = {
  NSPAIR(_ZN7ee50562C1Ev),
  NSPAIR(_ZN7ee50562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee50562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50562[];
extern void _ZN7ee505623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee505623barEv,_ZTv0_n16_N7ee505623barEv)();
extern void ABISELECT(_ZThn16_N7ee505623barEv,_ZThn8_N7ee505623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee505623barEv,_ZTv0_n16_N7ee505623barEv)();
extern void ABISELECT(_ZThn32_N7ee505623barEv,_ZThn20_N7ee505623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50562[0]),
  (VTBL_ENTRY)&_ZN7ee505623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee505623barEv,_ZTv0_n16_N7ee505623barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee505623barEv,_ZTv0_n16_N7ee505623barEv),
};
extern VTBL_ENTRY _ZTV7ee50562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee50562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee50562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee50562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee50562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee50562[] = {
  {&(_ZTV7ee50562[4]),  4,16},
  {&(_ZTV7ee50562[9]),  9,16},
  {&(_ZTV7ee50562[14]),  14,16},
  {&(_tg__ZTV6dd0562__7ee50562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee50562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee50562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee50562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50562[];
extern  VTBL_ENTRY _ZTV7ee50562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50562[];
static VTBL_ENTRY alt_thunk_names1212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee505623barEv,_ZTv0_n16_N7ee505623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee505623barEv,_ZThn20_N7ee505623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee505623barEv,_ZThn8_N7ee505623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50562 = {  "ee50562", // class name
  bases_ee50562, 4,
  &(vtc_ee50562[0]), // expected_vtbl_contents
  &(vtt_ee50562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1212,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60562  : dd0562 {
  int e;
  virtual void  foo(); // _ZN7ee605623fooEv
  virtual void  bar(); // _ZN7ee605623barEv
  ~ee60562(); // tgen
  ee60562(); // tgen
};
//SIG(1 ee60562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee60562 ::foo(){vfunc_called(this, "_ZN7ee605623fooEv");}
void  ee60562 ::bar(){vfunc_called(this, "_ZN7ee605623barEv");}
ee60562 ::~ee60562(){ note_dtor("ee60562", this);} // tgen
ee60562 ::ee60562(){ note_ctor("ee60562", this);} // tgen

static void Test_ee60562()
{
  extern Class_Descriptor cd_ee60562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60562, buf);
    ee60562 *dp, &lv = *(dp=new (buf) ee60562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee60562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(24,16), "ee60562");
    check_base_class_offset(lv, (cc562*)(dd0562*), 0, "ee60562");
    check_base_class_offset(lv, (dd0562*), 0, "ee60562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60562.e");
    test_class_info(&lv, &cd_ee60562);
    dp->~ee60562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60562(Test_ee60562, "ee60562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60562C1Ev();
extern void _ZN7ee60562D1Ev();
Name_Map name_map_ee60562[] = {
  NSPAIR(_ZN7ee60562C1Ev),
  NSPAIR(_ZN7ee60562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee60562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60562[];
extern void _ZN7ee605623barEv();
extern void _ZN7ee605623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee605623fooEv,_ZTv0_n12_N7ee605623fooEv)();
extern void ABISELECT(_ZThn24_N7ee605623fooEv,_ZThn16_N7ee605623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee605623barEv,_ZTv0_n16_N7ee605623barEv)();
extern void ABISELECT(_ZThn24_N7ee605623barEv,_ZThn16_N7ee605623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60562[0]),
  (VTBL_ENTRY)&_ZN7ee605623barEv,
  (VTBL_ENTRY)&_ZN7ee605623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee605623fooEv,_ZTv0_n12_N7ee605623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee605623barEv,_ZTv0_n16_N7ee605623barEv),
};
extern VTBL_ENTRY _ZTV7ee60562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee60562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee60562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee60562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee60562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee60562[] = {
  {&(_ZTV7ee60562[3]),  3,11},
  {&(_tg__ZTV6dd0562__7ee60562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee60562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee60562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee60562[4]),  4,6},
  {&(_ZTV7ee60562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60562[];
extern  VTBL_ENTRY _ZTV7ee60562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60562[];
static VTBL_ENTRY alt_thunk_names1213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee605623barEv,_ZTv0_n16_N7ee605623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee605623barEv,_ZThn16_N7ee605623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee605623fooEv,_ZTv0_n12_N7ee605623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee605623fooEv,_ZThn16_N7ee605623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60562 = {  "ee60562", // class name
  bases_ee60562, 4,
  &(vtc_ee60562[0]), // expected_vtbl_contents
  &(vtt_ee60562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1213,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70562  : virtual dd0562 {
  int e;
  virtual void  foo(); // _ZN7ee705623fooEv
  virtual void  bar(); // _ZN7ee705623barEv
  ~ee70562(); // tgen
  ee70562(); // tgen
};
//SIG(1 ee70562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee70562 ::foo(){vfunc_called(this, "_ZN7ee705623fooEv");}
void  ee70562 ::bar(){vfunc_called(this, "_ZN7ee705623barEv");}
ee70562 ::~ee70562(){ note_dtor("ee70562", this);} // tgen
ee70562 ::ee70562(){ note_ctor("ee70562", this);} // tgen

static void Test_ee70562()
{
  extern Class_Descriptor cd_ee70562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70562, buf);
    ee70562 *dp, &lv = *(dp=new (buf) ee70562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee70562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd0562*), ABISELECT(32,20), "ee70562");
    check_base_class_offset(lv, (cc562*)(dd0562*), ABISELECT(16,8), "ee70562");
    check_base_class_offset(lv, (dd0562*), ABISELECT(16,8), "ee70562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70562.e");
    test_class_info(&lv, &cd_ee70562);
    dp->~ee70562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70562(Test_ee70562, "ee70562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70562C1Ev();
extern void _ZN7ee70562D1Ev();
Name_Map name_map_ee70562[] = {
  NSPAIR(_ZN7ee70562C1Ev),
  NSPAIR(_ZN7ee70562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd0562;
extern VTBL_ENTRY _ZTI6dd0562[];
extern  VTBL_ENTRY _ZTV6dd0562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0562[];
static Base_Class bases_ee70562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0562,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee70562[];
extern void _ZN7ee705623fooEv();
extern void _ZN7ee705623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee705623barEv,_ZTv0_n16_N7ee705623barEv)();
extern void ABISELECT(_ZThn16_N7ee705623barEv,_ZThn8_N7ee705623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee705623fooEv,_ZTv0_n12_N7ee705623fooEv)();
extern void ABISELECT(_ZThn32_N7ee705623fooEv,_ZThn20_N7ee705623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee705623barEv,_ZTv0_n16_N7ee705623barEv)();
extern void ABISELECT(_ZThn32_N7ee705623barEv,_ZThn20_N7ee705623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70562[0]),
  (VTBL_ENTRY)&_ZN7ee705623fooEv,
  (VTBL_ENTRY)&_ZN7ee705623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee705623barEv,_ZTv0_n16_N7ee705623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee705623fooEv,_ZTv0_n12_N7ee705623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee705623barEv,_ZTv0_n16_N7ee705623barEv),
};
extern VTBL_ENTRY _ZTV7ee70562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0562__7ee70562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd0562__7ee70562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd0562__7ee70562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0562__7ee70562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee70562[] = {
  {&(_ZTV7ee70562[4]),  4,17},
  {&(_ZTV7ee70562[10]),  10,17},
  {&(_ZTV7ee70562[15]),  15,17},
  {&(_tg__ZTV6dd0562__7ee70562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd0562__7ee70562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd0562__7ee70562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0562__7ee70562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70562[];
extern  VTBL_ENTRY _ZTV7ee70562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70562[];
static VTBL_ENTRY alt_thunk_names1214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee705623fooEv,_ZTv0_n12_N7ee705623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee705623fooEv,_ZThn20_N7ee705623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee705623barEv,_ZTv0_n16_N7ee705623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee705623barEv,_ZThn20_N7ee705623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee705623barEv,_ZThn8_N7ee705623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70562 = {  "ee70562", // class name
  bases_ee70562, 4,
  &(vtc_ee70562[0]), // expected_vtbl_contents
  &(vtt_ee70562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1214,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1562  : virtual cc562 {
  int d;
  ~dd1562(); // tgen
  dd1562(); // tgen
};
//SIG(-1 dd1562) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


dd1562 ::~dd1562(){ note_dtor("dd1562", this);} // tgen
dd1562 ::dd1562(){ note_ctor("dd1562", this);} // tgen

static void Test_dd1562()
{
  extern Class_Descriptor cd_dd1562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1562, buf);
    dd1562 *dp, &lv = *(dp=new (buf) dd1562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd1562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,16), "dd1562");
    check_base_class_offset(lv, (cc562*), ABISELECT(16,8), "dd1562");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1562.d");
    test_class_info(&lv, &cd_dd1562);
    dp->~dd1562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1562(Test_dd1562, "dd1562", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1562C1Ev();
extern void _ZN6dd1562D1Ev();
Name_Map name_map_dd1562[] = {
  NSPAIR(_ZN6dd1562C1Ev),
  NSPAIR(_ZN6dd1562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd1562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1562[];
extern void _ZN5cc5623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd1562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV6dd1562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd1562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd1562[] = {
  {&(_ZTV6dd1562[4]),  4,15},
  {&(_ZTV6dd1562[8]),  8,15},
  {&(_ZTV6dd1562[13]),  13,15},
  {&(_tg__ZTV5cc562__6dd1562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd1562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static VTBL_ENTRY alt_thunk_names1215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1562 = {  "dd1562", // class name
  bases_dd1562, 3,
  &(vtc_dd1562[0]), // expected_vtbl_contents
  &(vtt_dd1562[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1562),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1562),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1215,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01562  : dd1562 {
  int e;
  ~ee01562(); // tgen
  ee01562(); // tgen
};
//SIG(1 ee01562) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee01562 ::~ee01562(){ note_dtor("ee01562", this);} // tgen
ee01562 ::ee01562(){ note_ctor("ee01562", this);} // tgen

static void Test_ee01562()
{
  extern Class_Descriptor cd_ee01562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01562, buf);
    ee01562 *dp, &lv = *(dp=new (buf) ee01562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee01562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee01562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(16,12), "ee01562");
    check_base_class_offset(lv, (dd1562*), 0, "ee01562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01562.e");
    test_class_info(&lv, &cd_ee01562);
    dp->~ee01562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01562(Test_ee01562, "ee01562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01562C1Ev();
extern void _ZN7ee01562D1Ev();
Name_Map name_map_ee01562[] = {
  NSPAIR(_ZN7ee01562C1Ev),
  NSPAIR(_ZN7ee01562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee01562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01562[];
extern void _ZN5cc5623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee01562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01562[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee01562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee01562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee01562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee01562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee01562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee01562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee01562[] = {
  {&(_ZTV7ee01562[4]),  4,15},
  {&(_tg__ZTV6dd1562__7ee01562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee01562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee01562[4]),  4,6},
  {&(_ZTV7ee01562[8]),  8,15},
  {&(_ZTV7ee01562[13]),  13,15},
  {&(_tg__ZTV5cc562__7ee01562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee01562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01562[];
extern  VTBL_ENTRY _ZTV7ee01562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01562[];
static VTBL_ENTRY alt_thunk_names1216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01562 = {  "ee01562", // class name
  bases_ee01562, 4,
  &(vtc_ee01562[0]), // expected_vtbl_contents
  &(vtt_ee01562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01562),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1216,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11562  : virtual dd1562 {
  int e;
  ~ee11562(); // tgen
  ee11562(); // tgen
};
//SIG(1 ee11562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} Fi}


ee11562 ::~ee11562(){ note_dtor("ee11562", this);} // tgen
ee11562 ::ee11562(){ note_ctor("ee11562", this);} // tgen

static void Test_ee11562()
{
  extern Class_Descriptor cd_ee11562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11562, buf);
    ee11562 *dp, &lv = *(dp=new (buf) ee11562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee11562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee11562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(32,16), "ee11562");
    check_base_class_offset(lv, (dd1562*), ABISELECT(16,8), "ee11562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11562.e");
    test_class_info(&lv, &cd_ee11562);
    dp->~ee11562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11562(Test_ee11562, "ee11562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11562C1Ev();
extern void _ZN7ee11562D1Ev();
Name_Map name_map_ee11562[] = {
  NSPAIR(_ZN7ee11562C1Ev),
  NSPAIR(_ZN7ee11562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee11562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11562[];
extern void _ZN5cc5623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee11562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11562[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11562[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee11562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee11562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee11562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee11562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee11562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee11562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee11562[] = {
  {&(_ZTV7ee11562[5]),  5,20},
  {&(_ZTV7ee11562[9]),  9,20},
  {&(_ZTV7ee11562[13]),  13,20},
  {&(_ZTV7ee11562[18]),  18,20},
  {&(_tg__ZTV6dd1562__7ee11562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee11562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee11562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee11562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee11562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11562[];
extern  VTBL_ENTRY _ZTV7ee11562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11562[];
static VTBL_ENTRY alt_thunk_names1217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11562 = {  "ee11562", // class name
  bases_ee11562, 4,
  &(vtc_ee11562[0]), // expected_vtbl_contents
  &(vtt_ee11562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11562),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1217,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21562  : dd1562 {
  int e;
  virtual void  foo(); // _ZN7ee215623fooEv
  ~ee21562(); // tgen
  ee21562(); // tgen
};
//SIG(1 ee21562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee21562 ::foo(){vfunc_called(this, "_ZN7ee215623fooEv");}
ee21562 ::~ee21562(){ note_dtor("ee21562", this);} // tgen
ee21562 ::ee21562(){ note_ctor("ee21562", this);} // tgen

static void Test_ee21562()
{
  extern Class_Descriptor cd_ee21562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21562, buf);
    ee21562 *dp, &lv = *(dp=new (buf) ee21562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee21562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee21562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(16,12), "ee21562");
    check_base_class_offset(lv, (dd1562*), 0, "ee21562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21562.e");
    test_class_info(&lv, &cd_ee21562);
    dp->~ee21562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21562(Test_ee21562, "ee21562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21562C1Ev();
extern void _ZN7ee21562D1Ev();
Name_Map name_map_ee21562[] = {
  NSPAIR(_ZN7ee21562C1Ev),
  NSPAIR(_ZN7ee21562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee21562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21562[];
extern void _ZN7ee215623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee215623fooEv,_ZTv0_n12_N7ee215623fooEv)();
extern void ABISELECT(_ZThn32_N7ee215623fooEv,_ZThn20_N7ee215623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21562[0]),
  (VTBL_ENTRY)&_ZN7ee215623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee215623fooEv,_ZTv0_n12_N7ee215623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee21562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee21562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee21562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee21562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee21562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee21562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee21562[] = {
  {&(_ZTV7ee21562[4]),  4,16},
  {&(_tg__ZTV6dd1562__7ee21562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee21562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee21562[4]),  4,6},
  {&(_ZTV7ee21562[9]),  9,16},
  {&(_ZTV7ee21562[14]),  14,16},
  {&(_tg__ZTV5cc562__7ee21562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee21562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21562[];
extern  VTBL_ENTRY _ZTV7ee21562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21562[];
static VTBL_ENTRY alt_thunk_names1218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee215623fooEv,_ZTv0_n12_N7ee215623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee215623fooEv,_ZThn20_N7ee215623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21562 = {  "ee21562", // class name
  bases_ee21562, 4,
  &(vtc_ee21562[0]), // expected_vtbl_contents
  &(vtt_ee21562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1218,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31562  : virtual dd1562 {
  int e;
  virtual void  foo(); // _ZN7ee315623fooEv
  ~ee31562(); // tgen
  ee31562(); // tgen
};
//SIG(1 ee31562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 Fi}


void  ee31562 ::foo(){vfunc_called(this, "_ZN7ee315623fooEv");}
ee31562 ::~ee31562(){ note_dtor("ee31562", this);} // tgen
ee31562 ::ee31562(){ note_ctor("ee31562", this);} // tgen

static void Test_ee31562()
{
  extern Class_Descriptor cd_ee31562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31562, buf);
    ee31562 *dp, &lv = *(dp=new (buf) ee31562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee31562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee31562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(32,16), "ee31562");
    check_base_class_offset(lv, (dd1562*), ABISELECT(16,8), "ee31562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31562.e");
    test_class_info(&lv, &cd_ee31562);
    dp->~ee31562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31562(Test_ee31562, "ee31562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31562C1Ev();
extern void _ZN7ee31562D1Ev();
Name_Map name_map_ee31562[] = {
  NSPAIR(_ZN7ee31562C1Ev),
  NSPAIR(_ZN7ee31562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee31562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31562[];
extern void _ZN7ee315623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee315623fooEv,_ZTv0_n12_N7ee315623fooEv)();
extern void ABISELECT(_ZThn48_N7ee315623fooEv,_ZThn24_N7ee315623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31562[0]),
  (VTBL_ENTRY)&_ZN7ee315623fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31562[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee315623fooEv,_ZTv0_n12_N7ee315623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee31562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee31562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee31562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee31562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee31562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee31562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee31562[] = {
  {&(_ZTV7ee31562[5]),  5,21},
  {&(_ZTV7ee31562[10]),  10,21},
  {&(_ZTV7ee31562[14]),  14,21},
  {&(_ZTV7ee31562[19]),  19,21},
  {&(_tg__ZTV6dd1562__7ee31562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee31562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee31562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee31562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee31562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31562[];
extern  VTBL_ENTRY _ZTV7ee31562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31562[];
static VTBL_ENTRY alt_thunk_names1219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee315623fooEv,_ZTv0_n12_N7ee315623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee315623fooEv,_ZThn24_N7ee315623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31562 = {  "ee31562", // class name
  bases_ee31562, 4,
  &(vtc_ee31562[0]), // expected_vtbl_contents
  &(vtt_ee31562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31562),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1219,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41562  : dd1562 {
  int e;
  virtual void  bar(); // _ZN7ee415623barEv
  ~ee41562(); // tgen
  ee41562(); // tgen
};
//SIG(1 ee41562) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee41562 ::bar(){vfunc_called(this, "_ZN7ee415623barEv");}
ee41562 ::~ee41562(){ note_dtor("ee41562", this);} // tgen
ee41562 ::ee41562(){ note_ctor("ee41562", this);} // tgen

static void Test_ee41562()
{
  extern Class_Descriptor cd_ee41562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41562, buf);
    ee41562 *dp, &lv = *(dp=new (buf) ee41562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee41562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee41562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(16,12), "ee41562");
    check_base_class_offset(lv, (dd1562*), 0, "ee41562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41562.e");
    test_class_info(&lv, &cd_ee41562);
    dp->~ee41562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41562(Test_ee41562, "ee41562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41562C1Ev();
extern void _ZN7ee41562D1Ev();
Name_Map name_map_ee41562[] = {
  NSPAIR(_ZN7ee41562C1Ev),
  NSPAIR(_ZN7ee41562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee41562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41562[];
extern void _ZN7ee415623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee415623barEv,_ZTv0_n16_N7ee415623barEv)();
extern void ABISELECT(_ZThn16_N7ee415623barEv,_ZThn12_N7ee415623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee415623barEv,_ZTv0_n16_N7ee415623barEv)();
extern void ABISELECT(_ZThn32_N7ee415623barEv,_ZThn20_N7ee415623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41562[0]),
  (VTBL_ENTRY)&_ZN7ee415623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee415623barEv,_ZTv0_n16_N7ee415623barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee415623barEv,_ZTv0_n16_N7ee415623barEv),
};
extern VTBL_ENTRY _ZTV7ee41562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee41562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee41562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee41562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee41562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee41562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee41562[] = {
  {&(_ZTV7ee41562[4]),  4,16},
  {&(_tg__ZTV6dd1562__7ee41562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee41562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee41562[4]),  4,6},
  {&(_ZTV7ee41562[9]),  9,16},
  {&(_ZTV7ee41562[14]),  14,16},
  {&(_tg__ZTV5cc562__7ee41562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee41562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41562[];
extern  VTBL_ENTRY _ZTV7ee41562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41562[];
static VTBL_ENTRY alt_thunk_names1220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee415623barEv,_ZTv0_n16_N7ee415623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee415623barEv,_ZThn20_N7ee415623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee415623barEv,_ZThn12_N7ee415623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41562 = {  "ee41562", // class name
  bases_ee41562, 4,
  &(vtc_ee41562[0]), // expected_vtbl_contents
  &(vtt_ee41562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1220,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51562  : virtual dd1562 {
  int e;
  virtual void  bar(); // _ZN7ee515623barEv
  ~ee51562(); // tgen
  ee51562(); // tgen
};
//SIG(1 ee51562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi} v1 Fi}


void  ee51562 ::bar(){vfunc_called(this, "_ZN7ee515623barEv");}
ee51562 ::~ee51562(){ note_dtor("ee51562", this);} // tgen
ee51562 ::ee51562(){ note_ctor("ee51562", this);} // tgen

static void Test_ee51562()
{
  extern Class_Descriptor cd_ee51562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51562, buf);
    ee51562 *dp, &lv = *(dp=new (buf) ee51562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee51562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee51562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(32,16), "ee51562");
    check_base_class_offset(lv, (dd1562*), ABISELECT(16,8), "ee51562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51562.e");
    test_class_info(&lv, &cd_ee51562);
    dp->~ee51562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51562(Test_ee51562, "ee51562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51562C1Ev();
extern void _ZN7ee51562D1Ev();
Name_Map name_map_ee51562[] = {
  NSPAIR(_ZN7ee51562C1Ev),
  NSPAIR(_ZN7ee51562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee51562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    15, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51562[];
extern void _ZN7ee515623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee515623barEv,_ZTv0_n16_N7ee515623barEv)();
extern void ABISELECT(_ZThn32_N7ee515623barEv,_ZThn16_N7ee515623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee515623barEv,_ZTv0_n16_N7ee515623barEv)();
extern void ABISELECT(_ZThn48_N7ee515623barEv,_ZThn24_N7ee515623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51562[0]),
  (VTBL_ENTRY)&_ZN7ee515623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51562[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee515623barEv,_ZTv0_n16_N7ee515623barEv),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee515623barEv,_ZTv0_n16_N7ee515623barEv),
};
extern VTBL_ENTRY _ZTV7ee51562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee51562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee51562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee51562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee51562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee51562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee51562[] = {
  {&(_ZTV7ee51562[5]),  5,21},
  {&(_ZTV7ee51562[10]),  10,21},
  {&(_ZTV7ee51562[14]),  14,21},
  {&(_ZTV7ee51562[19]),  19,21},
  {&(_tg__ZTV6dd1562__7ee51562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee51562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee51562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee51562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee51562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51562[];
extern  VTBL_ENTRY _ZTV7ee51562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51562[];
static VTBL_ENTRY alt_thunk_names1221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee515623barEv,_ZTv0_n16_N7ee515623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee515623barEv,_ZThn24_N7ee515623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee515623barEv,_ZThn16_N7ee515623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51562 = {  "ee51562", // class name
  bases_ee51562, 4,
  &(vtc_ee51562[0]), // expected_vtbl_contents
  &(vtt_ee51562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51562),21, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1221,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61562  : dd1562 {
  int e;
  virtual void  foo(); // _ZN7ee615623fooEv
  virtual void  bar(); // _ZN7ee615623barEv
  ~ee61562(); // tgen
  ee61562(); // tgen
};
//SIG(1 ee61562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee61562 ::foo(){vfunc_called(this, "_ZN7ee615623fooEv");}
void  ee61562 ::bar(){vfunc_called(this, "_ZN7ee615623barEv");}
ee61562 ::~ee61562(){ note_dtor("ee61562", this);} // tgen
ee61562 ::ee61562(){ note_ctor("ee61562", this);} // tgen

static void Test_ee61562()
{
  extern Class_Descriptor cd_ee61562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61562, buf);
    ee61562 *dp, &lv = *(dp=new (buf) ee61562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee61562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee61562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(16,12), "ee61562");
    check_base_class_offset(lv, (dd1562*), 0, "ee61562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61562.e");
    test_class_info(&lv, &cd_ee61562);
    dp->~ee61562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61562(Test_ee61562, "ee61562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61562C1Ev();
extern void _ZN7ee61562D1Ev();
Name_Map name_map_ee61562[] = {
  NSPAIR(_ZN7ee61562C1Ev),
  NSPAIR(_ZN7ee61562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee61562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61562[];
extern void _ZN7ee615623fooEv();
extern void _ZN7ee615623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee615623barEv,_ZTv0_n16_N7ee615623barEv)();
extern void ABISELECT(_ZThn16_N7ee615623barEv,_ZThn12_N7ee615623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee615623fooEv,_ZTv0_n12_N7ee615623fooEv)();
extern void ABISELECT(_ZThn32_N7ee615623fooEv,_ZThn20_N7ee615623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee615623barEv,_ZTv0_n16_N7ee615623barEv)();
extern void ABISELECT(_ZThn32_N7ee615623barEv,_ZThn20_N7ee615623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61562[0]),
  (VTBL_ENTRY)&_ZN7ee615623fooEv,
  (VTBL_ENTRY)&_ZN7ee615623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee615623barEv,_ZTv0_n16_N7ee615623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee615623fooEv,_ZTv0_n12_N7ee615623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee615623barEv,_ZTv0_n16_N7ee615623barEv),
};
extern VTBL_ENTRY _ZTV7ee61562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee61562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee61562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee61562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee61562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee61562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee61562[] = {
  {&(_ZTV7ee61562[4]),  4,17},
  {&(_tg__ZTV6dd1562__7ee61562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee61562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee61562[4]),  4,6},
  {&(_ZTV7ee61562[10]),  10,17},
  {&(_ZTV7ee61562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee61562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee61562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61562[];
extern  VTBL_ENTRY _ZTV7ee61562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61562[];
static VTBL_ENTRY alt_thunk_names1222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee615623fooEv,_ZTv0_n12_N7ee615623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee615623fooEv,_ZThn20_N7ee615623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee615623barEv,_ZTv0_n16_N7ee615623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee615623barEv,_ZThn20_N7ee615623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee615623barEv,_ZThn12_N7ee615623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61562 = {  "ee61562", // class name
  bases_ee61562, 4,
  &(vtc_ee61562[0]), // expected_vtbl_contents
  &(vtt_ee61562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1222,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71562  : virtual dd1562 {
  int e;
  virtual void  foo(); // _ZN7ee715623fooEv
  virtual void  bar(); // _ZN7ee715623barEv
  ~ee71562(); // tgen
  ee71562(); // tgen
};
//SIG(1 ee71562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} Fi} v1 v2 Fi}


void  ee71562 ::foo(){vfunc_called(this, "_ZN7ee715623fooEv");}
void  ee71562 ::bar(){vfunc_called(this, "_ZN7ee715623barEv");}
ee71562 ::~ee71562(){ note_dtor("ee71562", this);} // tgen
ee71562 ::ee71562(){ note_ctor("ee71562", this);} // tgen

static void Test_ee71562()
{
  extern Class_Descriptor cd_ee71562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71562, buf);
    ee71562 *dp, &lv = *(dp=new (buf) ee71562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee71562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee71562");
    check_base_class_offset(lv, (cc562*)(dd1562*), ABISELECT(32,16), "ee71562");
    check_base_class_offset(lv, (dd1562*), ABISELECT(16,8), "ee71562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71562.e");
    test_class_info(&lv, &cd_ee71562);
    dp->~ee71562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71562(Test_ee71562, "ee71562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71562C1Ev();
extern void _ZN7ee71562D1Ev();
Name_Map name_map_ee71562[] = {
  NSPAIR(_ZN7ee71562C1Ev),
  NSPAIR(_ZN7ee71562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd1562;
extern VTBL_ENTRY _ZTI6dd1562[];
extern  VTBL_ENTRY _ZTV6dd1562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1562[];
static Base_Class bases_ee71562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1562,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71562[];
extern void _ZN7ee715623fooEv();
extern void _ZN7ee715623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee715623barEv,_ZTv0_n16_N7ee715623barEv)();
extern void ABISELECT(_ZThn32_N7ee715623barEv,_ZThn16_N7ee715623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee715623fooEv,_ZTv0_n12_N7ee715623fooEv)();
extern void ABISELECT(_ZThn48_N7ee715623fooEv,_ZThn24_N7ee715623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee715623barEv,_ZTv0_n16_N7ee715623barEv)();
extern void ABISELECT(_ZThn48_N7ee715623barEv,_ZThn24_N7ee715623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71562[0]),
  (VTBL_ENTRY)&_ZN7ee715623fooEv,
  (VTBL_ENTRY)&_ZN7ee715623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71562[0]),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee715623barEv,_ZTv0_n16_N7ee715623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee715623fooEv,_ZTv0_n12_N7ee715623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee715623barEv,_ZTv0_n16_N7ee715623barEv),
};
extern VTBL_ENTRY _ZTV7ee71562[];
static  VTBL_ENTRY _tg__ZTV6dd1562__7ee71562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd1562__7ee71562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1562__7ee71562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee71562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee71562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee71562[] = {
  {&(_ZTV7ee71562[5]),  5,22},
  {&(_ZTV7ee71562[11]),  11,22},
  {&(_ZTV7ee71562[15]),  15,22},
  {&(_ZTV7ee71562[20]),  20,22},
  {&(_tg__ZTV6dd1562__7ee71562[4]),  4,4},
  {&(_tg__ZTV5cc562__6dd1562__7ee71562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd1562__7ee71562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee71562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee71562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71562[];
extern  VTBL_ENTRY _ZTV7ee71562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71562[];
static VTBL_ENTRY alt_thunk_names1223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee715623fooEv,_ZTv0_n12_N7ee715623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee715623fooEv,_ZThn24_N7ee715623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee715623barEv,_ZTv0_n16_N7ee715623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee715623barEv,_ZThn24_N7ee715623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee715623barEv,_ZThn16_N7ee715623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71562 = {  "ee71562", // class name
  bases_ee71562, 4,
  &(vtc_ee71562[0]), // expected_vtbl_contents
  &(vtt_ee71562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71562),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1223,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2562  : cc562 {
  int d;
  virtual void  foo(); // _ZN6dd25623fooEv
  ~dd2562(); // tgen
  dd2562(); // tgen
};
//SIG(-1 dd2562) C1{ BC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd2562 ::foo(){vfunc_called(this, "_ZN6dd25623fooEv");}
dd2562 ::~dd2562(){ note_dtor("dd2562", this);} // tgen
dd2562 ::dd2562(){ note_ctor("dd2562", this);} // tgen

static void Test_dd2562()
{
  extern Class_Descriptor cd_dd2562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2562, buf);
    dd2562 *dp, &lv = *(dp=new (buf) dd2562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd2562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(16,12), "dd2562");
    check_base_class_offset(lv, (cc562*), 0, "dd2562");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2562.d");
    test_class_info(&lv, &cd_dd2562);
    dp->~dd2562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2562(Test_dd2562, "dd2562", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2562C1Ev();
extern void _ZN6dd2562D1Ev();
Name_Map name_map_dd2562[] = {
  NSPAIR(_ZN6dd2562C1Ev),
  NSPAIR(_ZN6dd2562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd2562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV6dd2562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd2562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd2562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd2562[] = {
  {&(_ZTV6dd2562[3]),  3,11},
  {&(_tg__ZTV5cc562__6dd2562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd2562[4]),  4,6},
  {&(_ZTV6dd2562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static VTBL_ENTRY alt_thunk_names1224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2562 = {  "dd2562", // class name
  bases_dd2562, 3,
  &(vtc_dd2562[0]), // expected_vtbl_contents
  &(vtt_dd2562[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2562),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1224,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02562  : dd2562 {
  int e;
  ~ee02562(); // tgen
  ee02562(); // tgen
};
//SIG(1 ee02562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee02562 ::~ee02562(){ note_dtor("ee02562", this);} // tgen
ee02562 ::ee02562(){ note_ctor("ee02562", this);} // tgen

static void Test_ee02562()
{
  extern Class_Descriptor cd_ee02562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02562, buf);
    ee02562 *dp, &lv = *(dp=new (buf) ee02562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee02562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(24,16), "ee02562");
    check_base_class_offset(lv, (cc562*)(dd2562*), 0, "ee02562");
    check_base_class_offset(lv, (dd2562*), 0, "ee02562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02562.e");
    test_class_info(&lv, &cd_ee02562);
    dp->~ee02562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02562(Test_ee02562, "ee02562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02562C1Ev();
extern void _ZN7ee02562D1Ev();
Name_Map name_map_ee02562[] = {
  NSPAIR(_ZN7ee02562C1Ev),
  NSPAIR(_ZN7ee02562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee02562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee02562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee02562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee02562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee02562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee02562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee02562[] = {
  {&(_ZTV7ee02562[3]),  3,11},
  {&(_tg__ZTV6dd2562__7ee02562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee02562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee02562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee02562[4]),  4,6},
  {&(_ZTV7ee02562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee02562[];
extern  VTBL_ENTRY _ZTV7ee02562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02562[];
static VTBL_ENTRY alt_thunk_names1225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02562 = {  "ee02562", // class name
  bases_ee02562, 4,
  &(vtc_ee02562[0]), // expected_vtbl_contents
  &(vtt_ee02562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1225,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12562  : virtual dd2562 {
  int e;
  ~ee12562(); // tgen
  ee12562(); // tgen
};
//SIG(1 ee12562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee12562 ::~ee12562(){ note_dtor("ee12562", this);} // tgen
ee12562 ::ee12562(){ note_ctor("ee12562", this);} // tgen

static void Test_ee12562()
{
  extern Class_Descriptor cd_ee12562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12562, buf);
    ee12562 *dp, &lv = *(dp=new (buf) ee12562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee12562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(32,20), "ee12562");
    check_base_class_offset(lv, (cc562*)(dd2562*), ABISELECT(16,8), "ee12562");
    check_base_class_offset(lv, (dd2562*), ABISELECT(16,8), "ee12562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12562.e");
    test_class_info(&lv, &cd_ee12562);
    dp->~ee12562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12562(Test_ee12562, "ee12562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12562C1Ev();
extern void _ZN7ee12562D1Ev();
Name_Map name_map_ee12562[] = {
  NSPAIR(_ZN7ee12562C1Ev),
  NSPAIR(_ZN7ee12562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee12562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12562[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee12562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee12562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee12562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee12562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee12562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee12562[] = {
  {&(_ZTV7ee12562[4]),  4,17},
  {&(_ZTV7ee12562[9]),  9,17},
  {&(_ZTV7ee12562[15]),  15,17},
  {&(_tg__ZTV6dd2562__7ee12562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee12562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee12562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee12562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12562[];
extern  VTBL_ENTRY _ZTV7ee12562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12562[];
static VTBL_ENTRY alt_thunk_names1226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12562 = {  "ee12562", // class name
  bases_ee12562, 4,
  &(vtc_ee12562[0]), // expected_vtbl_contents
  &(vtt_ee12562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1226,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22562  : dd2562 {
  int e;
  virtual void  foo(); // _ZN7ee225623fooEv
  ~ee22562(); // tgen
  ee22562(); // tgen
};
//SIG(1 ee22562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee22562 ::foo(){vfunc_called(this, "_ZN7ee225623fooEv");}
ee22562 ::~ee22562(){ note_dtor("ee22562", this);} // tgen
ee22562 ::ee22562(){ note_ctor("ee22562", this);} // tgen

static void Test_ee22562()
{
  extern Class_Descriptor cd_ee22562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22562, buf);
    ee22562 *dp, &lv = *(dp=new (buf) ee22562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee22562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(24,16), "ee22562");
    check_base_class_offset(lv, (cc562*)(dd2562*), 0, "ee22562");
    check_base_class_offset(lv, (dd2562*), 0, "ee22562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22562.e");
    test_class_info(&lv, &cd_ee22562);
    dp->~ee22562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22562(Test_ee22562, "ee22562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22562C1Ev();
extern void _ZN7ee22562D1Ev();
Name_Map name_map_ee22562[] = {
  NSPAIR(_ZN7ee22562C1Ev),
  NSPAIR(_ZN7ee22562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee22562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22562[];
extern void _ZN5cc5623barEv();
extern void _ZN7ee225623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee225623fooEv,_ZTv0_n12_N7ee225623fooEv)();
extern void ABISELECT(_ZThn24_N7ee225623fooEv,_ZThn16_N7ee225623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN7ee225623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee225623fooEv,_ZTv0_n12_N7ee225623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee22562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee22562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee22562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee22562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee22562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee22562[] = {
  {&(_ZTV7ee22562[3]),  3,11},
  {&(_tg__ZTV6dd2562__7ee22562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee22562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee22562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee22562[4]),  4,6},
  {&(_ZTV7ee22562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee22562[];
extern  VTBL_ENTRY _ZTV7ee22562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22562[];
static VTBL_ENTRY alt_thunk_names1227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee225623fooEv,_ZTv0_n12_N7ee225623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee225623fooEv,_ZThn16_N7ee225623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22562 = {  "ee22562", // class name
  bases_ee22562, 4,
  &(vtc_ee22562[0]), // expected_vtbl_contents
  &(vtt_ee22562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1227,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32562  : virtual dd2562 {
  int e;
  virtual void  foo(); // _ZN7ee325623fooEv
  ~ee32562(); // tgen
  ee32562(); // tgen
};
//SIG(1 ee32562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee32562 ::foo(){vfunc_called(this, "_ZN7ee325623fooEv");}
ee32562 ::~ee32562(){ note_dtor("ee32562", this);} // tgen
ee32562 ::ee32562(){ note_ctor("ee32562", this);} // tgen

static void Test_ee32562()
{
  extern Class_Descriptor cd_ee32562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32562, buf);
    ee32562 *dp, &lv = *(dp=new (buf) ee32562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee32562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(32,20), "ee32562");
    check_base_class_offset(lv, (cc562*)(dd2562*), ABISELECT(16,8), "ee32562");
    check_base_class_offset(lv, (dd2562*), ABISELECT(16,8), "ee32562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32562.e");
    test_class_info(&lv, &cd_ee32562);
    dp->~ee32562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32562(Test_ee32562, "ee32562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32562C1Ev();
extern void _ZN7ee32562D1Ev();
Name_Map name_map_ee32562[] = {
  NSPAIR(_ZN7ee32562C1Ev),
  NSPAIR(_ZN7ee32562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee32562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32562[];
extern void _ZN7ee325623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee325623fooEv,_ZTv0_n20_N7ee325623fooEv)();
extern void ABISELECT(_ZThn16_N7ee325623fooEv,_ZThn8_N7ee325623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee325623fooEv,_ZTv0_n12_N7ee325623fooEv)();
extern void ABISELECT(_ZThn32_N7ee325623fooEv,_ZThn20_N7ee325623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32562[0]),
  (VTBL_ENTRY)&_ZN7ee325623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee325623fooEv,_ZTv0_n20_N7ee325623fooEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee325623fooEv,_ZTv0_n12_N7ee325623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee32562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee32562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee32562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee32562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee32562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee32562[] = {
  {&(_ZTV7ee32562[4]),  4,18},
  {&(_ZTV7ee32562[10]),  10,18},
  {&(_ZTV7ee32562[16]),  16,18},
  {&(_tg__ZTV6dd2562__7ee32562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee32562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee32562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee32562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32562[];
extern  VTBL_ENTRY _ZTV7ee32562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32562[];
static VTBL_ENTRY alt_thunk_names1228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee325623fooEv,_ZTv0_n12_N7ee325623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee325623fooEv,_ZThn20_N7ee325623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee325623fooEv,_ZTv0_n20_N7ee325623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee325623fooEv,_ZThn8_N7ee325623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32562 = {  "ee32562", // class name
  bases_ee32562, 4,
  &(vtc_ee32562[0]), // expected_vtbl_contents
  &(vtt_ee32562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32562),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1228,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42562  : dd2562 {
  int e;
  virtual void  bar(); // _ZN7ee425623barEv
  ~ee42562(); // tgen
  ee42562(); // tgen
};
//SIG(1 ee42562) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee42562 ::bar(){vfunc_called(this, "_ZN7ee425623barEv");}
ee42562 ::~ee42562(){ note_dtor("ee42562", this);} // tgen
ee42562 ::ee42562(){ note_ctor("ee42562", this);} // tgen

static void Test_ee42562()
{
  extern Class_Descriptor cd_ee42562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42562, buf);
    ee42562 *dp, &lv = *(dp=new (buf) ee42562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee42562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(24,16), "ee42562");
    check_base_class_offset(lv, (cc562*)(dd2562*), 0, "ee42562");
    check_base_class_offset(lv, (dd2562*), 0, "ee42562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42562.e");
    test_class_info(&lv, &cd_ee42562);
    dp->~ee42562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42562(Test_ee42562, "ee42562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42562C1Ev();
extern void _ZN7ee42562D1Ev();
Name_Map name_map_ee42562[] = {
  NSPAIR(_ZN7ee42562C1Ev),
  NSPAIR(_ZN7ee42562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee42562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42562[];
extern void _ZN7ee425623barEv();
extern void _ZN6dd25623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee425623barEv,_ZTv0_n16_N7ee425623barEv)();
extern void ABISELECT(_ZThn24_N7ee425623barEv,_ZThn16_N7ee425623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42562[0]),
  (VTBL_ENTRY)&_ZN7ee425623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee425623barEv,_ZTv0_n16_N7ee425623barEv),
};
extern VTBL_ENTRY _ZTV7ee42562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee42562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee42562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee42562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee42562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee42562[] = {
  {&(_ZTV7ee42562[3]),  3,11},
  {&(_tg__ZTV6dd2562__7ee42562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee42562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee42562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee42562[4]),  4,6},
  {&(_ZTV7ee42562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42562[];
extern  VTBL_ENTRY _ZTV7ee42562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42562[];
static VTBL_ENTRY alt_thunk_names1229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee425623barEv,_ZTv0_n16_N7ee425623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee425623barEv,_ZThn16_N7ee425623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42562 = {  "ee42562", // class name
  bases_ee42562, 4,
  &(vtc_ee42562[0]), // expected_vtbl_contents
  &(vtt_ee42562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1229,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52562  : virtual dd2562 {
  int e;
  virtual void  bar(); // _ZN7ee525623barEv
  ~ee52562(); // tgen
  ee52562(); // tgen
};
//SIG(1 ee52562) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee52562 ::bar(){vfunc_called(this, "_ZN7ee525623barEv");}
ee52562 ::~ee52562(){ note_dtor("ee52562", this);} // tgen
ee52562 ::ee52562(){ note_ctor("ee52562", this);} // tgen

static void Test_ee52562()
{
  extern Class_Descriptor cd_ee52562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52562, buf);
    ee52562 *dp, &lv = *(dp=new (buf) ee52562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee52562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(32,20), "ee52562");
    check_base_class_offset(lv, (cc562*)(dd2562*), ABISELECT(16,8), "ee52562");
    check_base_class_offset(lv, (dd2562*), ABISELECT(16,8), "ee52562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52562.e");
    test_class_info(&lv, &cd_ee52562);
    dp->~ee52562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52562(Test_ee52562, "ee52562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52562C1Ev();
extern void _ZN7ee52562D1Ev();
Name_Map name_map_ee52562[] = {
  NSPAIR(_ZN7ee52562C1Ev),
  NSPAIR(_ZN7ee52562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee52562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52562[];
extern void _ZN7ee525623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee525623barEv,_ZTv0_n16_N7ee525623barEv)();
extern void ABISELECT(_ZThn16_N7ee525623barEv,_ZThn8_N7ee525623barEv)() __attribute__((weak));
extern void _ZN6dd25623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee525623barEv,_ZTv0_n16_N7ee525623barEv)();
extern void ABISELECT(_ZThn32_N7ee525623barEv,_ZThn20_N7ee525623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52562[0]),
  (VTBL_ENTRY)&_ZN7ee525623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee525623barEv,_ZTv0_n16_N7ee525623barEv),
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee525623barEv,_ZTv0_n16_N7ee525623barEv),
};
extern VTBL_ENTRY _ZTV7ee52562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee52562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee52562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee52562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee52562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee52562[] = {
  {&(_ZTV7ee52562[4]),  4,18},
  {&(_ZTV7ee52562[10]),  10,18},
  {&(_ZTV7ee52562[16]),  16,18},
  {&(_tg__ZTV6dd2562__7ee52562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee52562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee52562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee52562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52562[];
extern  VTBL_ENTRY _ZTV7ee52562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52562[];
static VTBL_ENTRY alt_thunk_names1230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee525623barEv,_ZTv0_n16_N7ee525623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee525623barEv,_ZThn20_N7ee525623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee525623barEv,_ZThn8_N7ee525623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52562 = {  "ee52562", // class name
  bases_ee52562, 4,
  &(vtc_ee52562[0]), // expected_vtbl_contents
  &(vtt_ee52562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52562),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1230,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62562  : dd2562 {
  int e;
  virtual void  foo(); // _ZN7ee625623fooEv
  virtual void  bar(); // _ZN7ee625623barEv
  ~ee62562(); // tgen
  ee62562(); // tgen
};
//SIG(1 ee62562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62562 ::foo(){vfunc_called(this, "_ZN7ee625623fooEv");}
void  ee62562 ::bar(){vfunc_called(this, "_ZN7ee625623barEv");}
ee62562 ::~ee62562(){ note_dtor("ee62562", this);} // tgen
ee62562 ::ee62562(){ note_ctor("ee62562", this);} // tgen

static void Test_ee62562()
{
  extern Class_Descriptor cd_ee62562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62562, buf);
    ee62562 *dp, &lv = *(dp=new (buf) ee62562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee62562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(24,16), "ee62562");
    check_base_class_offset(lv, (cc562*)(dd2562*), 0, "ee62562");
    check_base_class_offset(lv, (dd2562*), 0, "ee62562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62562.e");
    test_class_info(&lv, &cd_ee62562);
    dp->~ee62562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62562(Test_ee62562, "ee62562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62562C1Ev();
extern void _ZN7ee62562D1Ev();
Name_Map name_map_ee62562[] = {
  NSPAIR(_ZN7ee62562C1Ev),
  NSPAIR(_ZN7ee62562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee62562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62562[];
extern void _ZN7ee625623barEv();
extern void _ZN7ee625623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee625623fooEv,_ZTv0_n12_N7ee625623fooEv)();
extern void ABISELECT(_ZThn24_N7ee625623fooEv,_ZThn16_N7ee625623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee625623barEv,_ZTv0_n16_N7ee625623barEv)();
extern void ABISELECT(_ZThn24_N7ee625623barEv,_ZThn16_N7ee625623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62562[0]),
  (VTBL_ENTRY)&_ZN7ee625623barEv,
  (VTBL_ENTRY)&_ZN7ee625623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee625623fooEv,_ZTv0_n12_N7ee625623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee625623barEv,_ZTv0_n16_N7ee625623barEv),
};
extern VTBL_ENTRY _ZTV7ee62562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee62562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee62562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee62562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee62562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee62562[] = {
  {&(_ZTV7ee62562[3]),  3,11},
  {&(_tg__ZTV6dd2562__7ee62562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee62562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee62562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee62562[4]),  4,6},
  {&(_ZTV7ee62562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62562[];
extern  VTBL_ENTRY _ZTV7ee62562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62562[];
static VTBL_ENTRY alt_thunk_names1231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd25623fooEv,_ZThn16_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee625623barEv,_ZTv0_n16_N7ee625623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee625623barEv,_ZThn16_N7ee625623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee625623fooEv,_ZTv0_n12_N7ee625623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee625623fooEv,_ZThn16_N7ee625623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62562 = {  "ee62562", // class name
  bases_ee62562, 4,
  &(vtc_ee62562[0]), // expected_vtbl_contents
  &(vtt_ee62562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1231,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72562  : virtual dd2562 {
  int e;
  virtual void  foo(); // _ZN7ee725623fooEv
  virtual void  bar(); // _ZN7ee725623barEv
  ~ee72562(); // tgen
  ee72562(); // tgen
};
//SIG(1 ee72562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72562 ::foo(){vfunc_called(this, "_ZN7ee725623fooEv");}
void  ee72562 ::bar(){vfunc_called(this, "_ZN7ee725623barEv");}
ee72562 ::~ee72562(){ note_dtor("ee72562", this);} // tgen
ee72562 ::ee72562(){ note_ctor("ee72562", this);} // tgen

static void Test_ee72562()
{
  extern Class_Descriptor cd_ee72562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72562, buf);
    ee72562 *dp, &lv = *(dp=new (buf) ee72562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee72562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd2562*), ABISELECT(32,20), "ee72562");
    check_base_class_offset(lv, (cc562*)(dd2562*), ABISELECT(16,8), "ee72562");
    check_base_class_offset(lv, (dd2562*), ABISELECT(16,8), "ee72562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72562.e");
    test_class_info(&lv, &cd_ee72562);
    dp->~ee72562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72562(Test_ee72562, "ee72562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72562C1Ev();
extern void _ZN7ee72562D1Ev();
Name_Map name_map_ee72562[] = {
  NSPAIR(_ZN7ee72562C1Ev),
  NSPAIR(_ZN7ee72562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd2562;
extern VTBL_ENTRY _ZTI6dd2562[];
extern  VTBL_ENTRY _ZTV6dd2562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2562[];
static Base_Class bases_ee72562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72562[];
extern void _ZN7ee725623fooEv();
extern void _ZN7ee725623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee725623barEv,_ZTv0_n16_N7ee725623barEv)();
extern void ABISELECT(_ZThn16_N7ee725623barEv,_ZThn8_N7ee725623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee725623fooEv,_ZTv0_n20_N7ee725623fooEv)();
extern void ABISELECT(_ZThn16_N7ee725623fooEv,_ZThn8_N7ee725623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee725623fooEv,_ZTv0_n12_N7ee725623fooEv)();
extern void ABISELECT(_ZThn32_N7ee725623fooEv,_ZThn20_N7ee725623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee725623barEv,_ZTv0_n16_N7ee725623barEv)();
extern void ABISELECT(_ZThn32_N7ee725623barEv,_ZThn20_N7ee725623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72562[0]),
  (VTBL_ENTRY)&_ZN7ee725623fooEv,
  (VTBL_ENTRY)&_ZN7ee725623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee725623barEv,_ZTv0_n16_N7ee725623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee725623fooEv,_ZTv0_n20_N7ee725623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee725623fooEv,_ZTv0_n12_N7ee725623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee725623barEv,_ZTv0_n16_N7ee725623barEv),
};
extern VTBL_ENTRY _ZTV7ee72562[];
extern void _ZN5cc5623barEv();
extern void _ZN6dd25623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd2562__7ee72562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  (VTBL_ENTRY)&_ZN6dd25623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd2562__7ee72562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd2562__7ee72562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv)();
extern void ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2562__7ee72562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee72562[] = {
  {&(_ZTV7ee72562[4]),  4,19},
  {&(_ZTV7ee72562[11]),  11,19},
  {&(_ZTV7ee72562[17]),  17,19},
  {&(_tg__ZTV6dd2562__7ee72562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd2562__7ee72562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd2562__7ee72562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2562__7ee72562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72562[];
extern  VTBL_ENTRY _ZTV7ee72562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72562[];
static VTBL_ENTRY alt_thunk_names1232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd25623fooEv,_ZTv0_n12_N6dd25623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd25623fooEv,_ZThn12_N6dd25623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee725623fooEv,_ZTv0_n12_N7ee725623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee725623fooEv,_ZThn20_N7ee725623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee725623fooEv,_ZTv0_n20_N7ee725623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee725623fooEv,_ZThn8_N7ee725623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee725623barEv,_ZTv0_n16_N7ee725623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee725623barEv,_ZThn20_N7ee725623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee725623barEv,_ZThn8_N7ee725623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72562 = {  "ee72562", // class name
  bases_ee72562, 4,
  &(vtc_ee72562[0]), // expected_vtbl_contents
  &(vtt_ee72562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72562),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1232,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3562  : virtual cc562 {
  int d;
  virtual void  foo(); // _ZN6dd35623fooEv
  ~dd3562(); // tgen
  dd3562(); // tgen
};
//SIG(-1 dd3562) C1{ VBC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  dd3562 ::foo(){vfunc_called(this, "_ZN6dd35623fooEv");}
dd3562 ::~dd3562(){ note_dtor("dd3562", this);} // tgen
dd3562 ::dd3562(){ note_ctor("dd3562", this);} // tgen

static void Test_dd3562()
{
  extern Class_Descriptor cd_dd3562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3562, buf);
    dd3562 *dp, &lv = *(dp=new (buf) dd3562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd3562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,16), "dd3562");
    check_base_class_offset(lv, (cc562*), ABISELECT(16,8), "dd3562");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3562.d");
    test_class_info(&lv, &cd_dd3562);
    dp->~dd3562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3562(Test_dd3562, "dd3562", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3562C1Ev();
extern void _ZN6dd3562D1Ev();
Name_Map name_map_dd3562[] = {
  NSPAIR(_ZN6dd3562C1Ev),
  NSPAIR(_ZN6dd3562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd3562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc562,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3562[];
extern void _ZN6dd35623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV6dd3562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd3562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd3562[] = {
  {&(_ZTV6dd3562[4]),  4,16},
  {&(_ZTV6dd3562[9]),  9,16},
  {&(_ZTV6dd3562[14]),  14,16},
  {&(_tg__ZTV5cc562__6dd3562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd3562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static VTBL_ENTRY alt_thunk_names1233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3562 = {  "dd3562", // class name
  bases_dd3562, 3,
  &(vtc_dd3562[0]), // expected_vtbl_contents
  &(vtt_dd3562[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3562),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1233,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03562  : dd3562 {
  int e;
  ~ee03562(); // tgen
  ee03562(); // tgen
};
//SIG(1 ee03562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee03562 ::~ee03562(){ note_dtor("ee03562", this);} // tgen
ee03562 ::ee03562(){ note_ctor("ee03562", this);} // tgen

static void Test_ee03562()
{
  extern Class_Descriptor cd_ee03562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03562, buf);
    ee03562 *dp, &lv = *(dp=new (buf) ee03562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee03562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee03562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(16,12), "ee03562");
    check_base_class_offset(lv, (dd3562*), 0, "ee03562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03562.e");
    test_class_info(&lv, &cd_ee03562);
    dp->~ee03562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03562(Test_ee03562, "ee03562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03562C1Ev();
extern void _ZN7ee03562D1Ev();
Name_Map name_map_ee03562[] = {
  NSPAIR(_ZN7ee03562C1Ev),
  NSPAIR(_ZN7ee03562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee03562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03562[];
extern void _ZN6dd35623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee03562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee03562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee03562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee03562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee03562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee03562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee03562[] = {
  {&(_ZTV7ee03562[4]),  4,16},
  {&(_tg__ZTV6dd3562__7ee03562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee03562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee03562[4]),  4,6},
  {&(_ZTV7ee03562[9]),  9,16},
  {&(_ZTV7ee03562[14]),  14,16},
  {&(_tg__ZTV5cc562__7ee03562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee03562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03562[];
extern  VTBL_ENTRY _ZTV7ee03562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03562[];
static VTBL_ENTRY alt_thunk_names1234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03562 = {  "ee03562", // class name
  bases_ee03562, 4,
  &(vtc_ee03562[0]), // expected_vtbl_contents
  &(vtt_ee03562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1234,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13562  : virtual dd3562 {
  int e;
  ~ee13562(); // tgen
  ee13562(); // tgen
};
//SIG(1 ee13562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} Fi}


ee13562 ::~ee13562(){ note_dtor("ee13562", this);} // tgen
ee13562 ::ee13562(){ note_ctor("ee13562", this);} // tgen

static void Test_ee13562()
{
  extern Class_Descriptor cd_ee13562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13562, buf);
    ee13562 *dp, &lv = *(dp=new (buf) ee13562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee13562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee13562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(32,16), "ee13562");
    check_base_class_offset(lv, (dd3562*), ABISELECT(16,8), "ee13562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13562.e");
    test_class_info(&lv, &cd_ee13562);
    dp->~ee13562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13562(Test_ee13562, "ee13562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13562C1Ev();
extern void _ZN7ee13562D1Ev();
Name_Map name_map_ee13562[] = {
  NSPAIR(_ZN7ee13562C1Ev),
  NSPAIR(_ZN7ee13562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee13562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13562[];
extern void _ZN6dd35623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13562[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee13562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee13562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee13562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee13562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee13562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee13562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee13562[] = {
  {&(_ZTV7ee13562[5]),  5,22},
  {&(_ZTV7ee13562[10]),  10,22},
  {&(_ZTV7ee13562[15]),  15,22},
  {&(_ZTV7ee13562[20]),  20,22},
  {&(_tg__ZTV6dd3562__7ee13562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee13562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee13562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee13562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee13562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13562[];
extern  VTBL_ENTRY _ZTV7ee13562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13562[];
static VTBL_ENTRY alt_thunk_names1235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13562 = {  "ee13562", // class name
  bases_ee13562, 4,
  &(vtc_ee13562[0]), // expected_vtbl_contents
  &(vtt_ee13562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13562),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1235,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23562  : dd3562 {
  int e;
  virtual void  foo(); // _ZN7ee235623fooEv
  ~ee23562(); // tgen
  ee23562(); // tgen
};
//SIG(1 ee23562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee23562 ::foo(){vfunc_called(this, "_ZN7ee235623fooEv");}
ee23562 ::~ee23562(){ note_dtor("ee23562", this);} // tgen
ee23562 ::ee23562(){ note_ctor("ee23562", this);} // tgen

static void Test_ee23562()
{
  extern Class_Descriptor cd_ee23562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23562, buf);
    ee23562 *dp, &lv = *(dp=new (buf) ee23562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee23562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee23562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(16,12), "ee23562");
    check_base_class_offset(lv, (dd3562*), 0, "ee23562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23562.e");
    test_class_info(&lv, &cd_ee23562);
    dp->~ee23562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23562(Test_ee23562, "ee23562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23562C1Ev();
extern void _ZN7ee23562D1Ev();
Name_Map name_map_ee23562[] = {
  NSPAIR(_ZN7ee23562C1Ev),
  NSPAIR(_ZN7ee23562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee23562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23562[];
extern void _ZN7ee235623fooEv();
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee235623fooEv,_ZTv0_n12_N7ee235623fooEv)();
extern void ABISELECT(_ZThn32_N7ee235623fooEv,_ZThn20_N7ee235623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23562[0]),
  (VTBL_ENTRY)&_ZN7ee235623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee235623fooEv,_ZTv0_n12_N7ee235623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee23562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee23562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee23562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee23562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee23562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee23562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee23562[] = {
  {&(_ZTV7ee23562[4]),  4,16},
  {&(_tg__ZTV6dd3562__7ee23562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee23562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee23562[4]),  4,6},
  {&(_ZTV7ee23562[9]),  9,16},
  {&(_ZTV7ee23562[14]),  14,16},
  {&(_tg__ZTV5cc562__7ee23562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee23562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23562[];
extern  VTBL_ENTRY _ZTV7ee23562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23562[];
static VTBL_ENTRY alt_thunk_names1236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee235623fooEv,_ZTv0_n12_N7ee235623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee235623fooEv,_ZThn20_N7ee235623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23562 = {  "ee23562", // class name
  bases_ee23562, 4,
  &(vtc_ee23562[0]), // expected_vtbl_contents
  &(vtt_ee23562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1236,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33562  : virtual dd3562 {
  int e;
  virtual void  foo(); // _ZN7ee335623fooEv
  ~ee33562(); // tgen
  ee33562(); // tgen
};
//SIG(1 ee33562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 Fi}


void  ee33562 ::foo(){vfunc_called(this, "_ZN7ee335623fooEv");}
ee33562 ::~ee33562(){ note_dtor("ee33562", this);} // tgen
ee33562 ::ee33562(){ note_ctor("ee33562", this);} // tgen

static void Test_ee33562()
{
  extern Class_Descriptor cd_ee33562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33562, buf);
    ee33562 *dp, &lv = *(dp=new (buf) ee33562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee33562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee33562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(32,16), "ee33562");
    check_base_class_offset(lv, (dd3562*), ABISELECT(16,8), "ee33562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33562.e");
    test_class_info(&lv, &cd_ee33562);
    dp->~ee33562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33562(Test_ee33562, "ee33562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33562C1Ev();
extern void _ZN7ee33562D1Ev();
Name_Map name_map_ee33562[] = {
  NSPAIR(_ZN7ee33562C1Ev),
  NSPAIR(_ZN7ee33562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee33562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33562[];
extern void _ZN7ee335623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee335623fooEv,_ZTv0_n20_N7ee335623fooEv)();
extern void ABISELECT(_ZThn16_N7ee335623fooEv,_ZThn8_N7ee335623fooEv)() __attribute__((weak));
extern void _ZN5cc5623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee335623fooEv,_ZTv0_n12_N7ee335623fooEv)();
extern void ABISELECT(_ZThn48_N7ee335623fooEv,_ZThn24_N7ee335623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33562[0]),
  (VTBL_ENTRY)&_ZN7ee335623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee335623fooEv,_ZTv0_n20_N7ee335623fooEv),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee335623fooEv,_ZTv0_n12_N7ee335623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern VTBL_ENTRY _ZTV7ee33562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee33562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee33562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee33562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee33562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee33562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee33562[] = {
  {&(_ZTV7ee33562[5]),  5,23},
  {&(_ZTV7ee33562[11]),  11,23},
  {&(_ZTV7ee33562[16]),  16,23},
  {&(_ZTV7ee33562[21]),  21,23},
  {&(_tg__ZTV6dd3562__7ee33562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee33562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee33562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee33562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee33562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33562[];
extern  VTBL_ENTRY _ZTV7ee33562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33562[];
static VTBL_ENTRY alt_thunk_names1237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee335623fooEv,_ZTv0_n12_N7ee335623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee335623fooEv,_ZThn24_N7ee335623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee335623fooEv,_ZTv0_n20_N7ee335623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee335623fooEv,_ZThn8_N7ee335623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33562 = {  "ee33562", // class name
  bases_ee33562, 4,
  &(vtc_ee33562[0]), // expected_vtbl_contents
  &(vtt_ee33562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33562),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1237,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43562  : dd3562 {
  int e;
  virtual void  bar(); // _ZN7ee435623barEv
  ~ee43562(); // tgen
  ee43562(); // tgen
};
//SIG(1 ee43562) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee43562 ::bar(){vfunc_called(this, "_ZN7ee435623barEv");}
ee43562 ::~ee43562(){ note_dtor("ee43562", this);} // tgen
ee43562 ::ee43562(){ note_ctor("ee43562", this);} // tgen

static void Test_ee43562()
{
  extern Class_Descriptor cd_ee43562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43562, buf);
    ee43562 *dp, &lv = *(dp=new (buf) ee43562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee43562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee43562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(16,12), "ee43562");
    check_base_class_offset(lv, (dd3562*), 0, "ee43562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43562.e");
    test_class_info(&lv, &cd_ee43562);
    dp->~ee43562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43562(Test_ee43562, "ee43562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43562C1Ev();
extern void _ZN7ee43562D1Ev();
Name_Map name_map_ee43562[] = {
  NSPAIR(_ZN7ee43562C1Ev),
  NSPAIR(_ZN7ee43562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee43562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43562[];
extern void _ZN6dd35623fooEv();
extern void _ZN7ee435623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee435623barEv,_ZTv0_n16_N7ee435623barEv)();
extern void ABISELECT(_ZThn16_N7ee435623barEv,_ZThn12_N7ee435623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee435623barEv,_ZTv0_n16_N7ee435623barEv)();
extern void ABISELECT(_ZThn32_N7ee435623barEv,_ZThn20_N7ee435623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
  (VTBL_ENTRY)&_ZN7ee435623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee435623barEv,_ZTv0_n16_N7ee435623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee435623barEv,_ZTv0_n16_N7ee435623barEv),
};
extern VTBL_ENTRY _ZTV7ee43562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee43562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee43562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee43562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee43562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee43562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee43562[] = {
  {&(_ZTV7ee43562[4]),  4,17},
  {&(_tg__ZTV6dd3562__7ee43562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee43562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee43562[4]),  4,6},
  {&(_ZTV7ee43562[10]),  10,17},
  {&(_ZTV7ee43562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee43562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee43562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43562[];
extern  VTBL_ENTRY _ZTV7ee43562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43562[];
static VTBL_ENTRY alt_thunk_names1238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee435623barEv,_ZTv0_n16_N7ee435623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee435623barEv,_ZThn20_N7ee435623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee435623barEv,_ZThn12_N7ee435623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43562 = {  "ee43562", // class name
  bases_ee43562, 4,
  &(vtc_ee43562[0]), // expected_vtbl_contents
  &(vtt_ee43562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1238,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53562  : virtual dd3562 {
  int e;
  virtual void  bar(); // _ZN7ee535623barEv
  ~ee53562(); // tgen
  ee53562(); // tgen
};
//SIG(1 ee53562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v2 Fi} v1 Fi}


void  ee53562 ::bar(){vfunc_called(this, "_ZN7ee535623barEv");}
ee53562 ::~ee53562(){ note_dtor("ee53562", this);} // tgen
ee53562 ::ee53562(){ note_ctor("ee53562", this);} // tgen

static void Test_ee53562()
{
  extern Class_Descriptor cd_ee53562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53562, buf);
    ee53562 *dp, &lv = *(dp=new (buf) ee53562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee53562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee53562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(32,16), "ee53562");
    check_base_class_offset(lv, (dd3562*), ABISELECT(16,8), "ee53562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53562.e");
    test_class_info(&lv, &cd_ee53562);
    dp->~ee53562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53562(Test_ee53562, "ee53562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53562C1Ev();
extern void _ZN7ee53562D1Ev();
Name_Map name_map_ee53562[] = {
  NSPAIR(_ZN7ee53562C1Ev),
  NSPAIR(_ZN7ee53562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee53562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53562[];
extern void _ZN7ee535623barEv();
extern void _ZN6dd35623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee535623barEv,_ZTv0_n16_N7ee535623barEv)();
extern void ABISELECT(_ZThn32_N7ee535623barEv,_ZThn16_N7ee535623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee535623barEv,_ZTv0_n16_N7ee535623barEv)();
extern void ABISELECT(_ZThn48_N7ee535623barEv,_ZThn24_N7ee535623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53562[0]),
  (VTBL_ENTRY)&_ZN7ee535623barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee535623barEv,_ZTv0_n16_N7ee535623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee535623barEv,_ZTv0_n16_N7ee535623barEv),
};
extern VTBL_ENTRY _ZTV7ee53562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee53562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee53562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee53562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee53562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee53562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee53562[] = {
  {&(_ZTV7ee53562[5]),  5,23},
  {&(_ZTV7ee53562[11]),  11,23},
  {&(_ZTV7ee53562[16]),  16,23},
  {&(_ZTV7ee53562[21]),  21,23},
  {&(_tg__ZTV6dd3562__7ee53562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee53562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee53562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee53562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee53562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53562[];
extern  VTBL_ENTRY _ZTV7ee53562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53562[];
static VTBL_ENTRY alt_thunk_names1239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee535623barEv,_ZTv0_n16_N7ee535623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee535623barEv,_ZThn24_N7ee535623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee535623barEv,_ZThn16_N7ee535623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53562 = {  "ee53562", // class name
  bases_ee53562, 4,
  &(vtc_ee53562[0]), // expected_vtbl_contents
  &(vtt_ee53562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53562),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1239,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63562  : dd3562 {
  int e;
  virtual void  foo(); // _ZN7ee635623fooEv
  virtual void  bar(); // _ZN7ee635623barEv
  ~ee63562(); // tgen
  ee63562(); // tgen
};
//SIG(1 ee63562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63562 ::foo(){vfunc_called(this, "_ZN7ee635623fooEv");}
void  ee63562 ::bar(){vfunc_called(this, "_ZN7ee635623barEv");}
ee63562 ::~ee63562(){ note_dtor("ee63562", this);} // tgen
ee63562 ::ee63562(){ note_ctor("ee63562", this);} // tgen

static void Test_ee63562()
{
  extern Class_Descriptor cd_ee63562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63562, buf);
    ee63562 *dp, &lv = *(dp=new (buf) ee63562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee63562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee63562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(16,12), "ee63562");
    check_base_class_offset(lv, (dd3562*), 0, "ee63562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63562.e");
    test_class_info(&lv, &cd_ee63562);
    dp->~ee63562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63562(Test_ee63562, "ee63562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63562C1Ev();
extern void _ZN7ee63562D1Ev();
Name_Map name_map_ee63562[] = {
  NSPAIR(_ZN7ee63562C1Ev),
  NSPAIR(_ZN7ee63562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee63562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63562[];
extern void _ZN7ee635623fooEv();
extern void _ZN7ee635623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee635623barEv,_ZTv0_n16_N7ee635623barEv)();
extern void ABISELECT(_ZThn16_N7ee635623barEv,_ZThn12_N7ee635623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee635623fooEv,_ZTv0_n12_N7ee635623fooEv)();
extern void ABISELECT(_ZThn32_N7ee635623fooEv,_ZThn20_N7ee635623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee635623barEv,_ZTv0_n16_N7ee635623barEv)();
extern void ABISELECT(_ZThn32_N7ee635623barEv,_ZThn20_N7ee635623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63562[0]),
  (VTBL_ENTRY)&_ZN7ee635623fooEv,
  (VTBL_ENTRY)&_ZN7ee635623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee635623barEv,_ZTv0_n16_N7ee635623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee635623fooEv,_ZTv0_n12_N7ee635623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee635623barEv,_ZTv0_n16_N7ee635623barEv),
};
extern VTBL_ENTRY _ZTV7ee63562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee63562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee63562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee63562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee63562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee63562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee63562[] = {
  {&(_ZTV7ee63562[4]),  4,17},
  {&(_tg__ZTV6dd3562__7ee63562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee63562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee63562[4]),  4,6},
  {&(_ZTV7ee63562[10]),  10,17},
  {&(_ZTV7ee63562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee63562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee63562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63562[];
extern  VTBL_ENTRY _ZTV7ee63562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63562[];
static VTBL_ENTRY alt_thunk_names1240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn20_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee635623fooEv,_ZTv0_n12_N7ee635623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee635623fooEv,_ZThn20_N7ee635623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee635623barEv,_ZTv0_n16_N7ee635623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee635623barEv,_ZThn20_N7ee635623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee635623barEv,_ZThn12_N7ee635623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63562 = {  "ee63562", // class name
  bases_ee63562, 4,
  &(vtc_ee63562[0]), // expected_vtbl_contents
  &(vtt_ee63562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1240,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73562  : virtual dd3562 {
  int e;
  virtual void  foo(); // _ZN7ee735623fooEv
  virtual void  bar(); // _ZN7ee735623barEv
  ~ee73562(); // tgen
  ee73562(); // tgen
};
//SIG(1 ee73562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73562 ::foo(){vfunc_called(this, "_ZN7ee735623fooEv");}
void  ee73562 ::bar(){vfunc_called(this, "_ZN7ee735623barEv");}
ee73562 ::~ee73562(){ note_dtor("ee73562", this);} // tgen
ee73562 ::ee73562(){ note_ctor("ee73562", this);} // tgen

static void Test_ee73562()
{
  extern Class_Descriptor cd_ee73562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73562, buf);
    ee73562 *dp, &lv = *(dp=new (buf) ee73562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee73562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee73562");
    check_base_class_offset(lv, (cc562*)(dd3562*), ABISELECT(32,16), "ee73562");
    check_base_class_offset(lv, (dd3562*), ABISELECT(16,8), "ee73562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73562.e");
    test_class_info(&lv, &cd_ee73562);
    dp->~ee73562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73562(Test_ee73562, "ee73562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73562C1Ev();
extern void _ZN7ee73562D1Ev();
Name_Map name_map_ee73562[] = {
  NSPAIR(_ZN7ee73562C1Ev),
  NSPAIR(_ZN7ee73562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd3562;
extern VTBL_ENTRY _ZTI6dd3562[];
extern  VTBL_ENTRY _ZTV6dd3562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3562[];
static Base_Class bases_ee73562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3562,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73562[];
extern void _ZN7ee735623fooEv();
extern void _ZN7ee735623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee735623fooEv,_ZTv0_n20_N7ee735623fooEv)();
extern void ABISELECT(_ZThn16_N7ee735623fooEv,_ZThn8_N7ee735623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee735623barEv,_ZTv0_n16_N7ee735623barEv)();
extern void ABISELECT(_ZThn32_N7ee735623barEv,_ZThn16_N7ee735623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee735623fooEv,_ZTv0_n12_N7ee735623fooEv)();
extern void ABISELECT(_ZThn48_N7ee735623fooEv,_ZThn24_N7ee735623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee735623barEv,_ZTv0_n16_N7ee735623barEv)();
extern void ABISELECT(_ZThn48_N7ee735623barEv,_ZThn24_N7ee735623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73562[0]),
  (VTBL_ENTRY)&_ZN7ee735623fooEv,
  (VTBL_ENTRY)&_ZN7ee735623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee735623fooEv,_ZTv0_n20_N7ee735623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee735623barEv,_ZTv0_n16_N7ee735623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee735623fooEv,_ZTv0_n12_N7ee735623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee735623barEv,_ZTv0_n16_N7ee735623barEv),
};
extern VTBL_ENTRY _ZTV7ee73562[];
extern void _ZN6dd35623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3562__7ee73562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN6dd35623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd3562__7ee73562[] = {
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv)();
extern void ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3562__7ee73562[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee73562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee73562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee73562[] = {
  {&(_ZTV7ee73562[5]),  5,24},
  {&(_ZTV7ee73562[12]),  12,24},
  {&(_ZTV7ee73562[17]),  17,24},
  {&(_ZTV7ee73562[22]),  22,24},
  {&(_tg__ZTV6dd3562__7ee73562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd3562__7ee73562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd3562__7ee73562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee73562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee73562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73562[];
extern  VTBL_ENTRY _ZTV7ee73562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73562[];
static VTBL_ENTRY alt_thunk_names1241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd35623fooEv,_ZTv0_n12_N6dd35623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd35623fooEv,_ZThn16_N6dd35623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee735623fooEv,_ZTv0_n12_N7ee735623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee735623fooEv,_ZThn24_N7ee735623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee735623barEv,_ZTv0_n16_N7ee735623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee735623barEv,_ZThn24_N7ee735623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee735623barEv,_ZThn16_N7ee735623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee735623fooEv,_ZTv0_n20_N7ee735623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee735623fooEv,_ZThn8_N7ee735623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73562 = {  "ee73562", // class name
  bases_ee73562, 4,
  &(vtc_ee73562[0]), // expected_vtbl_contents
  &(vtt_ee73562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73562),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1241,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4562  : cc562 {
  int d;
  virtual void  bar(); // _ZN6dd45623barEv
  ~dd4562(); // tgen
  dd4562(); // tgen
};
//SIG(-1 dd4562) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd4562 ::bar(){vfunc_called(this, "_ZN6dd45623barEv");}
dd4562 ::~dd4562(){ note_dtor("dd4562", this);} // tgen
dd4562 ::dd4562(){ note_ctor("dd4562", this);} // tgen

static void Test_dd4562()
{
  extern Class_Descriptor cd_dd4562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4562, buf);
    dd4562 *dp, &lv = *(dp=new (buf) dd4562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd4562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(16,12), "dd4562");
    check_base_class_offset(lv, (cc562*), 0, "dd4562");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4562.d");
    test_class_info(&lv, &cd_dd4562);
    dp->~dd4562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4562(Test_dd4562, "dd4562", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4562C1Ev();
extern void _ZN6dd4562D1Ev();
Name_Map name_map_dd4562[] = {
  NSPAIR(_ZN6dd4562C1Ev),
  NSPAIR(_ZN6dd4562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd4562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4562[];
extern void _ZN6dd45623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
extern VTBL_ENTRY _ZTV6dd4562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd4562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd4562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd4562[] = {
  {&(_ZTV6dd4562[3]),  3,10},
  {&(_tg__ZTV5cc562__6dd4562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd4562[4]),  4,6},
  {&(_ZTV6dd4562[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static VTBL_ENTRY alt_thunk_names1242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4562 = {  "dd4562", // class name
  bases_dd4562, 3,
  &(vtc_dd4562[0]), // expected_vtbl_contents
  &(vtt_dd4562[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4562),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4562),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1242,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04562  : dd4562 {
  int e;
  ~ee04562(); // tgen
  ee04562(); // tgen
};
//SIG(1 ee04562) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee04562 ::~ee04562(){ note_dtor("ee04562", this);} // tgen
ee04562 ::ee04562(){ note_ctor("ee04562", this);} // tgen

static void Test_ee04562()
{
  extern Class_Descriptor cd_ee04562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04562, buf);
    ee04562 *dp, &lv = *(dp=new (buf) ee04562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee04562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(24,16), "ee04562");
    check_base_class_offset(lv, (cc562*)(dd4562*), 0, "ee04562");
    check_base_class_offset(lv, (dd4562*), 0, "ee04562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04562.e");
    test_class_info(&lv, &cd_ee04562);
    dp->~ee04562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04562(Test_ee04562, "ee04562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04562C1Ev();
extern void _ZN7ee04562D1Ev();
Name_Map name_map_ee04562[] = {
  NSPAIR(_ZN7ee04562C1Ev),
  NSPAIR(_ZN7ee04562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee04562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04562[];
extern void _ZN6dd45623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
extern VTBL_ENTRY _ZTV7ee04562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee04562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee04562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee04562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee04562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee04562[] = {
  {&(_ZTV7ee04562[3]),  3,10},
  {&(_tg__ZTV6dd4562__7ee04562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee04562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee04562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee04562[4]),  4,6},
  {&(_ZTV7ee04562[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee04562[];
extern  VTBL_ENTRY _ZTV7ee04562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04562[];
static VTBL_ENTRY alt_thunk_names1243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04562 = {  "ee04562", // class name
  bases_ee04562, 4,
  &(vtc_ee04562[0]), // expected_vtbl_contents
  &(vtt_ee04562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04562),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1243,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14562  : virtual dd4562 {
  int e;
  ~ee14562(); // tgen
  ee14562(); // tgen
};
//SIG(1 ee14562) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee14562 ::~ee14562(){ note_dtor("ee14562", this);} // tgen
ee14562 ::ee14562(){ note_ctor("ee14562", this);} // tgen

static void Test_ee14562()
{
  extern Class_Descriptor cd_ee14562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14562, buf);
    ee14562 *dp, &lv = *(dp=new (buf) ee14562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee14562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(32,20), "ee14562");
    check_base_class_offset(lv, (cc562*)(dd4562*), ABISELECT(16,8), "ee14562");
    check_base_class_offset(lv, (dd4562*), ABISELECT(16,8), "ee14562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14562.e");
    test_class_info(&lv, &cd_ee14562);
    dp->~ee14562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14562(Test_ee14562, "ee14562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14562C1Ev();
extern void _ZN7ee14562D1Ev();
Name_Map name_map_ee14562[] = {
  NSPAIR(_ZN7ee14562C1Ev),
  NSPAIR(_ZN7ee14562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee14562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14562[];
extern void _ZN6dd45623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14562[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
extern VTBL_ENTRY _ZTV7ee14562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee14562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee14562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee14562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee14562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee14562[] = {
  {&(_ZTV7ee14562[4]),  4,15},
  {&(_ZTV7ee14562[8]),  8,15},
  {&(_ZTV7ee14562[13]),  13,15},
  {&(_tg__ZTV6dd4562__7ee14562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee14562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee14562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee14562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14562[];
extern  VTBL_ENTRY _ZTV7ee14562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14562[];
static VTBL_ENTRY alt_thunk_names1244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14562 = {  "ee14562", // class name
  bases_ee14562, 4,
  &(vtc_ee14562[0]), // expected_vtbl_contents
  &(vtt_ee14562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14562),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1244,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24562  : dd4562 {
  int e;
  virtual void  foo(); // _ZN7ee245623fooEv
  ~ee24562(); // tgen
  ee24562(); // tgen
};
//SIG(1 ee24562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee24562 ::foo(){vfunc_called(this, "_ZN7ee245623fooEv");}
ee24562 ::~ee24562(){ note_dtor("ee24562", this);} // tgen
ee24562 ::ee24562(){ note_ctor("ee24562", this);} // tgen

static void Test_ee24562()
{
  extern Class_Descriptor cd_ee24562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24562, buf);
    ee24562 *dp, &lv = *(dp=new (buf) ee24562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee24562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(24,16), "ee24562");
    check_base_class_offset(lv, (cc562*)(dd4562*), 0, "ee24562");
    check_base_class_offset(lv, (dd4562*), 0, "ee24562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24562.e");
    test_class_info(&lv, &cd_ee24562);
    dp->~ee24562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24562(Test_ee24562, "ee24562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24562C1Ev();
extern void _ZN7ee24562D1Ev();
Name_Map name_map_ee24562[] = {
  NSPAIR(_ZN7ee24562C1Ev),
  NSPAIR(_ZN7ee24562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee24562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24562[];
extern void _ZN6dd45623barEv();
extern void _ZN7ee245623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee245623fooEv,_ZTv0_n12_N7ee245623fooEv)();
extern void ABISELECT(_ZThn24_N7ee245623fooEv,_ZThn16_N7ee245623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
  (VTBL_ENTRY)&_ZN7ee245623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee245623fooEv,_ZTv0_n12_N7ee245623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
extern VTBL_ENTRY _ZTV7ee24562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee24562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee24562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee24562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee24562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee24562[] = {
  {&(_ZTV7ee24562[3]),  3,11},
  {&(_tg__ZTV6dd4562__7ee24562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee24562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee24562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee24562[4]),  4,6},
  {&(_ZTV7ee24562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24562[];
extern  VTBL_ENTRY _ZTV7ee24562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24562[];
static VTBL_ENTRY alt_thunk_names1245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee245623fooEv,_ZTv0_n12_N7ee245623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee245623fooEv,_ZThn16_N7ee245623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24562 = {  "ee24562", // class name
  bases_ee24562, 4,
  &(vtc_ee24562[0]), // expected_vtbl_contents
  &(vtt_ee24562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1245,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34562  : virtual dd4562 {
  int e;
  virtual void  foo(); // _ZN7ee345623fooEv
  ~ee34562(); // tgen
  ee34562(); // tgen
};
//SIG(1 ee34562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee34562 ::foo(){vfunc_called(this, "_ZN7ee345623fooEv");}
ee34562 ::~ee34562(){ note_dtor("ee34562", this);} // tgen
ee34562 ::ee34562(){ note_ctor("ee34562", this);} // tgen

static void Test_ee34562()
{
  extern Class_Descriptor cd_ee34562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34562, buf);
    ee34562 *dp, &lv = *(dp=new (buf) ee34562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee34562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(32,20), "ee34562");
    check_base_class_offset(lv, (cc562*)(dd4562*), ABISELECT(16,8), "ee34562");
    check_base_class_offset(lv, (dd4562*), ABISELECT(16,8), "ee34562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34562.e");
    test_class_info(&lv, &cd_ee34562);
    dp->~ee34562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34562(Test_ee34562, "ee34562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34562C1Ev();
extern void _ZN7ee34562D1Ev();
Name_Map name_map_ee34562[] = {
  NSPAIR(_ZN7ee34562C1Ev),
  NSPAIR(_ZN7ee34562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee34562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34562[];
extern void _ZN7ee345623fooEv();
extern void _ZN6dd45623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee345623fooEv,_ZTv0_n12_N7ee345623fooEv)();
extern void ABISELECT(_ZThn32_N7ee345623fooEv,_ZThn20_N7ee345623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34562[0]),
  (VTBL_ENTRY)&_ZN7ee345623fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee345623fooEv,_ZTv0_n12_N7ee345623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
extern VTBL_ENTRY _ZTV7ee34562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee34562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee34562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee34562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee34562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee34562[] = {
  {&(_ZTV7ee34562[4]),  4,16},
  {&(_ZTV7ee34562[9]),  9,16},
  {&(_ZTV7ee34562[14]),  14,16},
  {&(_tg__ZTV6dd4562__7ee34562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee34562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee34562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee34562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34562[];
extern  VTBL_ENTRY _ZTV7ee34562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34562[];
static VTBL_ENTRY alt_thunk_names1246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee345623fooEv,_ZTv0_n12_N7ee345623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee345623fooEv,_ZThn20_N7ee345623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34562 = {  "ee34562", // class name
  bases_ee34562, 4,
  &(vtc_ee34562[0]), // expected_vtbl_contents
  &(vtt_ee34562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1246,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44562  : dd4562 {
  int e;
  virtual void  bar(); // _ZN7ee445623barEv
  ~ee44562(); // tgen
  ee44562(); // tgen
};
//SIG(1 ee44562) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee44562 ::bar(){vfunc_called(this, "_ZN7ee445623barEv");}
ee44562 ::~ee44562(){ note_dtor("ee44562", this);} // tgen
ee44562 ::ee44562(){ note_ctor("ee44562", this);} // tgen

static void Test_ee44562()
{
  extern Class_Descriptor cd_ee44562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44562, buf);
    ee44562 *dp, &lv = *(dp=new (buf) ee44562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee44562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(24,16), "ee44562");
    check_base_class_offset(lv, (cc562*)(dd4562*), 0, "ee44562");
    check_base_class_offset(lv, (dd4562*), 0, "ee44562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44562.e");
    test_class_info(&lv, &cd_ee44562);
    dp->~ee44562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44562(Test_ee44562, "ee44562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44562C1Ev();
extern void _ZN7ee44562D1Ev();
Name_Map name_map_ee44562[] = {
  NSPAIR(_ZN7ee44562C1Ev),
  NSPAIR(_ZN7ee44562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee44562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44562[];
extern void _ZN7ee445623barEv();
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee445623barEv,_ZTv0_n16_N7ee445623barEv)();
extern void ABISELECT(_ZThn24_N7ee445623barEv,_ZThn16_N7ee445623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44562[0]),
  (VTBL_ENTRY)&_ZN7ee445623barEv,
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee445623barEv,_ZTv0_n16_N7ee445623barEv),
};
extern VTBL_ENTRY _ZTV7ee44562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee44562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee44562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee44562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee44562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee44562[] = {
  {&(_ZTV7ee44562[3]),  3,10},
  {&(_tg__ZTV6dd4562__7ee44562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee44562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee44562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee44562[4]),  4,6},
  {&(_ZTV7ee44562[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee44562[];
extern  VTBL_ENTRY _ZTV7ee44562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44562[];
static VTBL_ENTRY alt_thunk_names1247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee445623barEv,_ZTv0_n16_N7ee445623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee445623barEv,_ZThn16_N7ee445623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44562 = {  "ee44562", // class name
  bases_ee44562, 4,
  &(vtc_ee44562[0]), // expected_vtbl_contents
  &(vtt_ee44562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44562),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1247,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54562  : virtual dd4562 {
  int e;
  virtual void  bar(); // _ZN7ee545623barEv
  ~ee54562(); // tgen
  ee54562(); // tgen
};
//SIG(1 ee54562) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee54562 ::bar(){vfunc_called(this, "_ZN7ee545623barEv");}
ee54562 ::~ee54562(){ note_dtor("ee54562", this);} // tgen
ee54562 ::ee54562(){ note_ctor("ee54562", this);} // tgen

static void Test_ee54562()
{
  extern Class_Descriptor cd_ee54562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54562, buf);
    ee54562 *dp, &lv = *(dp=new (buf) ee54562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee54562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(32,20), "ee54562");
    check_base_class_offset(lv, (cc562*)(dd4562*), ABISELECT(16,8), "ee54562");
    check_base_class_offset(lv, (dd4562*), ABISELECT(16,8), "ee54562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54562.e");
    test_class_info(&lv, &cd_ee54562);
    dp->~ee54562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54562(Test_ee54562, "ee54562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54562C1Ev();
extern void _ZN7ee54562D1Ev();
Name_Map name_map_ee54562[] = {
  NSPAIR(_ZN7ee54562C1Ev),
  NSPAIR(_ZN7ee54562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee54562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54562[];
extern void _ZN7ee545623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee545623barEv,_ZTv0_n16_N7ee545623barEv)();
extern void ABISELECT(_ZThn16_N7ee545623barEv,_ZThn8_N7ee545623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee545623barEv,_ZTv0_n16_N7ee545623barEv)();
extern void ABISELECT(_ZThn32_N7ee545623barEv,_ZThn20_N7ee545623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54562[0]),
  (VTBL_ENTRY)&_ZN7ee545623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee545623barEv,_ZTv0_n16_N7ee545623barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee545623barEv,_ZTv0_n16_N7ee545623barEv),
};
extern VTBL_ENTRY _ZTV7ee54562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee54562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee54562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee54562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee54562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee54562[] = {
  {&(_ZTV7ee54562[4]),  4,16},
  {&(_ZTV7ee54562[9]),  9,16},
  {&(_ZTV7ee54562[14]),  14,16},
  {&(_tg__ZTV6dd4562__7ee54562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee54562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee54562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee54562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54562[];
extern  VTBL_ENTRY _ZTV7ee54562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54562[];
static VTBL_ENTRY alt_thunk_names1248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee545623barEv,_ZTv0_n16_N7ee545623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee545623barEv,_ZThn20_N7ee545623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee545623barEv,_ZThn8_N7ee545623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54562 = {  "ee54562", // class name
  bases_ee54562, 4,
  &(vtc_ee54562[0]), // expected_vtbl_contents
  &(vtt_ee54562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1248,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64562  : dd4562 {
  int e;
  virtual void  foo(); // _ZN7ee645623fooEv
  virtual void  bar(); // _ZN7ee645623barEv
  ~ee64562(); // tgen
  ee64562(); // tgen
};
//SIG(1 ee64562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64562 ::foo(){vfunc_called(this, "_ZN7ee645623fooEv");}
void  ee64562 ::bar(){vfunc_called(this, "_ZN7ee645623barEv");}
ee64562 ::~ee64562(){ note_dtor("ee64562", this);} // tgen
ee64562 ::ee64562(){ note_ctor("ee64562", this);} // tgen

static void Test_ee64562()
{
  extern Class_Descriptor cd_ee64562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64562, buf);
    ee64562 *dp, &lv = *(dp=new (buf) ee64562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee64562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(24,16), "ee64562");
    check_base_class_offset(lv, (cc562*)(dd4562*), 0, "ee64562");
    check_base_class_offset(lv, (dd4562*), 0, "ee64562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64562.e");
    test_class_info(&lv, &cd_ee64562);
    dp->~ee64562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64562(Test_ee64562, "ee64562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64562C1Ev();
extern void _ZN7ee64562D1Ev();
Name_Map name_map_ee64562[] = {
  NSPAIR(_ZN7ee64562C1Ev),
  NSPAIR(_ZN7ee64562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee64562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64562[];
extern void _ZN7ee645623barEv();
extern void _ZN7ee645623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee645623fooEv,_ZTv0_n12_N7ee645623fooEv)();
extern void ABISELECT(_ZThn24_N7ee645623fooEv,_ZThn16_N7ee645623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee645623barEv,_ZTv0_n16_N7ee645623barEv)();
extern void ABISELECT(_ZThn24_N7ee645623barEv,_ZThn16_N7ee645623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64562[0]),
  (VTBL_ENTRY)&_ZN7ee645623barEv,
  (VTBL_ENTRY)&_ZN7ee645623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee645623fooEv,_ZTv0_n12_N7ee645623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee645623barEv,_ZTv0_n16_N7ee645623barEv),
};
extern VTBL_ENTRY _ZTV7ee64562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee64562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee64562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee64562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee64562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee64562[] = {
  {&(_ZTV7ee64562[3]),  3,11},
  {&(_tg__ZTV6dd4562__7ee64562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee64562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee64562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee64562[4]),  4,6},
  {&(_ZTV7ee64562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64562[];
extern  VTBL_ENTRY _ZTV7ee64562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64562[];
static VTBL_ENTRY alt_thunk_names1249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd45623barEv,_ZThn16_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee645623barEv,_ZTv0_n16_N7ee645623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee645623barEv,_ZThn16_N7ee645623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee645623fooEv,_ZTv0_n12_N7ee645623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee645623fooEv,_ZThn16_N7ee645623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64562 = {  "ee64562", // class name
  bases_ee64562, 4,
  &(vtc_ee64562[0]), // expected_vtbl_contents
  &(vtt_ee64562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1249,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74562  : virtual dd4562 {
  int e;
  virtual void  foo(); // _ZN7ee745623fooEv
  virtual void  bar(); // _ZN7ee745623barEv
  ~ee74562(); // tgen
  ee74562(); // tgen
};
//SIG(1 ee74562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74562 ::foo(){vfunc_called(this, "_ZN7ee745623fooEv");}
void  ee74562 ::bar(){vfunc_called(this, "_ZN7ee745623barEv");}
ee74562 ::~ee74562(){ note_dtor("ee74562", this);} // tgen
ee74562 ::ee74562(){ note_ctor("ee74562", this);} // tgen

static void Test_ee74562()
{
  extern Class_Descriptor cd_ee74562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74562, buf);
    ee74562 *dp, &lv = *(dp=new (buf) ee74562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee74562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd4562*), ABISELECT(32,20), "ee74562");
    check_base_class_offset(lv, (cc562*)(dd4562*), ABISELECT(16,8), "ee74562");
    check_base_class_offset(lv, (dd4562*), ABISELECT(16,8), "ee74562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74562.e");
    test_class_info(&lv, &cd_ee74562);
    dp->~ee74562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74562(Test_ee74562, "ee74562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74562C1Ev();
extern void _ZN7ee74562D1Ev();
Name_Map name_map_ee74562[] = {
  NSPAIR(_ZN7ee74562C1Ev),
  NSPAIR(_ZN7ee74562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd4562;
extern VTBL_ENTRY _ZTI6dd4562[];
extern  VTBL_ENTRY _ZTV6dd4562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4562[];
static Base_Class bases_ee74562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4562,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74562[];
extern void _ZN7ee745623fooEv();
extern void _ZN7ee745623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee745623barEv,_ZTv0_n16_N7ee745623barEv)();
extern void ABISELECT(_ZThn16_N7ee745623barEv,_ZThn8_N7ee745623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee745623fooEv,_ZTv0_n12_N7ee745623fooEv)();
extern void ABISELECT(_ZThn32_N7ee745623fooEv,_ZThn20_N7ee745623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee745623barEv,_ZTv0_n16_N7ee745623barEv)();
extern void ABISELECT(_ZThn32_N7ee745623barEv,_ZThn20_N7ee745623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74562[0]),
  (VTBL_ENTRY)&_ZN7ee745623fooEv,
  (VTBL_ENTRY)&_ZN7ee745623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee745623barEv,_ZTv0_n16_N7ee745623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee745623fooEv,_ZTv0_n12_N7ee745623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee745623barEv,_ZTv0_n16_N7ee745623barEv),
};
extern VTBL_ENTRY _ZTV7ee74562[];
extern void _ZN6dd45623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4562__7ee74562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN6dd45623barEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd4562__7ee74562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd4562__7ee74562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv)();
extern void ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4562__7ee74562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv),
};
static  VTT_ENTRY vtt_ee74562[] = {
  {&(_ZTV7ee74562[4]),  4,17},
  {&(_ZTV7ee74562[10]),  10,17},
  {&(_ZTV7ee74562[15]),  15,17},
  {&(_tg__ZTV6dd4562__7ee74562[3]),  3,4},
  {&(_tg__ZTV5cc5626dd4562__7ee74562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd4562__7ee74562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4562__7ee74562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74562[];
extern  VTBL_ENTRY _ZTV7ee74562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74562[];
static VTBL_ENTRY alt_thunk_names1250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd45623barEv,_ZTv0_n16_N6dd45623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd45623barEv,_ZThn12_N6dd45623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee745623fooEv,_ZTv0_n12_N7ee745623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee745623fooEv,_ZThn20_N7ee745623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee745623barEv,_ZTv0_n16_N7ee745623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee745623barEv,_ZThn20_N7ee745623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee745623barEv,_ZThn8_N7ee745623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74562 = {  "ee74562", // class name
  bases_ee74562, 4,
  &(vtc_ee74562[0]), // expected_vtbl_contents
  &(vtt_ee74562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1250,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5562  : virtual cc562 {
  int d;
  virtual void  bar(); // _ZN6dd55623barEv
  ~dd5562(); // tgen
  dd5562(); // tgen
};
//SIG(-1 dd5562) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  dd5562 ::bar(){vfunc_called(this, "_ZN6dd55623barEv");}
dd5562 ::~dd5562(){ note_dtor("dd5562", this);} // tgen
dd5562 ::dd5562(){ note_ctor("dd5562", this);} // tgen

static void Test_dd5562()
{
  extern Class_Descriptor cd_dd5562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5562, buf);
    dd5562 *dp, &lv = *(dp=new (buf) dd5562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd5562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,16), "dd5562");
    check_base_class_offset(lv, (cc562*), ABISELECT(16,8), "dd5562");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5562.d");
    test_class_info(&lv, &cd_dd5562);
    dp->~dd5562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5562(Test_dd5562, "dd5562", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5562C1Ev();
extern void _ZN6dd5562D1Ev();
Name_Map name_map_dd5562[] = {
  NSPAIR(_ZN6dd5562C1Ev),
  NSPAIR(_ZN6dd5562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd5562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc562,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5562[];
extern void _ZN6dd55623barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern VTBL_ENTRY _ZTV6dd5562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd5562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd5562[] = {
  {&(_ZTV6dd5562[4]),  4,16},
  {&(_ZTV6dd5562[9]),  9,16},
  {&(_ZTV6dd5562[14]),  14,16},
  {&(_tg__ZTV5cc562__6dd5562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd5562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static VTBL_ENTRY alt_thunk_names1251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5562 = {  "dd5562", // class name
  bases_dd5562, 3,
  &(vtc_dd5562[0]), // expected_vtbl_contents
  &(vtt_dd5562[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5562),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05562  : dd5562 {
  int e;
  ~ee05562(); // tgen
  ee05562(); // tgen
};
//SIG(1 ee05562) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee05562 ::~ee05562(){ note_dtor("ee05562", this);} // tgen
ee05562 ::ee05562(){ note_ctor("ee05562", this);} // tgen

static void Test_ee05562()
{
  extern Class_Descriptor cd_ee05562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05562, buf);
    ee05562 *dp, &lv = *(dp=new (buf) ee05562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee05562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee05562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(16,12), "ee05562");
    check_base_class_offset(lv, (dd5562*), 0, "ee05562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05562.e");
    test_class_info(&lv, &cd_ee05562);
    dp->~ee05562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05562(Test_ee05562, "ee05562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05562C1Ev();
extern void _ZN7ee05562D1Ev();
Name_Map name_map_ee05562[] = {
  NSPAIR(_ZN7ee05562C1Ev),
  NSPAIR(_ZN7ee05562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee05562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05562[];
extern void _ZN6dd55623barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern VTBL_ENTRY _ZTV7ee05562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee05562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee05562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee05562[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee05562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee05562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee05562[] = {
  {&(_ZTV7ee05562[4]),  4,16},
  {&(_tg__ZTV6dd5562__7ee05562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee05562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee05562[4]),  4,6},
  {&(_ZTV7ee05562[9]),  9,16},
  {&(_ZTV7ee05562[14]),  14,16},
  {&(_tg__ZTV5cc562__7ee05562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee05562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05562[];
extern  VTBL_ENTRY _ZTV7ee05562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05562[];
static VTBL_ENTRY alt_thunk_names1252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05562 = {  "ee05562", // class name
  bases_ee05562, 4,
  &(vtc_ee05562[0]), // expected_vtbl_contents
  &(vtt_ee05562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1252,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15562  : virtual dd5562 {
  int e;
  ~ee15562(); // tgen
  ee15562(); // tgen
};
//SIG(1 ee15562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} Fi}


ee15562 ::~ee15562(){ note_dtor("ee15562", this);} // tgen
ee15562 ::ee15562(){ note_ctor("ee15562", this);} // tgen

static void Test_ee15562()
{
  extern Class_Descriptor cd_ee15562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15562, buf);
    ee15562 *dp, &lv = *(dp=new (buf) ee15562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee15562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee15562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(32,16), "ee15562");
    check_base_class_offset(lv, (dd5562*), ABISELECT(16,8), "ee15562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15562.e");
    test_class_info(&lv, &cd_ee15562);
    dp->~ee15562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15562(Test_ee15562, "ee15562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15562C1Ev();
extern void _ZN7ee15562D1Ev();
Name_Map name_map_ee15562[] = {
  NSPAIR(_ZN7ee15562C1Ev),
  NSPAIR(_ZN7ee15562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee15562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15562[];
extern void _ZN6dd55623barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15562[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern VTBL_ENTRY _ZTV7ee15562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee15562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee15562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee15562[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee15562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee15562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee15562[] = {
  {&(_ZTV7ee15562[5]),  5,22},
  {&(_ZTV7ee15562[10]),  10,22},
  {&(_ZTV7ee15562[15]),  15,22},
  {&(_ZTV7ee15562[20]),  20,22},
  {&(_tg__ZTV6dd5562__7ee15562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee15562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee15562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee15562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee15562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15562[];
extern  VTBL_ENTRY _ZTV7ee15562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15562[];
static VTBL_ENTRY alt_thunk_names1253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15562 = {  "ee15562", // class name
  bases_ee15562, 4,
  &(vtc_ee15562[0]), // expected_vtbl_contents
  &(vtt_ee15562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15562),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1253,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25562  : dd5562 {
  int e;
  virtual void  foo(); // _ZN7ee255623fooEv
  ~ee25562(); // tgen
  ee25562(); // tgen
};
//SIG(1 ee25562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee25562 ::foo(){vfunc_called(this, "_ZN7ee255623fooEv");}
ee25562 ::~ee25562(){ note_dtor("ee25562", this);} // tgen
ee25562 ::ee25562(){ note_ctor("ee25562", this);} // tgen

static void Test_ee25562()
{
  extern Class_Descriptor cd_ee25562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25562, buf);
    ee25562 *dp, &lv = *(dp=new (buf) ee25562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee25562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee25562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(16,12), "ee25562");
    check_base_class_offset(lv, (dd5562*), 0, "ee25562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25562.e");
    test_class_info(&lv, &cd_ee25562);
    dp->~ee25562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25562(Test_ee25562, "ee25562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25562C1Ev();
extern void _ZN7ee25562D1Ev();
Name_Map name_map_ee25562[] = {
  NSPAIR(_ZN7ee25562C1Ev),
  NSPAIR(_ZN7ee25562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee25562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25562[];
extern void _ZN6dd55623barEv();
extern void _ZN7ee255623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee255623fooEv,_ZTv0_n12_N7ee255623fooEv)();
extern void ABISELECT(_ZThn32_N7ee255623fooEv,_ZThn20_N7ee255623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
  (VTBL_ENTRY)&_ZN7ee255623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee255623fooEv,_ZTv0_n12_N7ee255623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern VTBL_ENTRY _ZTV7ee25562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee25562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee25562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee25562[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee25562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee25562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee25562[] = {
  {&(_ZTV7ee25562[4]),  4,17},
  {&(_tg__ZTV6dd5562__7ee25562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee25562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee25562[4]),  4,6},
  {&(_ZTV7ee25562[10]),  10,17},
  {&(_ZTV7ee25562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee25562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee25562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25562[];
extern  VTBL_ENTRY _ZTV7ee25562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25562[];
static VTBL_ENTRY alt_thunk_names1254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee255623fooEv,_ZTv0_n12_N7ee255623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee255623fooEv,_ZThn20_N7ee255623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25562 = {  "ee25562", // class name
  bases_ee25562, 4,
  &(vtc_ee25562[0]), // expected_vtbl_contents
  &(vtt_ee25562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1254,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35562  : virtual dd5562 {
  int e;
  virtual void  foo(); // _ZN7ee355623fooEv
  ~ee35562(); // tgen
  ee35562(); // tgen
};
//SIG(1 ee35562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 Fi}


void  ee35562 ::foo(){vfunc_called(this, "_ZN7ee355623fooEv");}
ee35562 ::~ee35562(){ note_dtor("ee35562", this);} // tgen
ee35562 ::ee35562(){ note_ctor("ee35562", this);} // tgen

static void Test_ee35562()
{
  extern Class_Descriptor cd_ee35562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35562, buf);
    ee35562 *dp, &lv = *(dp=new (buf) ee35562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee35562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee35562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(32,16), "ee35562");
    check_base_class_offset(lv, (dd5562*), ABISELECT(16,8), "ee35562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35562.e");
    test_class_info(&lv, &cd_ee35562);
    dp->~ee35562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35562(Test_ee35562, "ee35562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35562C1Ev();
extern void _ZN7ee35562D1Ev();
Name_Map name_map_ee35562[] = {
  NSPAIR(_ZN7ee35562C1Ev),
  NSPAIR(_ZN7ee35562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee35562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35562[];
extern void _ZN7ee355623fooEv();
extern void _ZN6dd55623barEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee355623fooEv,_ZTv0_n12_N7ee355623fooEv)();
extern void ABISELECT(_ZThn48_N7ee355623fooEv,_ZThn24_N7ee355623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35562[0]),
  (VTBL_ENTRY)&_ZN7ee355623fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee355623fooEv,_ZTv0_n12_N7ee355623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern VTBL_ENTRY _ZTV7ee35562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee35562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee35562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee35562[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee35562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee35562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee35562[] = {
  {&(_ZTV7ee35562[5]),  5,23},
  {&(_ZTV7ee35562[11]),  11,23},
  {&(_ZTV7ee35562[16]),  16,23},
  {&(_ZTV7ee35562[21]),  21,23},
  {&(_tg__ZTV6dd5562__7ee35562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee35562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee35562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee35562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee35562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35562[];
extern  VTBL_ENTRY _ZTV7ee35562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35562[];
static VTBL_ENTRY alt_thunk_names1255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee355623fooEv,_ZTv0_n12_N7ee355623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee355623fooEv,_ZThn24_N7ee355623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35562 = {  "ee35562", // class name
  bases_ee35562, 4,
  &(vtc_ee35562[0]), // expected_vtbl_contents
  &(vtt_ee35562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35562),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1255,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45562  : dd5562 {
  int e;
  virtual void  bar(); // _ZN7ee455623barEv
  ~ee45562(); // tgen
  ee45562(); // tgen
};
//SIG(1 ee45562) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee45562 ::bar(){vfunc_called(this, "_ZN7ee455623barEv");}
ee45562 ::~ee45562(){ note_dtor("ee45562", this);} // tgen
ee45562 ::ee45562(){ note_ctor("ee45562", this);} // tgen

static void Test_ee45562()
{
  extern Class_Descriptor cd_ee45562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45562, buf);
    ee45562 *dp, &lv = *(dp=new (buf) ee45562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee45562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee45562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(16,12), "ee45562");
    check_base_class_offset(lv, (dd5562*), 0, "ee45562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45562.e");
    test_class_info(&lv, &cd_ee45562);
    dp->~ee45562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45562(Test_ee45562, "ee45562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45562C1Ev();
extern void _ZN7ee45562D1Ev();
Name_Map name_map_ee45562[] = {
  NSPAIR(_ZN7ee45562C1Ev),
  NSPAIR(_ZN7ee45562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee45562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    ABISELECT(16,12), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45562[];
extern void _ZN7ee455623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee455623barEv,_ZTv0_n16_N7ee455623barEv)();
extern void ABISELECT(_ZThn16_N7ee455623barEv,_ZThn12_N7ee455623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee455623barEv,_ZTv0_n16_N7ee455623barEv)();
extern void ABISELECT(_ZThn32_N7ee455623barEv,_ZThn20_N7ee455623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45562[0]),
  (VTBL_ENTRY)&_ZN7ee455623barEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee455623barEv,_ZTv0_n16_N7ee455623barEv),
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee455623barEv,_ZTv0_n16_N7ee455623barEv),
};
extern VTBL_ENTRY _ZTV7ee45562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee45562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee45562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee45562[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee45562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee45562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee45562[] = {
  {&(_ZTV7ee45562[4]),  4,16},
  {&(_tg__ZTV6dd5562__7ee45562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee45562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee45562[4]),  4,6},
  {&(_ZTV7ee45562[9]),  9,16},
  {&(_ZTV7ee45562[14]),  14,16},
  {&(_tg__ZTV5cc562__7ee45562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee45562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45562[];
extern  VTBL_ENTRY _ZTV7ee45562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45562[];
static VTBL_ENTRY alt_thunk_names1256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee455623barEv,_ZTv0_n16_N7ee455623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee455623barEv,_ZThn20_N7ee455623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee455623barEv,_ZThn12_N7ee455623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45562 = {  "ee45562", // class name
  bases_ee45562, 4,
  &(vtc_ee45562[0]), // expected_vtbl_contents
  &(vtt_ee45562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45562),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1256,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55562  : virtual dd5562 {
  int e;
  virtual void  bar(); // _ZN7ee555623barEv
  ~ee55562(); // tgen
  ee55562(); // tgen
};
//SIG(1 ee55562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi} v1 Fi}


void  ee55562 ::bar(){vfunc_called(this, "_ZN7ee555623barEv");}
ee55562 ::~ee55562(){ note_dtor("ee55562", this);} // tgen
ee55562 ::ee55562(){ note_ctor("ee55562", this);} // tgen

static void Test_ee55562()
{
  extern Class_Descriptor cd_ee55562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55562, buf);
    ee55562 *dp, &lv = *(dp=new (buf) ee55562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee55562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee55562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(32,16), "ee55562");
    check_base_class_offset(lv, (dd5562*), ABISELECT(16,8), "ee55562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55562.e");
    test_class_info(&lv, &cd_ee55562);
    dp->~ee55562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55562(Test_ee55562, "ee55562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55562C1Ev();
extern void _ZN7ee55562D1Ev();
Name_Map name_map_ee55562[] = {
  NSPAIR(_ZN7ee55562C1Ev),
  NSPAIR(_ZN7ee55562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee55562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55562[];
extern void _ZN7ee555623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee555623barEv,_ZTv0_n20_N7ee555623barEv)();
extern void ABISELECT(_ZThn16_N7ee555623barEv,_ZThn8_N7ee555623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee555623barEv,_ZTv0_n16_N7ee555623barEv)();
extern void ABISELECT(_ZThn32_N7ee555623barEv,_ZThn16_N7ee555623barEv)() __attribute__((weak));
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee555623barEv,_ZTv0_n16_N7ee555623barEv)();
extern void ABISELECT(_ZThn48_N7ee555623barEv,_ZThn24_N7ee555623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55562[0]),
  (VTBL_ENTRY)&_ZN7ee555623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee555623barEv,_ZTv0_n20_N7ee555623barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee555623barEv,_ZTv0_n16_N7ee555623barEv),
  ABISELECT(-48,-24),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee555623barEv,_ZTv0_n16_N7ee555623barEv),
};
extern VTBL_ENTRY _ZTV7ee55562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee55562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee55562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee55562[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee55562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee55562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee55562[] = {
  {&(_ZTV7ee55562[5]),  5,23},
  {&(_ZTV7ee55562[11]),  11,23},
  {&(_ZTV7ee55562[16]),  16,23},
  {&(_ZTV7ee55562[21]),  21,23},
  {&(_tg__ZTV6dd5562__7ee55562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee55562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee55562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee55562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee55562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55562[];
extern  VTBL_ENTRY _ZTV7ee55562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55562[];
static VTBL_ENTRY alt_thunk_names1257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee555623barEv,_ZTv0_n16_N7ee555623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee555623barEv,_ZThn24_N7ee555623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee555623barEv,_ZThn16_N7ee555623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee555623barEv,_ZTv0_n20_N7ee555623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee555623barEv,_ZThn8_N7ee555623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55562 = {  "ee55562", // class name
  bases_ee55562, 4,
  &(vtc_ee55562[0]), // expected_vtbl_contents
  &(vtt_ee55562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55562),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1257,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65562  : dd5562 {
  int e;
  virtual void  foo(); // _ZN7ee655623fooEv
  virtual void  bar(); // _ZN7ee655623barEv
  ~ee65562(); // tgen
  ee65562(); // tgen
};
//SIG(1 ee65562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65562 ::foo(){vfunc_called(this, "_ZN7ee655623fooEv");}
void  ee65562 ::bar(){vfunc_called(this, "_ZN7ee655623barEv");}
ee65562 ::~ee65562(){ note_dtor("ee65562", this);} // tgen
ee65562 ::ee65562(){ note_ctor("ee65562", this);} // tgen

static void Test_ee65562()
{
  extern Class_Descriptor cd_ee65562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65562, buf);
    ee65562 *dp, &lv = *(dp=new (buf) ee65562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee65562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee65562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(16,12), "ee65562");
    check_base_class_offset(lv, (dd5562*), 0, "ee65562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65562.e");
    test_class_info(&lv, &cd_ee65562);
    dp->~ee65562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65562(Test_ee65562, "ee65562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65562C1Ev();
extern void _ZN7ee65562D1Ev();
Name_Map name_map_ee65562[] = {
  NSPAIR(_ZN7ee65562C1Ev),
  NSPAIR(_ZN7ee65562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee65562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65562[];
extern void _ZN7ee655623barEv();
extern void _ZN7ee655623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee655623barEv,_ZTv0_n16_N7ee655623barEv)();
extern void ABISELECT(_ZThn16_N7ee655623barEv,_ZThn12_N7ee655623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee655623fooEv,_ZTv0_n12_N7ee655623fooEv)();
extern void ABISELECT(_ZThn32_N7ee655623fooEv,_ZThn20_N7ee655623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee655623barEv,_ZTv0_n16_N7ee655623barEv)();
extern void ABISELECT(_ZThn32_N7ee655623barEv,_ZThn20_N7ee655623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65562[0]),
  (VTBL_ENTRY)&_ZN7ee655623barEv,
  (VTBL_ENTRY)&_ZN7ee655623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee655623barEv,_ZTv0_n16_N7ee655623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee655623fooEv,_ZTv0_n12_N7ee655623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee655623barEv,_ZTv0_n16_N7ee655623barEv),
};
extern VTBL_ENTRY _ZTV7ee65562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee65562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee65562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee65562[] = {
  ABISELECT(-32,-20),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee65562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee65562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee65562[] = {
  {&(_ZTV7ee65562[4]),  4,17},
  {&(_tg__ZTV6dd5562__7ee65562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee65562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee65562[4]),  4,6},
  {&(_ZTV7ee65562[10]),  10,17},
  {&(_ZTV7ee65562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee65562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee65562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65562[];
extern  VTBL_ENTRY _ZTV7ee65562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65562[];
static VTBL_ENTRY alt_thunk_names1258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn20_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn12_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee655623fooEv,_ZTv0_n12_N7ee655623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee655623fooEv,_ZThn20_N7ee655623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee655623barEv,_ZTv0_n16_N7ee655623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee655623barEv,_ZThn20_N7ee655623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee655623barEv,_ZThn12_N7ee655623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65562 = {  "ee65562", // class name
  bases_ee65562, 4,
  &(vtc_ee65562[0]), // expected_vtbl_contents
  &(vtt_ee65562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1258,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75562  : virtual dd5562 {
  int e;
  virtual void  foo(); // _ZN7ee755623fooEv
  virtual void  bar(); // _ZN7ee755623barEv
  ~ee75562(); // tgen
  ee75562(); // tgen
};
//SIG(1 ee75562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75562 ::foo(){vfunc_called(this, "_ZN7ee755623fooEv");}
void  ee75562 ::bar(){vfunc_called(this, "_ZN7ee755623barEv");}
ee75562 ::~ee75562(){ note_dtor("ee75562", this);} // tgen
ee75562 ::ee75562(){ note_ctor("ee75562", this);} // tgen

static void Test_ee75562()
{
  extern Class_Descriptor cd_ee75562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75562, buf);
    ee75562 *dp, &lv = *(dp=new (buf) ee75562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee75562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee75562");
    check_base_class_offset(lv, (cc562*)(dd5562*), ABISELECT(32,16), "ee75562");
    check_base_class_offset(lv, (dd5562*), ABISELECT(16,8), "ee75562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75562.e");
    test_class_info(&lv, &cd_ee75562);
    dp->~ee75562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75562(Test_ee75562, "ee75562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75562C1Ev();
extern void _ZN7ee75562D1Ev();
Name_Map name_map_ee75562[] = {
  NSPAIR(_ZN7ee75562C1Ev),
  NSPAIR(_ZN7ee75562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd5562;
extern VTBL_ENTRY _ZTI6dd5562[];
extern  VTBL_ENTRY _ZTV6dd5562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5562[];
static Base_Class bases_ee75562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5562,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75562[];
extern void _ZN7ee755623fooEv();
extern void _ZN7ee755623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee755623barEv,_ZTv0_n20_N7ee755623barEv)();
extern void ABISELECT(_ZThn16_N7ee755623barEv,_ZThn8_N7ee755623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee755623barEv,_ZTv0_n16_N7ee755623barEv)();
extern void ABISELECT(_ZThn32_N7ee755623barEv,_ZThn16_N7ee755623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee755623fooEv,_ZTv0_n12_N7ee755623fooEv)();
extern void ABISELECT(_ZThn48_N7ee755623fooEv,_ZThn24_N7ee755623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee755623barEv,_ZTv0_n16_N7ee755623barEv)();
extern void ABISELECT(_ZThn48_N7ee755623barEv,_ZThn24_N7ee755623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75562[0]),
  (VTBL_ENTRY)&_ZN7ee755623fooEv,
  (VTBL_ENTRY)&_ZN7ee755623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee755623barEv,_ZTv0_n20_N7ee755623barEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee755623barEv,_ZTv0_n16_N7ee755623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee755623fooEv,_ZTv0_n12_N7ee755623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee755623barEv,_ZTv0_n16_N7ee755623barEv),
};
extern VTBL_ENTRY _ZTV7ee75562[];
extern void _ZN6dd55623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5562__7ee75562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN6dd55623barEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd5562__7ee75562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv)();
extern void ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5562__7ee75562[] = {
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee75562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee75562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee75562[] = {
  {&(_ZTV7ee75562[5]),  5,24},
  {&(_ZTV7ee75562[12]),  12,24},
  {&(_ZTV7ee75562[17]),  17,24},
  {&(_ZTV7ee75562[22]),  22,24},
  {&(_tg__ZTV6dd5562__7ee75562[4]),  4,5},
  {&(_tg__ZTV5cc562__6dd5562__7ee75562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd5562__7ee75562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee75562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee75562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75562[];
extern  VTBL_ENTRY _ZTV7ee75562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75562[];
static VTBL_ENTRY alt_thunk_names1259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd55623barEv,_ZTv0_n16_N6dd55623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd55623barEv,_ZThn16_N6dd55623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd55623barEv,_ZThn8_N6dd55623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee755623fooEv,_ZTv0_n12_N7ee755623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee755623fooEv,_ZThn24_N7ee755623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee755623barEv,_ZTv0_n16_N7ee755623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee755623barEv,_ZThn24_N7ee755623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee755623barEv,_ZThn16_N7ee755623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee755623barEv,_ZTv0_n20_N7ee755623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee755623barEv,_ZThn8_N7ee755623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75562 = {  "ee75562", // class name
  bases_ee75562, 4,
  &(vtc_ee75562[0]), // expected_vtbl_contents
  &(vtt_ee75562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75562),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1259,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6562  : cc562 {
  int d;
  virtual void  bar(); // _ZN6dd65623barEv
  virtual void  foo(); // _ZN6dd65623fooEv
  ~dd6562(); // tgen
  dd6562(); // tgen
};
//SIG(-1 dd6562) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd6562 ::bar(){vfunc_called(this, "_ZN6dd65623barEv");}
void  dd6562 ::foo(){vfunc_called(this, "_ZN6dd65623fooEv");}
dd6562 ::~dd6562(){ note_dtor("dd6562", this);} // tgen
dd6562 ::dd6562(){ note_ctor("dd6562", this);} // tgen

static void Test_dd6562()
{
  extern Class_Descriptor cd_dd6562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6562, buf);
    dd6562 *dp, &lv = *(dp=new (buf) dd6562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd6562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(16,12), "dd6562");
    check_base_class_offset(lv, (cc562*), 0, "dd6562");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6562.d");
    test_class_info(&lv, &cd_dd6562);
    dp->~dd6562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6562(Test_dd6562, "dd6562", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6562C1Ev();
extern void _ZN6dd6562D1Ev();
Name_Map name_map_dd6562[] = {
  NSPAIR(_ZN6dd6562C1Ev),
  NSPAIR(_ZN6dd6562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd6562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
extern VTBL_ENTRY _ZTV6dd6562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd6562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd6562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd6562[] = {
  {&(_ZTV6dd6562[3]),  3,11},
  {&(_tg__ZTV5cc562__6dd6562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd6562[4]),  4,6},
  {&(_ZTV6dd6562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static VTBL_ENTRY alt_thunk_names1260[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6562 = {  "dd6562", // class name
  bases_dd6562, 3,
  &(vtc_dd6562[0]), // expected_vtbl_contents
  &(vtt_dd6562[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6562),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1260,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06562  : dd6562 {
  int e;
  ~ee06562(); // tgen
  ee06562(); // tgen
};
//SIG(1 ee06562) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee06562 ::~ee06562(){ note_dtor("ee06562", this);} // tgen
ee06562 ::ee06562(){ note_ctor("ee06562", this);} // tgen

static void Test_ee06562()
{
  extern Class_Descriptor cd_ee06562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06562, buf);
    ee06562 *dp, &lv = *(dp=new (buf) ee06562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee06562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(24,16), "ee06562");
    check_base_class_offset(lv, (cc562*)(dd6562*), 0, "ee06562");
    check_base_class_offset(lv, (dd6562*), 0, "ee06562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06562.e");
    test_class_info(&lv, &cd_ee06562);
    dp->~ee06562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06562(Test_ee06562, "ee06562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06562C1Ev();
extern void _ZN7ee06562D1Ev();
Name_Map name_map_ee06562[] = {
  NSPAIR(_ZN7ee06562C1Ev),
  NSPAIR(_ZN7ee06562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee06562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
extern VTBL_ENTRY _ZTV7ee06562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee06562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee06562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee06562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee06562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee06562[] = {
  {&(_ZTV7ee06562[3]),  3,11},
  {&(_tg__ZTV6dd6562__7ee06562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee06562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee06562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee06562[4]),  4,6},
  {&(_ZTV7ee06562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06562[];
extern  VTBL_ENTRY _ZTV7ee06562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06562[];
static VTBL_ENTRY alt_thunk_names1261[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06562 = {  "ee06562", // class name
  bases_ee06562, 4,
  &(vtc_ee06562[0]), // expected_vtbl_contents
  &(vtt_ee06562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1261,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16562  : virtual dd6562 {
  int e;
  ~ee16562(); // tgen
  ee16562(); // tgen
};
//SIG(1 ee16562) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee16562 ::~ee16562(){ note_dtor("ee16562", this);} // tgen
ee16562 ::ee16562(){ note_ctor("ee16562", this);} // tgen

static void Test_ee16562()
{
  extern Class_Descriptor cd_ee16562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16562, buf);
    ee16562 *dp, &lv = *(dp=new (buf) ee16562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee16562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(32,20), "ee16562");
    check_base_class_offset(lv, (cc562*)(dd6562*), ABISELECT(16,8), "ee16562");
    check_base_class_offset(lv, (dd6562*), ABISELECT(16,8), "ee16562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16562.e");
    test_class_info(&lv, &cd_ee16562);
    dp->~ee16562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16562(Test_ee16562, "ee16562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16562C1Ev();
extern void _ZN7ee16562D1Ev();
Name_Map name_map_ee16562[] = {
  NSPAIR(_ZN7ee16562C1Ev),
  NSPAIR(_ZN7ee16562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee16562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16562[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
extern VTBL_ENTRY _ZTV7ee16562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee16562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee16562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee16562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee16562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee16562[] = {
  {&(_ZTV7ee16562[4]),  4,17},
  {&(_ZTV7ee16562[9]),  9,17},
  {&(_ZTV7ee16562[15]),  15,17},
  {&(_tg__ZTV6dd6562__7ee16562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee16562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee16562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee16562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16562[];
extern  VTBL_ENTRY _ZTV7ee16562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16562[];
static VTBL_ENTRY alt_thunk_names1262[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16562 = {  "ee16562", // class name
  bases_ee16562, 4,
  &(vtc_ee16562[0]), // expected_vtbl_contents
  &(vtt_ee16562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1262,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26562  : dd6562 {
  int e;
  virtual void  foo(); // _ZN7ee265623fooEv
  ~ee26562(); // tgen
  ee26562(); // tgen
};
//SIG(1 ee26562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26562 ::foo(){vfunc_called(this, "_ZN7ee265623fooEv");}
ee26562 ::~ee26562(){ note_dtor("ee26562", this);} // tgen
ee26562 ::ee26562(){ note_ctor("ee26562", this);} // tgen

static void Test_ee26562()
{
  extern Class_Descriptor cd_ee26562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26562, buf);
    ee26562 *dp, &lv = *(dp=new (buf) ee26562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee26562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(24,16), "ee26562");
    check_base_class_offset(lv, (cc562*)(dd6562*), 0, "ee26562");
    check_base_class_offset(lv, (dd6562*), 0, "ee26562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26562.e");
    test_class_info(&lv, &cd_ee26562);
    dp->~ee26562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26562(Test_ee26562, "ee26562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26562C1Ev();
extern void _ZN7ee26562D1Ev();
Name_Map name_map_ee26562[] = {
  NSPAIR(_ZN7ee26562C1Ev),
  NSPAIR(_ZN7ee26562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee26562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26562[];
extern void _ZN6dd65623barEv();
extern void _ZN7ee265623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee265623fooEv,_ZTv0_n12_N7ee265623fooEv)();
extern void ABISELECT(_ZThn24_N7ee265623fooEv,_ZThn16_N7ee265623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN7ee265623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee265623fooEv,_ZTv0_n12_N7ee265623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
extern VTBL_ENTRY _ZTV7ee26562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee26562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee26562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee26562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee26562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee26562[] = {
  {&(_ZTV7ee26562[3]),  3,11},
  {&(_tg__ZTV6dd6562__7ee26562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee26562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee26562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee26562[4]),  4,6},
  {&(_ZTV7ee26562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26562[];
extern  VTBL_ENTRY _ZTV7ee26562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26562[];
static VTBL_ENTRY alt_thunk_names1263[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee265623fooEv,_ZTv0_n12_N7ee265623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee265623fooEv,_ZThn16_N7ee265623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26562 = {  "ee26562", // class name
  bases_ee26562, 4,
  &(vtc_ee26562[0]), // expected_vtbl_contents
  &(vtt_ee26562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1263,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36562  : virtual dd6562 {
  int e;
  virtual void  foo(); // _ZN7ee365623fooEv
  ~ee36562(); // tgen
  ee36562(); // tgen
};
//SIG(1 ee36562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36562 ::foo(){vfunc_called(this, "_ZN7ee365623fooEv");}
ee36562 ::~ee36562(){ note_dtor("ee36562", this);} // tgen
ee36562 ::ee36562(){ note_ctor("ee36562", this);} // tgen

static void Test_ee36562()
{
  extern Class_Descriptor cd_ee36562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36562, buf);
    ee36562 *dp, &lv = *(dp=new (buf) ee36562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee36562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(32,20), "ee36562");
    check_base_class_offset(lv, (cc562*)(dd6562*), ABISELECT(16,8), "ee36562");
    check_base_class_offset(lv, (dd6562*), ABISELECT(16,8), "ee36562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36562.e");
    test_class_info(&lv, &cd_ee36562);
    dp->~ee36562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36562(Test_ee36562, "ee36562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36562C1Ev();
extern void _ZN7ee36562D1Ev();
Name_Map name_map_ee36562[] = {
  NSPAIR(_ZN7ee36562C1Ev),
  NSPAIR(_ZN7ee36562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee36562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36562[];
extern void _ZN7ee365623fooEv();
extern void _ZN6dd65623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee365623fooEv,_ZTv0_n20_N7ee365623fooEv)();
extern void ABISELECT(_ZThn16_N7ee365623fooEv,_ZThn8_N7ee365623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee365623fooEv,_ZTv0_n12_N7ee365623fooEv)();
extern void ABISELECT(_ZThn32_N7ee365623fooEv,_ZThn20_N7ee365623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36562[0]),
  (VTBL_ENTRY)&_ZN7ee365623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee365623fooEv,_ZTv0_n20_N7ee365623fooEv),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee365623fooEv,_ZTv0_n12_N7ee365623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
extern VTBL_ENTRY _ZTV7ee36562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee36562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee36562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee36562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee36562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee36562[] = {
  {&(_ZTV7ee36562[4]),  4,18},
  {&(_ZTV7ee36562[10]),  10,18},
  {&(_ZTV7ee36562[16]),  16,18},
  {&(_tg__ZTV6dd6562__7ee36562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee36562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee36562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee36562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36562[];
extern  VTBL_ENTRY _ZTV7ee36562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36562[];
static VTBL_ENTRY alt_thunk_names1264[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee365623fooEv,_ZTv0_n12_N7ee365623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee365623fooEv,_ZThn20_N7ee365623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee365623fooEv,_ZTv0_n20_N7ee365623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee365623fooEv,_ZThn8_N7ee365623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36562 = {  "ee36562", // class name
  bases_ee36562, 4,
  &(vtc_ee36562[0]), // expected_vtbl_contents
  &(vtt_ee36562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36562),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1264,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46562  : dd6562 {
  int e;
  virtual void  bar(); // _ZN7ee465623barEv
  ~ee46562(); // tgen
  ee46562(); // tgen
};
//SIG(1 ee46562) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46562 ::bar(){vfunc_called(this, "_ZN7ee465623barEv");}
ee46562 ::~ee46562(){ note_dtor("ee46562", this);} // tgen
ee46562 ::ee46562(){ note_ctor("ee46562", this);} // tgen

static void Test_ee46562()
{
  extern Class_Descriptor cd_ee46562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46562, buf);
    ee46562 *dp, &lv = *(dp=new (buf) ee46562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee46562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(24,16), "ee46562");
    check_base_class_offset(lv, (cc562*)(dd6562*), 0, "ee46562");
    check_base_class_offset(lv, (dd6562*), 0, "ee46562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46562.e");
    test_class_info(&lv, &cd_ee46562);
    dp->~ee46562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46562(Test_ee46562, "ee46562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46562C1Ev();
extern void _ZN7ee46562D1Ev();
Name_Map name_map_ee46562[] = {
  NSPAIR(_ZN7ee46562C1Ev),
  NSPAIR(_ZN7ee46562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee46562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46562[];
extern void _ZN7ee465623barEv();
extern void _ZN6dd65623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee465623barEv,_ZTv0_n16_N7ee465623barEv)();
extern void ABISELECT(_ZThn24_N7ee465623barEv,_ZThn16_N7ee465623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46562[0]),
  (VTBL_ENTRY)&_ZN7ee465623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee465623barEv,_ZTv0_n16_N7ee465623barEv),
};
extern VTBL_ENTRY _ZTV7ee46562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee46562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee46562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee46562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee46562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee46562[] = {
  {&(_ZTV7ee46562[3]),  3,11},
  {&(_tg__ZTV6dd6562__7ee46562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee46562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee46562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee46562[4]),  4,6},
  {&(_ZTV7ee46562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46562[];
extern  VTBL_ENTRY _ZTV7ee46562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46562[];
static VTBL_ENTRY alt_thunk_names1265[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee465623barEv,_ZTv0_n16_N7ee465623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee465623barEv,_ZThn16_N7ee465623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46562 = {  "ee46562", // class name
  bases_ee46562, 4,
  &(vtc_ee46562[0]), // expected_vtbl_contents
  &(vtt_ee46562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1265,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56562  : virtual dd6562 {
  int e;
  virtual void  bar(); // _ZN7ee565623barEv
  ~ee56562(); // tgen
  ee56562(); // tgen
};
//SIG(1 ee56562) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56562 ::bar(){vfunc_called(this, "_ZN7ee565623barEv");}
ee56562 ::~ee56562(){ note_dtor("ee56562", this);} // tgen
ee56562 ::ee56562(){ note_ctor("ee56562", this);} // tgen

static void Test_ee56562()
{
  extern Class_Descriptor cd_ee56562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56562, buf);
    ee56562 *dp, &lv = *(dp=new (buf) ee56562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee56562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(32,20), "ee56562");
    check_base_class_offset(lv, (cc562*)(dd6562*), ABISELECT(16,8), "ee56562");
    check_base_class_offset(lv, (dd6562*), ABISELECT(16,8), "ee56562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56562.e");
    test_class_info(&lv, &cd_ee56562);
    dp->~ee56562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56562(Test_ee56562, "ee56562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56562C1Ev();
extern void _ZN7ee56562D1Ev();
Name_Map name_map_ee56562[] = {
  NSPAIR(_ZN7ee56562C1Ev),
  NSPAIR(_ZN7ee56562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee56562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56562[];
extern void _ZN7ee565623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee565623barEv,_ZTv0_n16_N7ee565623barEv)();
extern void ABISELECT(_ZThn16_N7ee565623barEv,_ZThn8_N7ee565623barEv)() __attribute__((weak));
extern void _ZN6dd65623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee565623barEv,_ZTv0_n16_N7ee565623barEv)();
extern void ABISELECT(_ZThn32_N7ee565623barEv,_ZThn20_N7ee565623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56562[0]),
  (VTBL_ENTRY)&_ZN7ee565623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee565623barEv,_ZTv0_n16_N7ee565623barEv),
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee565623barEv,_ZTv0_n16_N7ee565623barEv),
};
extern VTBL_ENTRY _ZTV7ee56562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee56562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee56562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee56562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee56562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee56562[] = {
  {&(_ZTV7ee56562[4]),  4,18},
  {&(_ZTV7ee56562[10]),  10,18},
  {&(_ZTV7ee56562[16]),  16,18},
  {&(_tg__ZTV6dd6562__7ee56562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee56562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee56562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee56562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56562[];
extern  VTBL_ENTRY _ZTV7ee56562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56562[];
static VTBL_ENTRY alt_thunk_names1266[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee565623barEv,_ZTv0_n16_N7ee565623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee565623barEv,_ZThn20_N7ee565623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee565623barEv,_ZThn8_N7ee565623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56562 = {  "ee56562", // class name
  bases_ee56562, 4,
  &(vtc_ee56562[0]), // expected_vtbl_contents
  &(vtt_ee56562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56562),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1266,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66562  : dd6562 {
  int e;
  virtual void  foo(); // _ZN7ee665623fooEv
  virtual void  bar(); // _ZN7ee665623barEv
  ~ee66562(); // tgen
  ee66562(); // tgen
};
//SIG(1 ee66562) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66562 ::foo(){vfunc_called(this, "_ZN7ee665623fooEv");}
void  ee66562 ::bar(){vfunc_called(this, "_ZN7ee665623barEv");}
ee66562 ::~ee66562(){ note_dtor("ee66562", this);} // tgen
ee66562 ::ee66562(){ note_ctor("ee66562", this);} // tgen

static void Test_ee66562()
{
  extern Class_Descriptor cd_ee66562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66562, buf);
    ee66562 *dp, &lv = *(dp=new (buf) ee66562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee66562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(24,16), "ee66562");
    check_base_class_offset(lv, (cc562*)(dd6562*), 0, "ee66562");
    check_base_class_offset(lv, (dd6562*), 0, "ee66562");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66562.e");
    test_class_info(&lv, &cd_ee66562);
    dp->~ee66562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66562(Test_ee66562, "ee66562", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66562C1Ev();
extern void _ZN7ee66562D1Ev();
Name_Map name_map_ee66562[] = {
  NSPAIR(_ZN7ee66562C1Ev),
  NSPAIR(_ZN7ee66562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee66562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66562[];
extern void _ZN7ee665623barEv();
extern void _ZN7ee665623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee665623fooEv,_ZTv0_n12_N7ee665623fooEv)();
extern void ABISELECT(_ZThn24_N7ee665623fooEv,_ZThn16_N7ee665623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee665623barEv,_ZTv0_n16_N7ee665623barEv)();
extern void ABISELECT(_ZThn24_N7ee665623barEv,_ZThn16_N7ee665623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66562[0]),
  (VTBL_ENTRY)&_ZN7ee665623barEv,
  (VTBL_ENTRY)&_ZN7ee665623fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee665623fooEv,_ZTv0_n12_N7ee665623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee665623barEv,_ZTv0_n16_N7ee665623barEv),
};
extern VTBL_ENTRY _ZTV7ee66562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee66562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee66562[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee66562[] = {
  ABISELECT(-24,-16),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee66562[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee66562[] = {
  {&(_ZTV7ee66562[3]),  3,11},
  {&(_tg__ZTV6dd6562__7ee66562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee66562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee66562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee66562[4]),  4,6},
  {&(_ZTV7ee66562[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66562[];
extern  VTBL_ENTRY _ZTV7ee66562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66562[];
static VTBL_ENTRY alt_thunk_names1267[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623barEv,_ZThn16_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd65623fooEv,_ZThn16_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc5623barEv,_ZThn16_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee665623barEv,_ZTv0_n16_N7ee665623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee665623barEv,_ZThn16_N7ee665623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee665623fooEv,_ZTv0_n12_N7ee665623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee665623fooEv,_ZThn16_N7ee665623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66562 = {  "ee66562", // class name
  bases_ee66562, 4,
  &(vtc_ee66562[0]), // expected_vtbl_contents
  &(vtt_ee66562[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66562),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66562),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1267,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76562  : virtual dd6562 {
  int e;
  virtual void  foo(); // _ZN7ee765623fooEv
  virtual void  bar(); // _ZN7ee765623barEv
  ~ee76562(); // tgen
  ee76562(); // tgen
};
//SIG(1 ee76562) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76562 ::foo(){vfunc_called(this, "_ZN7ee765623fooEv");}
void  ee76562 ::bar(){vfunc_called(this, "_ZN7ee765623barEv");}
ee76562 ::~ee76562(){ note_dtor("ee76562", this);} // tgen
ee76562 ::ee76562(){ note_ctor("ee76562", this);} // tgen

static void Test_ee76562()
{
  extern Class_Descriptor cd_ee76562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76562, buf);
    ee76562 *dp, &lv = *(dp=new (buf) ee76562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee76562");
    check_base_class_offset(lv, (bb62*)(cc562*)(dd6562*), ABISELECT(32,20), "ee76562");
    check_base_class_offset(lv, (cc562*)(dd6562*), ABISELECT(16,8), "ee76562");
    check_base_class_offset(lv, (dd6562*), ABISELECT(16,8), "ee76562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76562.e");
    test_class_info(&lv, &cd_ee76562);
    dp->~ee76562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76562(Test_ee76562, "ee76562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76562C1Ev();
extern void _ZN7ee76562D1Ev();
Name_Map name_map_ee76562[] = {
  NSPAIR(_ZN7ee76562C1Ev),
  NSPAIR(_ZN7ee76562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd6562;
extern VTBL_ENTRY _ZTI6dd6562[];
extern  VTBL_ENTRY _ZTV6dd6562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6562[];
static Base_Class bases_ee76562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc562,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76562[];
extern void _ZN7ee765623fooEv();
extern void _ZN7ee765623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee765623barEv,_ZTv0_n16_N7ee765623barEv)();
extern void ABISELECT(_ZThn16_N7ee765623barEv,_ZThn8_N7ee765623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee765623fooEv,_ZTv0_n20_N7ee765623fooEv)();
extern void ABISELECT(_ZThn16_N7ee765623fooEv,_ZThn8_N7ee765623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee765623fooEv,_ZTv0_n12_N7ee765623fooEv)();
extern void ABISELECT(_ZThn32_N7ee765623fooEv,_ZThn20_N7ee765623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee765623barEv,_ZTv0_n16_N7ee765623barEv)();
extern void ABISELECT(_ZThn32_N7ee765623barEv,_ZThn20_N7ee765623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76562[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76562[0]),
  (VTBL_ENTRY)&_ZN7ee765623fooEv,
  (VTBL_ENTRY)&_ZN7ee765623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee765623barEv,_ZTv0_n16_N7ee765623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee765623fooEv,_ZTv0_n20_N7ee765623fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee765623fooEv,_ZTv0_n12_N7ee765623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee765623barEv,_ZTv0_n16_N7ee765623barEv),
};
extern VTBL_ENTRY _ZTV7ee76562[];
extern void _ZN6dd65623barEv();
extern void _ZN6dd65623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd6562__7ee76562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&_ZN6dd65623barEv,
  (VTBL_ENTRY)&_ZN6dd65623fooEv,
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc5626dd6562__7ee76562[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc5626dd6562__7ee76562[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv)();
extern void ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv)();
extern void ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6562__7ee76562[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv),
};
static  VTT_ENTRY vtt_ee76562[] = {
  {&(_ZTV7ee76562[4]),  4,19},
  {&(_ZTV7ee76562[11]),  11,19},
  {&(_ZTV7ee76562[17]),  17,19},
  {&(_tg__ZTV6dd6562__7ee76562[3]),  3,5},
  {&(_tg__ZTV5cc5626dd6562__7ee76562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc5626dd6562__7ee76562[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6562__7ee76562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76562[];
extern  VTBL_ENTRY _ZTV7ee76562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76562[];
static VTBL_ENTRY alt_thunk_names1268[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd65623barEv,_ZTv0_n16_N6dd65623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623barEv,_ZThn12_N6dd65623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd65623fooEv,_ZTv0_n12_N6dd65623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd65623fooEv,_ZThn12_N6dd65623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn12_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee765623fooEv,_ZTv0_n12_N7ee765623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee765623fooEv,_ZThn20_N7ee765623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee765623fooEv,_ZTv0_n20_N7ee765623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee765623fooEv,_ZThn8_N7ee765623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee765623barEv,_ZTv0_n16_N7ee765623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee765623barEv,_ZThn20_N7ee765623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee765623barEv,_ZThn8_N7ee765623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76562 = {  "ee76562", // class name
  bases_ee76562, 4,
  &(vtc_ee76562[0]), // expected_vtbl_contents
  &(vtt_ee76562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76562),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76562),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1268,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7562  : virtual cc562 {
  int d;
  virtual void  bar(); // _ZN6dd75623barEv
  virtual void  foo(); // _ZN6dd75623fooEv
  ~dd7562(); // tgen
  dd7562(); // tgen
};
//SIG(-1 dd7562) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  dd7562 ::bar(){vfunc_called(this, "_ZN6dd75623barEv");}
void  dd7562 ::foo(){vfunc_called(this, "_ZN6dd75623fooEv");}
dd7562 ::~dd7562(){ note_dtor("dd7562", this);} // tgen
dd7562 ::dd7562(){ note_ctor("dd7562", this);} // tgen

static void Test_dd7562()
{
  extern Class_Descriptor cd_dd7562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7562, buf);
    dd7562 *dp, &lv = *(dp=new (buf) dd7562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd7562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,16), "dd7562");
    check_base_class_offset(lv, (cc562*), ABISELECT(16,8), "dd7562");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7562.d");
    test_class_info(&lv, &cd_dd7562);
    dp->~dd7562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7562(Test_dd7562, "dd7562", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7562C1Ev();
extern void _ZN6dd7562D1Ev();
Name_Map name_map_dd7562[] = {
  NSPAIR(_ZN6dd7562C1Ev),
  NSPAIR(_ZN6dd7562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
static Base_Class bases_dd7562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc562,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern VTBL_ENTRY _ZTV6dd7562[];
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__6dd7562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_dd7562[] = {
  {&(_ZTV6dd7562[4]),  4,17},
  {&(_ZTV6dd7562[10]),  10,17},
  {&(_ZTV6dd7562[15]),  15,17},
  {&(_tg__ZTV5cc562__6dd7562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__6dd7562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static VTBL_ENTRY alt_thunk_names1269[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7562 = {  "dd7562", // class name
  bases_dd7562, 3,
  &(vtc_dd7562[0]), // expected_vtbl_contents
  &(vtt_dd7562[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7562),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1269,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07562  : dd7562 {
  int e;
  ~ee07562(); // tgen
  ee07562(); // tgen
};
//SIG(1 ee07562) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee07562 ::~ee07562(){ note_dtor("ee07562", this);} // tgen
ee07562 ::ee07562(){ note_ctor("ee07562", this);} // tgen

static void Test_ee07562()
{
  extern Class_Descriptor cd_ee07562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07562, buf);
    ee07562 *dp, &lv = *(dp=new (buf) ee07562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee07562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee07562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(16,12), "ee07562");
    check_base_class_offset(lv, (dd7562*), 0, "ee07562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07562.e");
    test_class_info(&lv, &cd_ee07562);
    dp->~ee07562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07562(Test_ee07562, "ee07562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07562C1Ev();
extern void _ZN7ee07562D1Ev();
Name_Map name_map_ee07562[] = {
  NSPAIR(_ZN7ee07562C1Ev),
  NSPAIR(_ZN7ee07562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee07562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern VTBL_ENTRY _ZTV7ee07562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee07562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee07562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee07562[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee07562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee07562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee07562[] = {
  {&(_ZTV7ee07562[4]),  4,17},
  {&(_tg__ZTV6dd7562__7ee07562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee07562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee07562[4]),  4,6},
  {&(_ZTV7ee07562[10]),  10,17},
  {&(_ZTV7ee07562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee07562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee07562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07562[];
extern  VTBL_ENTRY _ZTV7ee07562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07562[];
static VTBL_ENTRY alt_thunk_names1270[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07562 = {  "ee07562", // class name
  bases_ee07562, 4,
  &(vtc_ee07562[0]), // expected_vtbl_contents
  &(vtt_ee07562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1270,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17562  : virtual dd7562 {
  int e;
  ~ee17562(); // tgen
  ee17562(); // tgen
};
//SIG(1 ee17562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} Fi}


ee17562 ::~ee17562(){ note_dtor("ee17562", this);} // tgen
ee17562 ::ee17562(){ note_ctor("ee17562", this);} // tgen

static void Test_ee17562()
{
  extern Class_Descriptor cd_ee17562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17562, buf);
    ee17562 *dp, &lv = *(dp=new (buf) ee17562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee17562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee17562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(32,16), "ee17562");
    check_base_class_offset(lv, (dd7562*), ABISELECT(16,8), "ee17562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17562.e");
    test_class_info(&lv, &cd_ee17562);
    dp->~ee17562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17562(Test_ee17562, "ee17562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17562C1Ev();
extern void _ZN7ee17562D1Ev();
Name_Map name_map_ee17562[] = {
  NSPAIR(_ZN7ee17562C1Ev),
  NSPAIR(_ZN7ee17562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee17562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17562[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern VTBL_ENTRY _ZTV7ee17562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee17562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee17562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee17562[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee17562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee17562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee17562[] = {
  {&(_ZTV7ee17562[5]),  5,24},
  {&(_ZTV7ee17562[11]),  11,24},
  {&(_ZTV7ee17562[17]),  17,24},
  {&(_ZTV7ee17562[22]),  22,24},
  {&(_tg__ZTV6dd7562__7ee17562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee17562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee17562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee17562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee17562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17562[];
extern  VTBL_ENTRY _ZTV7ee17562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17562[];
static VTBL_ENTRY alt_thunk_names1271[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17562 = {  "ee17562", // class name
  bases_ee17562, 4,
  &(vtc_ee17562[0]), // expected_vtbl_contents
  &(vtt_ee17562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17562),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1271,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27562  : dd7562 {
  int e;
  virtual void  foo(); // _ZN7ee275623fooEv
  ~ee27562(); // tgen
  ee27562(); // tgen
};
//SIG(1 ee27562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27562 ::foo(){vfunc_called(this, "_ZN7ee275623fooEv");}
ee27562 ::~ee27562(){ note_dtor("ee27562", this);} // tgen
ee27562 ::ee27562(){ note_ctor("ee27562", this);} // tgen

static void Test_ee27562()
{
  extern Class_Descriptor cd_ee27562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27562, buf);
    ee27562 *dp, &lv = *(dp=new (buf) ee27562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee27562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee27562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(16,12), "ee27562");
    check_base_class_offset(lv, (dd7562*), 0, "ee27562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27562.e");
    test_class_info(&lv, &cd_ee27562);
    dp->~ee27562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27562(Test_ee27562, "ee27562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27562C1Ev();
extern void _ZN7ee27562D1Ev();
Name_Map name_map_ee27562[] = {
  NSPAIR(_ZN7ee27562C1Ev),
  NSPAIR(_ZN7ee27562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee27562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27562[];
extern void _ZN6dd75623barEv();
extern void _ZN7ee275623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee275623fooEv,_ZTv0_n12_N7ee275623fooEv)();
extern void ABISELECT(_ZThn32_N7ee275623fooEv,_ZThn20_N7ee275623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN7ee275623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee275623fooEv,_ZTv0_n12_N7ee275623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern VTBL_ENTRY _ZTV7ee27562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee27562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee27562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee27562[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee27562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee27562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee27562[] = {
  {&(_ZTV7ee27562[4]),  4,17},
  {&(_tg__ZTV6dd7562__7ee27562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee27562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee27562[4]),  4,6},
  {&(_ZTV7ee27562[10]),  10,17},
  {&(_ZTV7ee27562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee27562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee27562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27562[];
extern  VTBL_ENTRY _ZTV7ee27562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27562[];
static VTBL_ENTRY alt_thunk_names1272[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee275623fooEv,_ZTv0_n12_N7ee275623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee275623fooEv,_ZThn20_N7ee275623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27562 = {  "ee27562", // class name
  bases_ee27562, 4,
  &(vtc_ee27562[0]), // expected_vtbl_contents
  &(vtt_ee27562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1272,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37562  : virtual dd7562 {
  int e;
  virtual void  foo(); // _ZN7ee375623fooEv
  ~ee37562(); // tgen
  ee37562(); // tgen
};
//SIG(1 ee37562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37562 ::foo(){vfunc_called(this, "_ZN7ee375623fooEv");}
ee37562 ::~ee37562(){ note_dtor("ee37562", this);} // tgen
ee37562 ::ee37562(){ note_ctor("ee37562", this);} // tgen

static void Test_ee37562()
{
  extern Class_Descriptor cd_ee37562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37562, buf);
    ee37562 *dp, &lv = *(dp=new (buf) ee37562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee37562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee37562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(32,16), "ee37562");
    check_base_class_offset(lv, (dd7562*), ABISELECT(16,8), "ee37562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37562.e");
    test_class_info(&lv, &cd_ee37562);
    dp->~ee37562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37562(Test_ee37562, "ee37562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37562C1Ev();
extern void _ZN7ee37562D1Ev();
Name_Map name_map_ee37562[] = {
  NSPAIR(_ZN7ee37562C1Ev),
  NSPAIR(_ZN7ee37562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee37562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37562[];
extern void _ZN7ee375623fooEv();
extern void _ZN6dd75623barEv();
extern void ABISELECT(_ZTv0_n48_N7ee375623fooEv,_ZTv0_n24_N7ee375623fooEv)();
extern void ABISELECT(_ZThn16_N7ee375623fooEv,_ZThn8_N7ee375623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee375623fooEv,_ZTv0_n12_N7ee375623fooEv)();
extern void ABISELECT(_ZThn48_N7ee375623fooEv,_ZThn24_N7ee375623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37562[0]),
  (VTBL_ENTRY)&_ZN7ee375623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee375623fooEv,_ZTv0_n24_N7ee375623fooEv),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee375623fooEv,_ZTv0_n12_N7ee375623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern VTBL_ENTRY _ZTV7ee37562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee37562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee37562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee37562[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee37562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee37562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee37562[] = {
  {&(_ZTV7ee37562[5]),  5,25},
  {&(_ZTV7ee37562[12]),  12,25},
  {&(_ZTV7ee37562[18]),  18,25},
  {&(_ZTV7ee37562[23]),  23,25},
  {&(_tg__ZTV6dd7562__7ee37562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee37562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee37562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee37562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee37562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37562[];
extern  VTBL_ENTRY _ZTV7ee37562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37562[];
static VTBL_ENTRY alt_thunk_names1273[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee375623fooEv,_ZTv0_n12_N7ee375623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee375623fooEv,_ZThn24_N7ee375623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee375623fooEv,_ZTv0_n24_N7ee375623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee375623fooEv,_ZThn8_N7ee375623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37562 = {  "ee37562", // class name
  bases_ee37562, 4,
  &(vtc_ee37562[0]), // expected_vtbl_contents
  &(vtt_ee37562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37562),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1273,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47562  : dd7562 {
  int e;
  virtual void  bar(); // _ZN7ee475623barEv
  ~ee47562(); // tgen
  ee47562(); // tgen
};
//SIG(1 ee47562) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47562 ::bar(){vfunc_called(this, "_ZN7ee475623barEv");}
ee47562 ::~ee47562(){ note_dtor("ee47562", this);} // tgen
ee47562 ::ee47562(){ note_ctor("ee47562", this);} // tgen

static void Test_ee47562()
{
  extern Class_Descriptor cd_ee47562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47562, buf);
    ee47562 *dp, &lv = *(dp=new (buf) ee47562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee47562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee47562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(16,12), "ee47562");
    check_base_class_offset(lv, (dd7562*), 0, "ee47562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47562.e");
    test_class_info(&lv, &cd_ee47562);
    dp->~ee47562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47562(Test_ee47562, "ee47562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47562C1Ev();
extern void _ZN7ee47562D1Ev();
Name_Map name_map_ee47562[] = {
  NSPAIR(_ZN7ee47562C1Ev),
  NSPAIR(_ZN7ee47562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee47562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47562[];
extern void _ZN7ee475623barEv();
extern void _ZN6dd75623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee475623barEv,_ZTv0_n16_N7ee475623barEv)();
extern void ABISELECT(_ZThn16_N7ee475623barEv,_ZThn12_N7ee475623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee475623barEv,_ZTv0_n16_N7ee475623barEv)();
extern void ABISELECT(_ZThn32_N7ee475623barEv,_ZThn20_N7ee475623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47562[0]),
  (VTBL_ENTRY)&_ZN7ee475623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee475623barEv,_ZTv0_n16_N7ee475623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee475623barEv,_ZTv0_n16_N7ee475623barEv),
};
extern VTBL_ENTRY _ZTV7ee47562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee47562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee47562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee47562[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee47562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee47562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee47562[] = {
  {&(_ZTV7ee47562[4]),  4,17},
  {&(_tg__ZTV6dd7562__7ee47562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee47562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee47562[4]),  4,6},
  {&(_ZTV7ee47562[10]),  10,17},
  {&(_ZTV7ee47562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee47562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee47562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47562[];
extern  VTBL_ENTRY _ZTV7ee47562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47562[];
static VTBL_ENTRY alt_thunk_names1274[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee475623barEv,_ZTv0_n16_N7ee475623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee475623barEv,_ZThn20_N7ee475623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee475623barEv,_ZThn12_N7ee475623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47562 = {  "ee47562", // class name
  bases_ee47562, 4,
  &(vtc_ee47562[0]), // expected_vtbl_contents
  &(vtt_ee47562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1274,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57562  : virtual dd7562 {
  int e;
  virtual void  bar(); // _ZN7ee575623barEv
  ~ee57562(); // tgen
  ee57562(); // tgen
};
//SIG(1 ee57562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57562 ::bar(){vfunc_called(this, "_ZN7ee575623barEv");}
ee57562 ::~ee57562(){ note_dtor("ee57562", this);} // tgen
ee57562 ::ee57562(){ note_ctor("ee57562", this);} // tgen

static void Test_ee57562()
{
  extern Class_Descriptor cd_ee57562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57562, buf);
    ee57562 *dp, &lv = *(dp=new (buf) ee57562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee57562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee57562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(32,16), "ee57562");
    check_base_class_offset(lv, (dd7562*), ABISELECT(16,8), "ee57562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57562.e");
    test_class_info(&lv, &cd_ee57562);
    dp->~ee57562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57562(Test_ee57562, "ee57562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57562C1Ev();
extern void _ZN7ee57562D1Ev();
Name_Map name_map_ee57562[] = {
  NSPAIR(_ZN7ee57562C1Ev),
  NSPAIR(_ZN7ee57562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee57562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc562,    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
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57562[];
extern void _ZN7ee575623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee575623barEv,_ZTv0_n20_N7ee575623barEv)();
extern void ABISELECT(_ZThn16_N7ee575623barEv,_ZThn8_N7ee575623barEv)() __attribute__((weak));
extern void _ZN6dd75623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee575623barEv,_ZTv0_n16_N7ee575623barEv)();
extern void ABISELECT(_ZThn32_N7ee575623barEv,_ZThn16_N7ee575623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee575623barEv,_ZTv0_n16_N7ee575623barEv)();
extern void ABISELECT(_ZThn48_N7ee575623barEv,_ZThn24_N7ee575623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57562[0]),
  (VTBL_ENTRY)&_ZN7ee575623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee575623barEv,_ZTv0_n20_N7ee575623barEv),
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee575623barEv,_ZTv0_n16_N7ee575623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee575623barEv,_ZTv0_n16_N7ee575623barEv),
};
extern VTBL_ENTRY _ZTV7ee57562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee57562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee57562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee57562[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee57562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee57562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee57562[] = {
  {&(_ZTV7ee57562[5]),  5,25},
  {&(_ZTV7ee57562[12]),  12,25},
  {&(_ZTV7ee57562[18]),  18,25},
  {&(_ZTV7ee57562[23]),  23,25},
  {&(_tg__ZTV6dd7562__7ee57562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee57562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee57562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee57562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee57562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57562[];
extern  VTBL_ENTRY _ZTV7ee57562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57562[];
static VTBL_ENTRY alt_thunk_names1275[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee575623barEv,_ZTv0_n16_N7ee575623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee575623barEv,_ZThn24_N7ee575623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee575623barEv,_ZThn16_N7ee575623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee575623barEv,_ZTv0_n20_N7ee575623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee575623barEv,_ZThn8_N7ee575623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57562 = {  "ee57562", // class name
  bases_ee57562, 4,
  &(vtc_ee57562[0]), // expected_vtbl_contents
  &(vtt_ee57562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57562),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1275,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67562  : dd7562 {
  int e;
  virtual void  foo(); // _ZN7ee675623fooEv
  virtual void  bar(); // _ZN7ee675623barEv
  ~ee67562(); // tgen
  ee67562(); // tgen
};
//SIG(1 ee67562) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67562 ::foo(){vfunc_called(this, "_ZN7ee675623fooEv");}
void  ee67562 ::bar(){vfunc_called(this, "_ZN7ee675623barEv");}
ee67562 ::~ee67562(){ note_dtor("ee67562", this);} // tgen
ee67562 ::ee67562(){ note_ctor("ee67562", this);} // tgen

static void Test_ee67562()
{
  extern Class_Descriptor cd_ee67562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67562, buf);
    ee67562 *dp, &lv = *(dp=new (buf) ee67562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee67562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(32,20), "ee67562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(16,12), "ee67562");
    check_base_class_offset(lv, (dd7562*), 0, "ee67562");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67562.e");
    test_class_info(&lv, &cd_ee67562);
    dp->~ee67562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67562(Test_ee67562, "ee67562", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67562C1Ev();
extern void _ZN7ee67562D1Ev();
Name_Map name_map_ee67562[] = {
  NSPAIR(_ZN7ee67562C1Ev),
  NSPAIR(_ZN7ee67562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee67562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67562[];
extern void _ZN7ee675623barEv();
extern void _ZN7ee675623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee675623barEv,_ZTv0_n16_N7ee675623barEv)();
extern void ABISELECT(_ZThn16_N7ee675623barEv,_ZThn12_N7ee675623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee675623fooEv,_ZTv0_n12_N7ee675623fooEv)();
extern void ABISELECT(_ZThn32_N7ee675623fooEv,_ZThn20_N7ee675623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee675623barEv,_ZTv0_n16_N7ee675623barEv)();
extern void ABISELECT(_ZThn32_N7ee675623barEv,_ZThn20_N7ee675623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67562[0]),
  (VTBL_ENTRY)&_ZN7ee675623barEv,
  (VTBL_ENTRY)&_ZN7ee675623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee675623barEv,_ZTv0_n16_N7ee675623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee675623fooEv,_ZTv0_n12_N7ee675623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee675623barEv,_ZTv0_n16_N7ee675623barEv),
};
extern VTBL_ENTRY _ZTV7ee67562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee67562[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee67562[] = {
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee67562[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee67562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee67562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee67562[] = {
  {&(_ZTV7ee67562[4]),  4,17},
  {&(_tg__ZTV6dd7562__7ee67562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee67562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee67562[4]),  4,6},
  {&(_ZTV7ee67562[10]),  10,17},
  {&(_ZTV7ee67562[15]),  15,17},
  {&(_tg__ZTV5cc562__7ee67562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee67562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67562[];
extern  VTBL_ENTRY _ZTV7ee67562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67562[];
static VTBL_ENTRY alt_thunk_names1276[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn20_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn20_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn12_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee675623fooEv,_ZTv0_n12_N7ee675623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee675623fooEv,_ZThn20_N7ee675623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee675623barEv,_ZTv0_n16_N7ee675623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee675623barEv,_ZThn20_N7ee675623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee675623barEv,_ZThn12_N7ee675623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67562 = {  "ee67562", // class name
  bases_ee67562, 4,
  &(vtc_ee67562[0]), // expected_vtbl_contents
  &(vtt_ee67562[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67562),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67562),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67562),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1276,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77562  : virtual dd7562 {
  int e;
  virtual void  foo(); // _ZN7ee775623fooEv
  virtual void  bar(); // _ZN7ee775623barEv
  ~ee77562(); // tgen
  ee77562(); // tgen
};
//SIG(1 ee77562) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77562 ::foo(){vfunc_called(this, "_ZN7ee775623fooEv");}
void  ee77562 ::bar(){vfunc_called(this, "_ZN7ee775623barEv");}
ee77562 ::~ee77562(){ note_dtor("ee77562", this);} // tgen
ee77562 ::ee77562(){ note_ctor("ee77562", this);} // tgen

static void Test_ee77562()
{
  extern Class_Descriptor cd_ee77562;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77562, buf);
    ee77562 *dp, &lv = *(dp=new (buf) ee77562());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77562)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77562)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee77562");
    check_base_class_offset(lv, (bb62*)(cc562*), ABISELECT(48,24), "ee77562");
    check_base_class_offset(lv, (cc562*)(dd7562*), ABISELECT(32,16), "ee77562");
    check_base_class_offset(lv, (dd7562*), ABISELECT(16,8), "ee77562");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77562.e");
    test_class_info(&lv, &cd_ee77562);
    dp->~ee77562();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77562(Test_ee77562, "ee77562", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77562C1Ev();
extern void _ZN7ee77562D1Ev();
Name_Map name_map_ee77562[] = {
  NSPAIR(_ZN7ee77562C1Ev),
  NSPAIR(_ZN7ee77562D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc562;
extern VTBL_ENTRY _ZTI5cc562[];
extern  VTBL_ENTRY _ZTV5cc562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc562[];
extern Class_Descriptor cd_dd7562;
extern VTBL_ENTRY _ZTI6dd7562[];
extern  VTBL_ENTRY _ZTV6dd7562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7562[];
static Base_Class bases_ee77562[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc562,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7562,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77562[];
extern void _ZN7ee775623fooEv();
extern void _ZN7ee775623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee775623barEv,_ZTv0_n20_N7ee775623barEv)();
extern void ABISELECT(_ZThn16_N7ee775623barEv,_ZThn8_N7ee775623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee775623fooEv,_ZTv0_n24_N7ee775623fooEv)();
extern void ABISELECT(_ZThn16_N7ee775623fooEv,_ZThn8_N7ee775623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee775623barEv,_ZTv0_n16_N7ee775623barEv)();
extern void ABISELECT(_ZThn32_N7ee775623barEv,_ZThn16_N7ee775623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee775623fooEv,_ZTv0_n12_N7ee775623fooEv)();
extern void ABISELECT(_ZThn48_N7ee775623fooEv,_ZThn24_N7ee775623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee775623barEv,_ZTv0_n16_N7ee775623barEv)();
extern void ABISELECT(_ZThn48_N7ee775623barEv,_ZThn24_N7ee775623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77562[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77562[0]),
  (VTBL_ENTRY)&_ZN7ee775623fooEv,
  (VTBL_ENTRY)&_ZN7ee775623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee775623barEv,_ZTv0_n20_N7ee775623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee775623fooEv,_ZTv0_n24_N7ee775623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee775623barEv,_ZTv0_n16_N7ee775623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee775623fooEv,_ZTv0_n12_N7ee775623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee775623barEv,_ZTv0_n16_N7ee775623barEv),
};
extern VTBL_ENTRY _ZTV7ee77562[];
extern void _ZN6dd75623barEv();
extern void _ZN6dd75623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7562__7ee77562[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&_ZN6dd75623barEv,
  (VTBL_ENTRY)&_ZN6dd75623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc562__6dd7562__7ee77562[] = {
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv)();
extern void ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv)();
extern void ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7562__7ee77562[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7562[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv),
};
extern void _ZN5cc5623barEv();
static  VTBL_ENTRY _tg__ZTV5cc562__7ee77562[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN5cc5623barEv,
};
extern void _ZN4bb623fooEv();
extern void ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv)();
extern void ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc562__7ee77562[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc562[0]),
  (VTBL_ENTRY)&_ZN4bb623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv),
};
static  VTT_ENTRY vtt_ee77562[] = {
  {&(_ZTV7ee77562[5]),  5,26},
  {&(_ZTV7ee77562[13]),  13,26},
  {&(_ZTV7ee77562[19]),  19,26},
  {&(_ZTV7ee77562[24]),  24,26},
  {&(_tg__ZTV6dd7562__7ee77562[4]),  4,6},
  {&(_tg__ZTV5cc562__6dd7562__7ee77562[4]),  4,5},
  {&(_tg__ZTV4bb62__6dd7562__7ee77562[4]),  4,6},
  {&(_tg__ZTV5cc562__7ee77562[3]),  3,4},
  {&(_tg__ZTV4bb62__5cc562__7ee77562[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77562[];
extern  VTBL_ENTRY _ZTV7ee77562[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77562[];
static VTBL_ENTRY alt_thunk_names1277[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc5623barEv,_ZTv0_n16_N5cc5623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc5623barEv,_ZThn8_N5cc5623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd75623fooEv,_ZTv0_n12_N6dd75623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623fooEv,_ZThn16_N6dd75623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd75623barEv,_ZTv0_n16_N6dd75623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd75623barEv,_ZThn16_N6dd75623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd75623barEv,_ZThn8_N6dd75623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee775623fooEv,_ZTv0_n12_N7ee775623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee775623fooEv,_ZThn24_N7ee775623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee775623barEv,_ZTv0_n16_N7ee775623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee775623barEv,_ZThn24_N7ee775623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee775623barEv,_ZThn16_N7ee775623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee775623fooEv,_ZTv0_n24_N7ee775623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee775623fooEv,_ZThn8_N7ee775623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee775623barEv,_ZTv0_n20_N7ee775623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee775623barEv,_ZThn8_N7ee775623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77562 = {  "ee77562", // class name
  bases_ee77562, 4,
  &(vtc_ee77562[0]), // expected_vtbl_contents
  &(vtt_ee77562[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77562),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77562),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77562),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1277,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc662  : bb62 {
  int c;
  virtual void  foo(); // _ZN5cc6623fooEv
  virtual void  bar(); // _ZN5cc6623barEv
  ~cc662(); // tgen
  cc662(); // tgen
};
//SIG(-1 cc662) C1{ BC2{ BC3{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  cc662 ::foo(){vfunc_called(this, "_ZN5cc6623fooEv");}
void  cc662 ::bar(){vfunc_called(this, "_ZN5cc6623barEv");}
cc662 ::~cc662(){ note_dtor("cc662", this);} // tgen
cc662 ::cc662(){ note_ctor("cc662", this);} // tgen

static void Test_cc662()
{
  extern Class_Descriptor cd_cc662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_cc662, buf);
    cc662 *dp, &lv = *(dp=new (buf) cc662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(cc662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc662)");
    check_base_class_offset(lv, (aa2*)(bb62*), 0, "cc662");
    check_base_class_offset(lv, (bb62*), 0, "cc662");
    check_field_offset(lv, c, ABISELECT(16,12), "cc662.c");
    test_class_info(&lv, &cd_cc662);
    dp->~cc662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc662(Test_cc662, "cc662", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN5cc662C1Ev();
extern void _ZN5cc662D1Ev();
Name_Map name_map_cc662[] = {
  NSPAIR(_ZN5cc662C1Ev),
  NSPAIR(_ZN5cc662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_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 _ZTI5cc662[];
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_cc662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5cc662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
Class_Descriptor cd_cc662 = {  "cc662", // class name
  bases_cc662, 2,
  &(vtc_cc662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI5cc662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV5cc662),4, //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  dd0662  : cc662 {
  int d;
  ~dd0662(); // tgen
  dd0662(); // tgen
};
//SIG(-1 dd0662) C1{ BC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd0662 ::~dd0662(){ note_dtor("dd0662", this);} // tgen
dd0662 ::dd0662(){ note_ctor("dd0662", this);} // tgen

static void Test_dd0662()
{
  extern Class_Descriptor cd_dd0662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd0662, buf);
    dd0662 *dp, &lv = *(dp=new (buf) dd0662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd0662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), 0, "dd0662");
    check_base_class_offset(lv, (bb62*)(cc662*), 0, "dd0662");
    check_base_class_offset(lv, (cc662*), 0, "dd0662");
    check_field_offset(lv, d, ABISELECT(20,16), "dd0662.d");
    test_class_info(&lv, &cd_dd0662);
    dp->~dd0662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0662(Test_dd0662, "dd0662", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd0662C1Ev();
extern void _ZN6dd0662D1Ev();
Name_Map name_map_dd0662[] = {
  NSPAIR(_ZN6dd0662C1Ev),
  NSPAIR(_ZN6dd0662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd0662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0662[];
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_dd0662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd0662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
Class_Descriptor cd_dd0662 = {  "dd0662", // class name
  bases_dd0662, 3,
  &(vtc_dd0662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd0662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0662),4, //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  ee00662  : dd0662 {
  int e;
  ~ee00662(); // tgen
  ee00662(); // tgen
};
//SIG(1 ee00662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee00662 ::~ee00662(){ note_dtor("ee00662", this);} // tgen
ee00662 ::ee00662(){ note_ctor("ee00662", this);} // tgen

static void Test_ee00662()
{
  extern Class_Descriptor cd_ee00662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee00662, buf);
    ee00662 *dp, &lv = *(dp=new (buf) ee00662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee00662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), 0, "ee00662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), 0, "ee00662");
    check_base_class_offset(lv, (cc662*)(dd0662*), 0, "ee00662");
    check_base_class_offset(lv, (dd0662*), 0, "ee00662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee00662.e");
    test_class_info(&lv, &cd_ee00662);
    dp->~ee00662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00662(Test_ee00662, "ee00662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee00662C1Ev();
extern void _ZN7ee00662D1Ev();
Name_Map name_map_ee00662[] = {
  NSPAIR(_ZN7ee00662C1Ev),
  NSPAIR(_ZN7ee00662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee00662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee00662[];
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee00662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee00662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTI7ee00662[];
extern  VTBL_ENTRY _ZTV7ee00662[];
Class_Descriptor cd_ee00662 = {  "ee00662", // class name
  bases_ee00662, 4,
  &(vtc_ee00662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee00662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00662),4, //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  ee10662  : virtual dd0662 {
  int e;
  ~ee10662(); // tgen
  ee10662(); // tgen
};
//SIG(1 ee10662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee10662 ::~ee10662(){ note_dtor("ee10662", this);} // tgen
ee10662 ::ee10662(){ note_ctor("ee10662", this);} // tgen

static void Test_ee10662()
{
  extern Class_Descriptor cd_ee10662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee10662, buf);
    ee10662 *dp, &lv = *(dp=new (buf) ee10662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee10662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee10662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee10662");
    check_base_class_offset(lv, (cc662*)(dd0662*), ABISELECT(16,8), "ee10662");
    check_base_class_offset(lv, (dd0662*), ABISELECT(16,8), "ee10662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10662.e");
    test_class_info(&lv, &cd_ee10662);
    dp->~ee10662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10662(Test_ee10662, "ee10662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee10662C1Ev();
extern void _ZN7ee10662D1Ev();
Name_Map name_map_ee10662[] = {
  NSPAIR(_ZN7ee10662C1Ev),
  NSPAIR(_ZN7ee10662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee10662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10662[];
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee10662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10662[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee10662[];
static  VTT_ENTRY vtt_ee10662[] = {
  {&(_ZTV7ee10662[3]),  3,9},
  {&(_ZTV7ee10662[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee10662[];
extern  VTBL_ENTRY _ZTV7ee10662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10662[];
Class_Descriptor cd_ee10662 = {  "ee10662", // class name
  bases_ee10662, 4,
  &(vtc_ee10662[0]), // expected_vtbl_contents
  &(vtt_ee10662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee10662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10662),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10662),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  ee20662  : dd0662 {
  int e;
  virtual void  foo(); // _ZN7ee206623fooEv
  ~ee20662(); // tgen
  ee20662(); // tgen
};
//SIG(1 ee20662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee20662 ::foo(){vfunc_called(this, "_ZN7ee206623fooEv");}
ee20662 ::~ee20662(){ note_dtor("ee20662", this);} // tgen
ee20662 ::ee20662(){ note_ctor("ee20662", this);} // tgen

static void Test_ee20662()
{
  extern Class_Descriptor cd_ee20662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee20662, buf);
    ee20662 *dp, &lv = *(dp=new (buf) ee20662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee20662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), 0, "ee20662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), 0, "ee20662");
    check_base_class_offset(lv, (cc662*)(dd0662*), 0, "ee20662");
    check_base_class_offset(lv, (dd0662*), 0, "ee20662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee20662.e");
    test_class_info(&lv, &cd_ee20662);
    dp->~ee20662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20662(Test_ee20662, "ee20662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee20662C1Ev();
extern void _ZN7ee20662D1Ev();
Name_Map name_map_ee20662[] = {
  NSPAIR(_ZN7ee20662C1Ev),
  NSPAIR(_ZN7ee20662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee20662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee20662[];
extern void _ZN7ee206623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee20662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee20662[0]),
  (VTBL_ENTRY)&_ZN7ee206623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTI7ee20662[];
extern  VTBL_ENTRY _ZTV7ee20662[];
Class_Descriptor cd_ee20662 = {  "ee20662", // class name
  bases_ee20662, 4,
  &(vtc_ee20662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee20662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20662),4, //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  ee30662  : virtual dd0662 {
  int e;
  virtual void  foo(); // _ZN7ee306623fooEv
  ~ee30662(); // tgen
  ee30662(); // tgen
};
//SIG(1 ee30662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee30662 ::foo(){vfunc_called(this, "_ZN7ee306623fooEv");}
ee30662 ::~ee30662(){ note_dtor("ee30662", this);} // tgen
ee30662 ::ee30662(){ note_ctor("ee30662", this);} // tgen

static void Test_ee30662()
{
  extern Class_Descriptor cd_ee30662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee30662, buf);
    ee30662 *dp, &lv = *(dp=new (buf) ee30662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee30662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee30662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee30662");
    check_base_class_offset(lv, (cc662*)(dd0662*), ABISELECT(16,8), "ee30662");
    check_base_class_offset(lv, (dd0662*), ABISELECT(16,8), "ee30662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30662.e");
    test_class_info(&lv, &cd_ee30662);
    dp->~ee30662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30662(Test_ee30662, "ee30662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee30662C1Ev();
extern void _ZN7ee30662D1Ev();
Name_Map name_map_ee30662[] = {
  NSPAIR(_ZN7ee30662C1Ev),
  NSPAIR(_ZN7ee30662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee30662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30662[];
extern void _ZN7ee306623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee306623fooEv,_ZTv0_n12_N7ee306623fooEv)();
extern void ABISELECT(_ZThn16_N7ee306623fooEv,_ZThn8_N7ee306623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee30662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30662[0]),
  (VTBL_ENTRY)&_ZN7ee306623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee306623fooEv,_ZTv0_n12_N7ee306623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee30662[];
static  VTT_ENTRY vtt_ee30662[] = {
  {&(_ZTV7ee30662[3]),  3,10},
  {&(_ZTV7ee30662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee30662[];
extern  VTBL_ENTRY _ZTV7ee30662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30662[];
static VTBL_ENTRY alt_thunk_names1278[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee306623fooEv,_ZTv0_n12_N7ee306623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee306623fooEv,_ZThn8_N7ee306623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30662 = {  "ee30662", // class name
  bases_ee30662, 4,
  &(vtc_ee30662[0]), // expected_vtbl_contents
  &(vtt_ee30662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee30662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1278,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40662  : dd0662 {
  int e;
  virtual void  bar(); // _ZN7ee406623barEv
  ~ee40662(); // tgen
  ee40662(); // tgen
};
//SIG(1 ee40662) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee40662 ::bar(){vfunc_called(this, "_ZN7ee406623barEv");}
ee40662 ::~ee40662(){ note_dtor("ee40662", this);} // tgen
ee40662 ::ee40662(){ note_ctor("ee40662", this);} // tgen

static void Test_ee40662()
{
  extern Class_Descriptor cd_ee40662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee40662, buf);
    ee40662 *dp, &lv = *(dp=new (buf) ee40662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee40662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), 0, "ee40662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), 0, "ee40662");
    check_base_class_offset(lv, (cc662*)(dd0662*), 0, "ee40662");
    check_base_class_offset(lv, (dd0662*), 0, "ee40662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee40662.e");
    test_class_info(&lv, &cd_ee40662);
    dp->~ee40662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40662(Test_ee40662, "ee40662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee40662C1Ev();
extern void _ZN7ee40662D1Ev();
Name_Map name_map_ee40662[] = {
  NSPAIR(_ZN7ee40662C1Ev),
  NSPAIR(_ZN7ee40662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee40662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee40662[];
extern void _ZN5cc6623fooEv();
extern void _ZN7ee406623barEv();
static  VTBL_ENTRY vtc_ee40662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee40662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN7ee406623barEv,
};
extern VTBL_ENTRY _ZTI7ee40662[];
extern  VTBL_ENTRY _ZTV7ee40662[];
Class_Descriptor cd_ee40662 = {  "ee40662", // class name
  bases_ee40662, 4,
  &(vtc_ee40662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee40662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40662),4, //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  ee50662  : virtual dd0662 {
  int e;
  virtual void  bar(); // _ZN7ee506623barEv
  ~ee50662(); // tgen
  ee50662(); // tgen
};
//SIG(1 ee50662) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee50662 ::bar(){vfunc_called(this, "_ZN7ee506623barEv");}
ee50662 ::~ee50662(){ note_dtor("ee50662", this);} // tgen
ee50662 ::ee50662(){ note_ctor("ee50662", this);} // tgen

static void Test_ee50662()
{
  extern Class_Descriptor cd_ee50662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee50662, buf);
    ee50662 *dp, &lv = *(dp=new (buf) ee50662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee50662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee50662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee50662");
    check_base_class_offset(lv, (cc662*)(dd0662*), ABISELECT(16,8), "ee50662");
    check_base_class_offset(lv, (dd0662*), ABISELECT(16,8), "ee50662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50662.e");
    test_class_info(&lv, &cd_ee50662);
    dp->~ee50662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50662(Test_ee50662, "ee50662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee50662C1Ev();
extern void _ZN7ee50662D1Ev();
Name_Map name_map_ee50662[] = {
  NSPAIR(_ZN7ee50662C1Ev),
  NSPAIR(_ZN7ee50662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee50662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50662[];
extern void _ZN7ee506623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee506623barEv,_ZTv0_n16_N7ee506623barEv)();
extern void ABISELECT(_ZThn16_N7ee506623barEv,_ZThn8_N7ee506623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50662[0]),
  (VTBL_ENTRY)&_ZN7ee506623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee506623barEv,_ZTv0_n16_N7ee506623barEv),
};
extern VTBL_ENTRY _ZTV7ee50662[];
static  VTT_ENTRY vtt_ee50662[] = {
  {&(_ZTV7ee50662[3]),  3,10},
  {&(_ZTV7ee50662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee50662[];
extern  VTBL_ENTRY _ZTV7ee50662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50662[];
static VTBL_ENTRY alt_thunk_names1279[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee506623barEv,_ZTv0_n16_N7ee506623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee506623barEv,_ZThn8_N7ee506623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50662 = {  "ee50662", // class name
  bases_ee50662, 4,
  &(vtc_ee50662[0]), // expected_vtbl_contents
  &(vtt_ee50662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee50662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1279,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60662  : dd0662 {
  int e;
  virtual void  foo(); // _ZN7ee606623fooEv
  virtual void  bar(); // _ZN7ee606623barEv
  ~ee60662(); // tgen
  ee60662(); // tgen
};
//SIG(1 ee60662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee60662 ::foo(){vfunc_called(this, "_ZN7ee606623fooEv");}
void  ee60662 ::bar(){vfunc_called(this, "_ZN7ee606623barEv");}
ee60662 ::~ee60662(){ note_dtor("ee60662", this);} // tgen
ee60662 ::ee60662(){ note_ctor("ee60662", this);} // tgen

static void Test_ee60662()
{
  extern Class_Descriptor cd_ee60662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee60662, buf);
    ee60662 *dp, &lv = *(dp=new (buf) ee60662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee60662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), 0, "ee60662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), 0, "ee60662");
    check_base_class_offset(lv, (cc662*)(dd0662*), 0, "ee60662");
    check_base_class_offset(lv, (dd0662*), 0, "ee60662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee60662.e");
    test_class_info(&lv, &cd_ee60662);
    dp->~ee60662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60662(Test_ee60662, "ee60662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee60662C1Ev();
extern void _ZN7ee60662D1Ev();
Name_Map name_map_ee60662[] = {
  NSPAIR(_ZN7ee60662C1Ev),
  NSPAIR(_ZN7ee60662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee60662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee60662[];
extern void _ZN7ee606623fooEv();
extern void _ZN7ee606623barEv();
static  VTBL_ENTRY vtc_ee60662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee60662[0]),
  (VTBL_ENTRY)&_ZN7ee606623fooEv,
  (VTBL_ENTRY)&_ZN7ee606623barEv,
};
extern VTBL_ENTRY _ZTI7ee60662[];
extern  VTBL_ENTRY _ZTV7ee60662[];
Class_Descriptor cd_ee60662 = {  "ee60662", // class name
  bases_ee60662, 4,
  &(vtc_ee60662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee60662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60662),4, //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  ee70662  : virtual dd0662 {
  int e;
  virtual void  foo(); // _ZN7ee706623fooEv
  virtual void  bar(); // _ZN7ee706623barEv
  ~ee70662(); // tgen
  ee70662(); // tgen
};
//SIG(1 ee70662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee70662 ::foo(){vfunc_called(this, "_ZN7ee706623fooEv");}
void  ee70662 ::bar(){vfunc_called(this, "_ZN7ee706623barEv");}
ee70662 ::~ee70662(){ note_dtor("ee70662", this);} // tgen
ee70662 ::ee70662(){ note_ctor("ee70662", this);} // tgen

static void Test_ee70662()
{
  extern Class_Descriptor cd_ee70662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee70662, buf);
    ee70662 *dp, &lv = *(dp=new (buf) ee70662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee70662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee70662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd0662*), ABISELECT(16,8), "ee70662");
    check_base_class_offset(lv, (cc662*)(dd0662*), ABISELECT(16,8), "ee70662");
    check_base_class_offset(lv, (dd0662*), ABISELECT(16,8), "ee70662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70662.e");
    test_class_info(&lv, &cd_ee70662);
    dp->~ee70662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70662(Test_ee70662, "ee70662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee70662C1Ev();
extern void _ZN7ee70662D1Ev();
Name_Map name_map_ee70662[] = {
  NSPAIR(_ZN7ee70662C1Ev),
  NSPAIR(_ZN7ee70662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd0662;
extern VTBL_ENTRY _ZTI6dd0662[];
extern  VTBL_ENTRY _ZTV6dd0662[];
static Base_Class bases_ee70662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 0},
  {&cd_dd0662,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70662[];
extern void _ZN7ee706623fooEv();
extern void _ZN7ee706623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee706623fooEv,_ZTv0_n12_N7ee706623fooEv)();
extern void ABISELECT(_ZThn16_N7ee706623fooEv,_ZThn8_N7ee706623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee706623barEv,_ZTv0_n16_N7ee706623barEv)();
extern void ABISELECT(_ZThn16_N7ee706623barEv,_ZThn8_N7ee706623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70662[0]),
  (VTBL_ENTRY)&_ZN7ee706623fooEv,
  (VTBL_ENTRY)&_ZN7ee706623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee706623fooEv,_ZTv0_n12_N7ee706623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee706623barEv,_ZTv0_n16_N7ee706623barEv),
};
extern VTBL_ENTRY _ZTV7ee70662[];
static  VTT_ENTRY vtt_ee70662[] = {
  {&(_ZTV7ee70662[3]),  3,11},
  {&(_ZTV7ee70662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee70662[];
extern  VTBL_ENTRY _ZTV7ee70662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70662[];
static VTBL_ENTRY alt_thunk_names1280[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee706623barEv,_ZTv0_n16_N7ee706623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee706623barEv,_ZThn8_N7ee706623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee706623fooEv,_ZTv0_n12_N7ee706623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee706623fooEv,_ZThn8_N7ee706623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70662 = {  "ee70662", // class name
  bases_ee70662, 4,
  &(vtc_ee70662[0]), // expected_vtbl_contents
  &(vtt_ee70662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee70662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1280,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1662  : virtual cc662 {
  int d;
  ~dd1662(); // tgen
  dd1662(); // tgen
};
//SIG(-1 dd1662) C1{ VBC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd1662 ::~dd1662(){ note_dtor("dd1662", this);} // tgen
dd1662 ::dd1662(){ note_ctor("dd1662", this);} // tgen

static void Test_dd1662()
{
  extern Class_Descriptor cd_dd1662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd1662, buf);
    dd1662 *dp, &lv = *(dp=new (buf) dd1662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd1662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,8), "dd1662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,8), "dd1662");
    check_base_class_offset(lv, (cc662*), ABISELECT(16,8), "dd1662");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1662.d");
    test_class_info(&lv, &cd_dd1662);
    dp->~dd1662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1662(Test_dd1662, "dd1662", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd1662C1Ev();
extern void _ZN6dd1662D1Ev();
Name_Map name_map_dd1662[] = {
  NSPAIR(_ZN6dd1662C1Ev),
  NSPAIR(_ZN6dd1662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd1662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1662[];
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_dd1662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV6dd1662[];
static  VTT_ENTRY vtt_dd1662[] = {
  {&(_ZTV6dd1662[3]),  3,9},
  {&(_ZTV6dd1662[7]),  7,9},
};
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
Class_Descriptor cd_dd1662 = {  "dd1662", // class name
  bases_dd1662, 3,
  &(vtc_dd1662[0]), // expected_vtbl_contents
  &(vtt_dd1662[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd1662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1662),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1662),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  ee01662  : dd1662 {
  int e;
  ~ee01662(); // tgen
  ee01662(); // tgen
};
//SIG(1 ee01662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee01662 ::~ee01662(){ note_dtor("ee01662", this);} // tgen
ee01662 ::ee01662(){ note_ctor("ee01662", this);} // tgen

static void Test_ee01662()
{
  extern Class_Descriptor cd_ee01662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee01662, buf);
    ee01662 *dp, &lv = *(dp=new (buf) ee01662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee01662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee01662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee01662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(16,12), "ee01662");
    check_base_class_offset(lv, (dd1662*), 0, "ee01662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01662.e");
    test_class_info(&lv, &cd_ee01662);
    dp->~ee01662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01662(Test_ee01662, "ee01662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee01662C1Ev();
extern void _ZN7ee01662D1Ev();
Name_Map name_map_ee01662[] = {
  NSPAIR(_ZN7ee01662C1Ev),
  NSPAIR(_ZN7ee01662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee01662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01662[];
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee01662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01662[0]),
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee01662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee01662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee01662[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee01662[] = {
  {&(_ZTV7ee01662[3]),  3,9},
  {&(_tg__ZTV6dd1662__7ee01662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee01662[4]),  4,6},
  {&(_ZTV7ee01662[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee01662[];
extern  VTBL_ENTRY _ZTV7ee01662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01662[];
Class_Descriptor cd_ee01662 = {  "ee01662", // class name
  bases_ee01662, 4,
  &(vtc_ee01662[0]), // expected_vtbl_contents
  &(vtt_ee01662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee01662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01662),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01662),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  ee11662  : virtual dd1662 {
  int e;
  ~ee11662(); // tgen
  ee11662(); // tgen
};
//SIG(1 ee11662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee11662 ::~ee11662(){ note_dtor("ee11662", this);} // tgen
ee11662 ::ee11662(){ note_ctor("ee11662", this);} // tgen

static void Test_ee11662()
{
  extern Class_Descriptor cd_ee11662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee11662, buf);
    ee11662 *dp, &lv = *(dp=new (buf) ee11662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee11662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee11662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee11662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(32,16), "ee11662");
    check_base_class_offset(lv, (dd1662*), ABISELECT(16,8), "ee11662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11662.e");
    test_class_info(&lv, &cd_ee11662);
    dp->~ee11662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11662(Test_ee11662, "ee11662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee11662C1Ev();
extern void _ZN7ee11662D1Ev();
Name_Map name_map_ee11662[] = {
  NSPAIR(_ZN7ee11662C1Ev),
  NSPAIR(_ZN7ee11662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee11662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    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
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee11662[];
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee11662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11662[0]),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11662[0]),
  0,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee11662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee11662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee11662[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee11662[] = {
  {&(_ZTV7ee11662[4]),  4,13},
  {&(_ZTV7ee11662[7]),  7,13},
  {&(_ZTV7ee11662[11]),  11,13},
  {&(_tg__ZTV6dd1662__7ee11662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee11662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11662[];
extern  VTBL_ENTRY _ZTV7ee11662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11662[];
Class_Descriptor cd_ee11662 = {  "ee11662", // class name
  bases_ee11662, 4,
  &(vtc_ee11662[0]), // expected_vtbl_contents
  &(vtt_ee11662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee11662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11662),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11662),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  ee21662  : dd1662 {
  int e;
  virtual void  foo(); // _ZN7ee216623fooEv
  ~ee21662(); // tgen
  ee21662(); // tgen
};
//SIG(1 ee21662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee21662 ::foo(){vfunc_called(this, "_ZN7ee216623fooEv");}
ee21662 ::~ee21662(){ note_dtor("ee21662", this);} // tgen
ee21662 ::ee21662(){ note_ctor("ee21662", this);} // tgen

static void Test_ee21662()
{
  extern Class_Descriptor cd_ee21662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee21662, buf);
    ee21662 *dp, &lv = *(dp=new (buf) ee21662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee21662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee21662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee21662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(16,12), "ee21662");
    check_base_class_offset(lv, (dd1662*), 0, "ee21662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21662.e");
    test_class_info(&lv, &cd_ee21662);
    dp->~ee21662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21662(Test_ee21662, "ee21662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee21662C1Ev();
extern void _ZN7ee21662D1Ev();
Name_Map name_map_ee21662[] = {
  NSPAIR(_ZN7ee21662C1Ev),
  NSPAIR(_ZN7ee21662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee21662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21662[];
extern void _ZN7ee216623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee216623fooEv,_ZTv0_n12_N7ee216623fooEv)();
extern void ABISELECT(_ZThn16_N7ee216623fooEv,_ZThn12_N7ee216623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee21662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21662[0]),
  (VTBL_ENTRY)&_ZN7ee216623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee216623fooEv,_ZTv0_n12_N7ee216623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee21662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee21662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee21662[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee21662[] = {
  {&(_ZTV7ee21662[3]),  3,10},
  {&(_tg__ZTV6dd1662__7ee21662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee21662[4]),  4,6},
  {&(_ZTV7ee21662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee21662[];
extern  VTBL_ENTRY _ZTV7ee21662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21662[];
static VTBL_ENTRY alt_thunk_names1281[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee216623fooEv,_ZTv0_n12_N7ee216623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee216623fooEv,_ZThn12_N7ee216623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21662 = {  "ee21662", // class name
  bases_ee21662, 4,
  &(vtc_ee21662[0]), // expected_vtbl_contents
  &(vtt_ee21662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee21662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1281,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31662  : virtual dd1662 {
  int e;
  virtual void  foo(); // _ZN7ee316623fooEv
  ~ee31662(); // tgen
  ee31662(); // tgen
};
//SIG(1 ee31662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee31662 ::foo(){vfunc_called(this, "_ZN7ee316623fooEv");}
ee31662 ::~ee31662(){ note_dtor("ee31662", this);} // tgen
ee31662 ::ee31662(){ note_ctor("ee31662", this);} // tgen

static void Test_ee31662()
{
  extern Class_Descriptor cd_ee31662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee31662, buf);
    ee31662 *dp, &lv = *(dp=new (buf) ee31662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee31662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee31662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee31662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(32,16), "ee31662");
    check_base_class_offset(lv, (dd1662*), ABISELECT(16,8), "ee31662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31662.e");
    test_class_info(&lv, &cd_ee31662);
    dp->~ee31662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31662(Test_ee31662, "ee31662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee31662C1Ev();
extern void _ZN7ee31662D1Ev();
Name_Map name_map_ee31662[] = {
  NSPAIR(_ZN7ee31662C1Ev),
  NSPAIR(_ZN7ee31662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee31662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31662[];
extern void _ZN7ee316623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee316623fooEv,_ZTv0_n12_N7ee316623fooEv)();
extern void ABISELECT(_ZThn32_N7ee316623fooEv,_ZThn16_N7ee316623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee31662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31662[0]),
  (VTBL_ENTRY)&_ZN7ee316623fooEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31662[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee316623fooEv,_ZTv0_n12_N7ee316623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee31662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee31662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee31662[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee31662[] = {
  {&(_ZTV7ee31662[4]),  4,14},
  {&(_ZTV7ee31662[8]),  8,14},
  {&(_ZTV7ee31662[12]),  12,14},
  {&(_tg__ZTV6dd1662__7ee31662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee31662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31662[];
extern  VTBL_ENTRY _ZTV7ee31662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31662[];
static VTBL_ENTRY alt_thunk_names1282[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee316623fooEv,_ZTv0_n12_N7ee316623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee316623fooEv,_ZThn16_N7ee316623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31662 = {  "ee31662", // class name
  bases_ee31662, 4,
  &(vtc_ee31662[0]), // expected_vtbl_contents
  &(vtt_ee31662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee31662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31662),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1282,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41662  : dd1662 {
  int e;
  virtual void  bar(); // _ZN7ee416623barEv
  ~ee41662(); // tgen
  ee41662(); // tgen
};
//SIG(1 ee41662) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee41662 ::bar(){vfunc_called(this, "_ZN7ee416623barEv");}
ee41662 ::~ee41662(){ note_dtor("ee41662", this);} // tgen
ee41662 ::ee41662(){ note_ctor("ee41662", this);} // tgen

static void Test_ee41662()
{
  extern Class_Descriptor cd_ee41662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee41662, buf);
    ee41662 *dp, &lv = *(dp=new (buf) ee41662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee41662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee41662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee41662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(16,12), "ee41662");
    check_base_class_offset(lv, (dd1662*), 0, "ee41662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41662.e");
    test_class_info(&lv, &cd_ee41662);
    dp->~ee41662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41662(Test_ee41662, "ee41662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee41662C1Ev();
extern void _ZN7ee41662D1Ev();
Name_Map name_map_ee41662[] = {
  NSPAIR(_ZN7ee41662C1Ev),
  NSPAIR(_ZN7ee41662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee41662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41662[];
extern void _ZN7ee416623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee416623barEv,_ZTv0_n16_N7ee416623barEv)();
extern void ABISELECT(_ZThn16_N7ee416623barEv,_ZThn12_N7ee416623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41662[0]),
  (VTBL_ENTRY)&_ZN7ee416623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee416623barEv,_ZTv0_n16_N7ee416623barEv),
};
extern VTBL_ENTRY _ZTV7ee41662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee41662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee41662[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee41662[] = {
  {&(_ZTV7ee41662[3]),  3,10},
  {&(_tg__ZTV6dd1662__7ee41662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee41662[4]),  4,6},
  {&(_ZTV7ee41662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee41662[];
extern  VTBL_ENTRY _ZTV7ee41662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41662[];
static VTBL_ENTRY alt_thunk_names1283[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee416623barEv,_ZTv0_n16_N7ee416623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee416623barEv,_ZThn12_N7ee416623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41662 = {  "ee41662", // class name
  bases_ee41662, 4,
  &(vtc_ee41662[0]), // expected_vtbl_contents
  &(vtt_ee41662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee41662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1283,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51662  : virtual dd1662 {
  int e;
  virtual void  bar(); // _ZN7ee516623barEv
  ~ee51662(); // tgen
  ee51662(); // tgen
};
//SIG(1 ee51662) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee51662 ::bar(){vfunc_called(this, "_ZN7ee516623barEv");}
ee51662 ::~ee51662(){ note_dtor("ee51662", this);} // tgen
ee51662 ::ee51662(){ note_ctor("ee51662", this);} // tgen

static void Test_ee51662()
{
  extern Class_Descriptor cd_ee51662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee51662, buf);
    ee51662 *dp, &lv = *(dp=new (buf) ee51662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee51662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee51662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee51662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(32,16), "ee51662");
    check_base_class_offset(lv, (dd1662*), ABISELECT(16,8), "ee51662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51662.e");
    test_class_info(&lv, &cd_ee51662);
    dp->~ee51662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51662(Test_ee51662, "ee51662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee51662C1Ev();
extern void _ZN7ee51662D1Ev();
Name_Map name_map_ee51662[] = {
  NSPAIR(_ZN7ee51662C1Ev),
  NSPAIR(_ZN7ee51662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee51662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51662[];
extern void _ZN7ee516623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee516623barEv,_ZTv0_n16_N7ee516623barEv)();
extern void ABISELECT(_ZThn32_N7ee516623barEv,_ZThn16_N7ee516623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51662[0]),
  (VTBL_ENTRY)&_ZN7ee516623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51662[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee516623barEv,_ZTv0_n16_N7ee516623barEv),
};
extern VTBL_ENTRY _ZTV7ee51662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee51662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee51662[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee51662[] = {
  {&(_ZTV7ee51662[4]),  4,14},
  {&(_ZTV7ee51662[8]),  8,14},
  {&(_ZTV7ee51662[12]),  12,14},
  {&(_tg__ZTV6dd1662__7ee51662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee51662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51662[];
extern  VTBL_ENTRY _ZTV7ee51662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51662[];
static VTBL_ENTRY alt_thunk_names1284[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee516623barEv,_ZTv0_n16_N7ee516623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee516623barEv,_ZThn16_N7ee516623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51662 = {  "ee51662", // class name
  bases_ee51662, 4,
  &(vtc_ee51662[0]), // expected_vtbl_contents
  &(vtt_ee51662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee51662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51662),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1284,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61662  : dd1662 {
  int e;
  virtual void  foo(); // _ZN7ee616623fooEv
  virtual void  bar(); // _ZN7ee616623barEv
  ~ee61662(); // tgen
  ee61662(); // tgen
};
//SIG(1 ee61662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee61662 ::foo(){vfunc_called(this, "_ZN7ee616623fooEv");}
void  ee61662 ::bar(){vfunc_called(this, "_ZN7ee616623barEv");}
ee61662 ::~ee61662(){ note_dtor("ee61662", this);} // tgen
ee61662 ::ee61662(){ note_ctor("ee61662", this);} // tgen

static void Test_ee61662()
{
  extern Class_Descriptor cd_ee61662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee61662, buf);
    ee61662 *dp, &lv = *(dp=new (buf) ee61662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee61662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee61662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee61662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(16,12), "ee61662");
    check_base_class_offset(lv, (dd1662*), 0, "ee61662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61662.e");
    test_class_info(&lv, &cd_ee61662);
    dp->~ee61662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61662(Test_ee61662, "ee61662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee61662C1Ev();
extern void _ZN7ee61662D1Ev();
Name_Map name_map_ee61662[] = {
  NSPAIR(_ZN7ee61662C1Ev),
  NSPAIR(_ZN7ee61662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee61662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61662[];
extern void _ZN7ee616623fooEv();
extern void _ZN7ee616623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee616623fooEv,_ZTv0_n12_N7ee616623fooEv)();
extern void ABISELECT(_ZThn16_N7ee616623fooEv,_ZThn12_N7ee616623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee616623barEv,_ZTv0_n16_N7ee616623barEv)();
extern void ABISELECT(_ZThn16_N7ee616623barEv,_ZThn12_N7ee616623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61662[0]),
  (VTBL_ENTRY)&_ZN7ee616623fooEv,
  (VTBL_ENTRY)&_ZN7ee616623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee616623fooEv,_ZTv0_n12_N7ee616623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee616623barEv,_ZTv0_n16_N7ee616623barEv),
};
extern VTBL_ENTRY _ZTV7ee61662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee61662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee61662[] = {
  0,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee61662[] = {
  {&(_ZTV7ee61662[3]),  3,11},
  {&(_tg__ZTV6dd1662__7ee61662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee61662[4]),  4,6},
  {&(_ZTV7ee61662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee61662[];
extern  VTBL_ENTRY _ZTV7ee61662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61662[];
static VTBL_ENTRY alt_thunk_names1285[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee616623barEv,_ZTv0_n16_N7ee616623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee616623barEv,_ZThn12_N7ee616623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee616623fooEv,_ZTv0_n12_N7ee616623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee616623fooEv,_ZThn12_N7ee616623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61662 = {  "ee61662", // class name
  bases_ee61662, 4,
  &(vtc_ee61662[0]), // expected_vtbl_contents
  &(vtt_ee61662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee61662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1285,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71662  : virtual dd1662 {
  int e;
  virtual void  foo(); // _ZN7ee716623fooEv
  virtual void  bar(); // _ZN7ee716623barEv
  ~ee71662(); // tgen
  ee71662(); // tgen
};
//SIG(1 ee71662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee71662 ::foo(){vfunc_called(this, "_ZN7ee716623fooEv");}
void  ee71662 ::bar(){vfunc_called(this, "_ZN7ee716623barEv");}
ee71662 ::~ee71662(){ note_dtor("ee71662", this);} // tgen
ee71662 ::ee71662(){ note_ctor("ee71662", this);} // tgen

static void Test_ee71662()
{
  extern Class_Descriptor cd_ee71662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee71662, buf);
    ee71662 *dp, &lv = *(dp=new (buf) ee71662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee71662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee71662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee71662");
    check_base_class_offset(lv, (cc662*)(dd1662*), ABISELECT(32,16), "ee71662");
    check_base_class_offset(lv, (dd1662*), ABISELECT(16,8), "ee71662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71662.e");
    test_class_info(&lv, &cd_ee71662);
    dp->~ee71662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71662(Test_ee71662, "ee71662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee71662C1Ev();
extern void _ZN7ee71662D1Ev();
Name_Map name_map_ee71662[] = {
  NSPAIR(_ZN7ee71662C1Ev),
  NSPAIR(_ZN7ee71662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd1662;
extern VTBL_ENTRY _ZTI6dd1662[];
extern  VTBL_ENTRY _ZTV6dd1662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1662[];
static Base_Class bases_ee71662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd1662,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71662[];
extern void _ZN7ee716623fooEv();
extern void _ZN7ee716623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee716623fooEv,_ZTv0_n12_N7ee716623fooEv)();
extern void ABISELECT(_ZThn32_N7ee716623fooEv,_ZThn16_N7ee716623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee716623barEv,_ZTv0_n16_N7ee716623barEv)();
extern void ABISELECT(_ZThn32_N7ee716623barEv,_ZThn16_N7ee716623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71662[0]),
  (VTBL_ENTRY)&_ZN7ee716623fooEv,
  (VTBL_ENTRY)&_ZN7ee716623barEv,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71662[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee716623fooEv,_ZTv0_n12_N7ee716623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee716623barEv,_ZTv0_n16_N7ee716623barEv),
};
extern VTBL_ENTRY _ZTV7ee71662[];
static  VTBL_ENTRY _tg__ZTV6dd1662__7ee71662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
};
extern void _ZN5cc6623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd1662__7ee71662[] = {
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee71662[] = {
  {&(_ZTV7ee71662[4]),  4,15},
  {&(_ZTV7ee71662[9]),  9,15},
  {&(_ZTV7ee71662[13]),  13,15},
  {&(_tg__ZTV6dd1662__7ee71662[3]),  3,3},
  {&(_tg__ZTV5cc662__6dd1662__7ee71662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71662[];
extern  VTBL_ENTRY _ZTV7ee71662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71662[];
static VTBL_ENTRY alt_thunk_names1286[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee716623barEv,_ZTv0_n16_N7ee716623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee716623barEv,_ZThn16_N7ee716623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee716623fooEv,_ZTv0_n12_N7ee716623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee716623fooEv,_ZThn16_N7ee716623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71662 = {  "ee71662", // class name
  bases_ee71662, 4,
  &(vtc_ee71662[0]), // expected_vtbl_contents
  &(vtt_ee71662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee71662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71662),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1286,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2662  : cc662 {
  int d;
  virtual void  foo(); // _ZN6dd26623fooEv
  ~dd2662(); // tgen
  dd2662(); // tgen
};
//SIG(-1 dd2662) C1{ BC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd2662 ::foo(){vfunc_called(this, "_ZN6dd26623fooEv");}
dd2662 ::~dd2662(){ note_dtor("dd2662", this);} // tgen
dd2662 ::dd2662(){ note_ctor("dd2662", this);} // tgen

static void Test_dd2662()
{
  extern Class_Descriptor cd_dd2662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd2662, buf);
    dd2662 *dp, &lv = *(dp=new (buf) dd2662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd2662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), 0, "dd2662");
    check_base_class_offset(lv, (bb62*)(cc662*), 0, "dd2662");
    check_base_class_offset(lv, (cc662*), 0, "dd2662");
    check_field_offset(lv, d, ABISELECT(20,16), "dd2662.d");
    test_class_info(&lv, &cd_dd2662);
    dp->~dd2662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2662(Test_dd2662, "dd2662", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd2662C1Ev();
extern void _ZN6dd2662D1Ev();
Name_Map name_map_dd2662[] = {
  NSPAIR(_ZN6dd2662C1Ev),
  NSPAIR(_ZN6dd2662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd2662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd2662[];
extern void _ZN6dd26623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_dd2662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd2662[0]),
  (VTBL_ENTRY)&_ZN6dd26623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
Class_Descriptor cd_dd2662 = {  "dd2662", // class name
  bases_dd2662, 3,
  &(vtc_dd2662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd2662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2662),4, //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  ee02662  : dd2662 {
  int e;
  ~ee02662(); // tgen
  ee02662(); // tgen
};
//SIG(1 ee02662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee02662 ::~ee02662(){ note_dtor("ee02662", this);} // tgen
ee02662 ::ee02662(){ note_ctor("ee02662", this);} // tgen

static void Test_ee02662()
{
  extern Class_Descriptor cd_ee02662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee02662, buf);
    ee02662 *dp, &lv = *(dp=new (buf) ee02662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee02662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), 0, "ee02662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), 0, "ee02662");
    check_base_class_offset(lv, (cc662*)(dd2662*), 0, "ee02662");
    check_base_class_offset(lv, (dd2662*), 0, "ee02662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee02662.e");
    test_class_info(&lv, &cd_ee02662);
    dp->~ee02662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02662(Test_ee02662, "ee02662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee02662C1Ev();
extern void _ZN7ee02662D1Ev();
Name_Map name_map_ee02662[] = {
  NSPAIR(_ZN7ee02662C1Ev),
  NSPAIR(_ZN7ee02662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee02662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02662[];
extern void _ZN6dd26623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee02662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee02662[0]),
  (VTBL_ENTRY)&_ZN6dd26623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTI7ee02662[];
extern  VTBL_ENTRY _ZTV7ee02662[];
Class_Descriptor cd_ee02662 = {  "ee02662", // class name
  bases_ee02662, 4,
  &(vtc_ee02662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee02662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02662),4, //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  ee12662  : virtual dd2662 {
  int e;
  ~ee12662(); // tgen
  ee12662(); // tgen
};
//SIG(1 ee12662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee12662 ::~ee12662(){ note_dtor("ee12662", this);} // tgen
ee12662 ::ee12662(){ note_ctor("ee12662", this);} // tgen

static void Test_ee12662()
{
  extern Class_Descriptor cd_ee12662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee12662, buf);
    ee12662 *dp, &lv = *(dp=new (buf) ee12662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee12662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee12662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee12662");
    check_base_class_offset(lv, (cc662*)(dd2662*), ABISELECT(16,8), "ee12662");
    check_base_class_offset(lv, (dd2662*), ABISELECT(16,8), "ee12662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12662.e");
    test_class_info(&lv, &cd_ee12662);
    dp->~ee12662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12662(Test_ee12662, "ee12662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee12662C1Ev();
extern void _ZN7ee12662D1Ev();
Name_Map name_map_ee12662[] = {
  NSPAIR(_ZN7ee12662C1Ev),
  NSPAIR(_ZN7ee12662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee12662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12662[];
extern void _ZN6dd26623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee12662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12662[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12662[0]),
  (VTBL_ENTRY)&_ZN6dd26623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee12662[];
static  VTT_ENTRY vtt_ee12662[] = {
  {&(_ZTV7ee12662[3]),  3,9},
  {&(_ZTV7ee12662[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee12662[];
extern  VTBL_ENTRY _ZTV7ee12662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12662[];
Class_Descriptor cd_ee12662 = {  "ee12662", // class name
  bases_ee12662, 4,
  &(vtc_ee12662[0]), // expected_vtbl_contents
  &(vtt_ee12662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee12662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12662),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12662),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  ee22662  : dd2662 {
  int e;
  virtual void  foo(); // _ZN7ee226623fooEv
  ~ee22662(); // tgen
  ee22662(); // tgen
};
//SIG(1 ee22662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee22662 ::foo(){vfunc_called(this, "_ZN7ee226623fooEv");}
ee22662 ::~ee22662(){ note_dtor("ee22662", this);} // tgen
ee22662 ::ee22662(){ note_ctor("ee22662", this);} // tgen

static void Test_ee22662()
{
  extern Class_Descriptor cd_ee22662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee22662, buf);
    ee22662 *dp, &lv = *(dp=new (buf) ee22662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee22662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), 0, "ee22662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), 0, "ee22662");
    check_base_class_offset(lv, (cc662*)(dd2662*), 0, "ee22662");
    check_base_class_offset(lv, (dd2662*), 0, "ee22662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee22662.e");
    test_class_info(&lv, &cd_ee22662);
    dp->~ee22662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22662(Test_ee22662, "ee22662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee22662C1Ev();
extern void _ZN7ee22662D1Ev();
Name_Map name_map_ee22662[] = {
  NSPAIR(_ZN7ee22662C1Ev),
  NSPAIR(_ZN7ee22662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee22662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee22662[];
extern void _ZN7ee226623fooEv();
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee22662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee22662[0]),
  (VTBL_ENTRY)&_ZN7ee226623fooEv,
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTI7ee22662[];
extern  VTBL_ENTRY _ZTV7ee22662[];
Class_Descriptor cd_ee22662 = {  "ee22662", // class name
  bases_ee22662, 4,
  &(vtc_ee22662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee22662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22662),4, //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  ee32662  : virtual dd2662 {
  int e;
  virtual void  foo(); // _ZN7ee326623fooEv
  ~ee32662(); // tgen
  ee32662(); // tgen
};
//SIG(1 ee32662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee32662 ::foo(){vfunc_called(this, "_ZN7ee326623fooEv");}
ee32662 ::~ee32662(){ note_dtor("ee32662", this);} // tgen
ee32662 ::ee32662(){ note_ctor("ee32662", this);} // tgen

static void Test_ee32662()
{
  extern Class_Descriptor cd_ee32662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee32662, buf);
    ee32662 *dp, &lv = *(dp=new (buf) ee32662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee32662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee32662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee32662");
    check_base_class_offset(lv, (cc662*)(dd2662*), ABISELECT(16,8), "ee32662");
    check_base_class_offset(lv, (dd2662*), ABISELECT(16,8), "ee32662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32662.e");
    test_class_info(&lv, &cd_ee32662);
    dp->~ee32662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32662(Test_ee32662, "ee32662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee32662C1Ev();
extern void _ZN7ee32662D1Ev();
Name_Map name_map_ee32662[] = {
  NSPAIR(_ZN7ee32662C1Ev),
  NSPAIR(_ZN7ee32662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee32662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32662[];
extern void _ZN7ee326623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee326623fooEv,_ZTv0_n12_N7ee326623fooEv)();
extern void ABISELECT(_ZThn16_N7ee326623fooEv,_ZThn8_N7ee326623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee32662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32662[0]),
  (VTBL_ENTRY)&_ZN7ee326623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee326623fooEv,_ZTv0_n12_N7ee326623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee32662[];
static  VTT_ENTRY vtt_ee32662[] = {
  {&(_ZTV7ee32662[3]),  3,10},
  {&(_ZTV7ee32662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee32662[];
extern  VTBL_ENTRY _ZTV7ee32662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32662[];
static VTBL_ENTRY alt_thunk_names1287[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee326623fooEv,_ZTv0_n12_N7ee326623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee326623fooEv,_ZThn8_N7ee326623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32662 = {  "ee32662", // class name
  bases_ee32662, 4,
  &(vtc_ee32662[0]), // expected_vtbl_contents
  &(vtt_ee32662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee32662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1287,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42662  : dd2662 {
  int e;
  virtual void  bar(); // _ZN7ee426623barEv
  ~ee42662(); // tgen
  ee42662(); // tgen
};
//SIG(1 ee42662) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee42662 ::bar(){vfunc_called(this, "_ZN7ee426623barEv");}
ee42662 ::~ee42662(){ note_dtor("ee42662", this);} // tgen
ee42662 ::ee42662(){ note_ctor("ee42662", this);} // tgen

static void Test_ee42662()
{
  extern Class_Descriptor cd_ee42662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee42662, buf);
    ee42662 *dp, &lv = *(dp=new (buf) ee42662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee42662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), 0, "ee42662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), 0, "ee42662");
    check_base_class_offset(lv, (cc662*)(dd2662*), 0, "ee42662");
    check_base_class_offset(lv, (dd2662*), 0, "ee42662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee42662.e");
    test_class_info(&lv, &cd_ee42662);
    dp->~ee42662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42662(Test_ee42662, "ee42662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee42662C1Ev();
extern void _ZN7ee42662D1Ev();
Name_Map name_map_ee42662[] = {
  NSPAIR(_ZN7ee42662C1Ev),
  NSPAIR(_ZN7ee42662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee42662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee42662[];
extern void _ZN6dd26623fooEv();
extern void _ZN7ee426623barEv();
static  VTBL_ENTRY vtc_ee42662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee42662[0]),
  (VTBL_ENTRY)&_ZN6dd26623fooEv,
  (VTBL_ENTRY)&_ZN7ee426623barEv,
};
extern VTBL_ENTRY _ZTI7ee42662[];
extern  VTBL_ENTRY _ZTV7ee42662[];
Class_Descriptor cd_ee42662 = {  "ee42662", // class name
  bases_ee42662, 4,
  &(vtc_ee42662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee42662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42662),4, //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  ee52662  : virtual dd2662 {
  int e;
  virtual void  bar(); // _ZN7ee526623barEv
  ~ee52662(); // tgen
  ee52662(); // tgen
};
//SIG(1 ee52662) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee52662 ::bar(){vfunc_called(this, "_ZN7ee526623barEv");}
ee52662 ::~ee52662(){ note_dtor("ee52662", this);} // tgen
ee52662 ::ee52662(){ note_ctor("ee52662", this);} // tgen

static void Test_ee52662()
{
  extern Class_Descriptor cd_ee52662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee52662, buf);
    ee52662 *dp, &lv = *(dp=new (buf) ee52662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee52662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee52662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee52662");
    check_base_class_offset(lv, (cc662*)(dd2662*), ABISELECT(16,8), "ee52662");
    check_base_class_offset(lv, (dd2662*), ABISELECT(16,8), "ee52662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52662.e");
    test_class_info(&lv, &cd_ee52662);
    dp->~ee52662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52662(Test_ee52662, "ee52662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee52662C1Ev();
extern void _ZN7ee52662D1Ev();
Name_Map name_map_ee52662[] = {
  NSPAIR(_ZN7ee52662C1Ev),
  NSPAIR(_ZN7ee52662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee52662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52662[];
extern void _ZN7ee526623barEv();
extern void _ZN6dd26623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee526623barEv,_ZTv0_n16_N7ee526623barEv)();
extern void ABISELECT(_ZThn16_N7ee526623barEv,_ZThn8_N7ee526623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52662[0]),
  (VTBL_ENTRY)&_ZN7ee526623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52662[0]),
  (VTBL_ENTRY)&_ZN6dd26623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee526623barEv,_ZTv0_n16_N7ee526623barEv),
};
extern VTBL_ENTRY _ZTV7ee52662[];
static  VTT_ENTRY vtt_ee52662[] = {
  {&(_ZTV7ee52662[3]),  3,10},
  {&(_ZTV7ee52662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee52662[];
extern  VTBL_ENTRY _ZTV7ee52662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52662[];
static VTBL_ENTRY alt_thunk_names1288[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee526623barEv,_ZTv0_n16_N7ee526623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee526623barEv,_ZThn8_N7ee526623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52662 = {  "ee52662", // class name
  bases_ee52662, 4,
  &(vtc_ee52662[0]), // expected_vtbl_contents
  &(vtt_ee52662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee52662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1288,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62662  : dd2662 {
  int e;
  virtual void  foo(); // _ZN7ee626623fooEv
  virtual void  bar(); // _ZN7ee626623barEv
  ~ee62662(); // tgen
  ee62662(); // tgen
};
//SIG(1 ee62662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62662 ::foo(){vfunc_called(this, "_ZN7ee626623fooEv");}
void  ee62662 ::bar(){vfunc_called(this, "_ZN7ee626623barEv");}
ee62662 ::~ee62662(){ note_dtor("ee62662", this);} // tgen
ee62662 ::ee62662(){ note_ctor("ee62662", this);} // tgen

static void Test_ee62662()
{
  extern Class_Descriptor cd_ee62662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee62662, buf);
    ee62662 *dp, &lv = *(dp=new (buf) ee62662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee62662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), 0, "ee62662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), 0, "ee62662");
    check_base_class_offset(lv, (cc662*)(dd2662*), 0, "ee62662");
    check_base_class_offset(lv, (dd2662*), 0, "ee62662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee62662.e");
    test_class_info(&lv, &cd_ee62662);
    dp->~ee62662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62662(Test_ee62662, "ee62662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee62662C1Ev();
extern void _ZN7ee62662D1Ev();
Name_Map name_map_ee62662[] = {
  NSPAIR(_ZN7ee62662C1Ev),
  NSPAIR(_ZN7ee62662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee62662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee62662[];
extern void _ZN7ee626623fooEv();
extern void _ZN7ee626623barEv();
static  VTBL_ENTRY vtc_ee62662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee62662[0]),
  (VTBL_ENTRY)&_ZN7ee626623fooEv,
  (VTBL_ENTRY)&_ZN7ee626623barEv,
};
extern VTBL_ENTRY _ZTI7ee62662[];
extern  VTBL_ENTRY _ZTV7ee62662[];
Class_Descriptor cd_ee62662 = {  "ee62662", // class name
  bases_ee62662, 4,
  &(vtc_ee62662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee62662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62662),4, //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  ee72662  : virtual dd2662 {
  int e;
  virtual void  foo(); // _ZN7ee726623fooEv
  virtual void  bar(); // _ZN7ee726623barEv
  ~ee72662(); // tgen
  ee72662(); // tgen
};
//SIG(1 ee72662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72662 ::foo(){vfunc_called(this, "_ZN7ee726623fooEv");}
void  ee72662 ::bar(){vfunc_called(this, "_ZN7ee726623barEv");}
ee72662 ::~ee72662(){ note_dtor("ee72662", this);} // tgen
ee72662 ::ee72662(){ note_ctor("ee72662", this);} // tgen

static void Test_ee72662()
{
  extern Class_Descriptor cd_ee72662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee72662, buf);
    ee72662 *dp, &lv = *(dp=new (buf) ee72662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee72662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee72662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd2662*), ABISELECT(16,8), "ee72662");
    check_base_class_offset(lv, (cc662*)(dd2662*), ABISELECT(16,8), "ee72662");
    check_base_class_offset(lv, (dd2662*), ABISELECT(16,8), "ee72662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72662.e");
    test_class_info(&lv, &cd_ee72662);
    dp->~ee72662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72662(Test_ee72662, "ee72662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee72662C1Ev();
extern void _ZN7ee72662D1Ev();
Name_Map name_map_ee72662[] = {
  NSPAIR(_ZN7ee72662C1Ev),
  NSPAIR(_ZN7ee72662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd2662;
extern VTBL_ENTRY _ZTI6dd2662[];
extern  VTBL_ENTRY _ZTV6dd2662[];
static Base_Class bases_ee72662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2662,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee72662[];
extern void _ZN7ee726623fooEv();
extern void _ZN7ee726623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee726623fooEv,_ZTv0_n12_N7ee726623fooEv)();
extern void ABISELECT(_ZThn16_N7ee726623fooEv,_ZThn8_N7ee726623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee726623barEv,_ZTv0_n16_N7ee726623barEv)();
extern void ABISELECT(_ZThn16_N7ee726623barEv,_ZThn8_N7ee726623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72662[0]),
  (VTBL_ENTRY)&_ZN7ee726623fooEv,
  (VTBL_ENTRY)&_ZN7ee726623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee726623fooEv,_ZTv0_n12_N7ee726623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee726623barEv,_ZTv0_n16_N7ee726623barEv),
};
extern VTBL_ENTRY _ZTV7ee72662[];
static  VTT_ENTRY vtt_ee72662[] = {
  {&(_ZTV7ee72662[3]),  3,11},
  {&(_ZTV7ee72662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee72662[];
extern  VTBL_ENTRY _ZTV7ee72662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72662[];
static VTBL_ENTRY alt_thunk_names1289[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee726623barEv,_ZTv0_n16_N7ee726623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee726623barEv,_ZThn8_N7ee726623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee726623fooEv,_ZTv0_n12_N7ee726623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee726623fooEv,_ZThn8_N7ee726623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72662 = {  "ee72662", // class name
  bases_ee72662, 4,
  &(vtc_ee72662[0]), // expected_vtbl_contents
  &(vtt_ee72662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee72662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1289,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3662  : virtual cc662 {
  int d;
  virtual void  foo(); // _ZN6dd36623fooEv
  ~dd3662(); // tgen
  dd3662(); // tgen
};
//SIG(-1 dd3662) C1{ VBC2{ BC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd3662 ::foo(){vfunc_called(this, "_ZN6dd36623fooEv");}
dd3662 ::~dd3662(){ note_dtor("dd3662", this);} // tgen
dd3662 ::dd3662(){ note_ctor("dd3662", this);} // tgen

static void Test_dd3662()
{
  extern Class_Descriptor cd_dd3662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd3662, buf);
    dd3662 *dp, &lv = *(dp=new (buf) dd3662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd3662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,8), "dd3662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,8), "dd3662");
    check_base_class_offset(lv, (cc662*), ABISELECT(16,8), "dd3662");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3662.d");
    test_class_info(&lv, &cd_dd3662);
    dp->~dd3662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3662(Test_dd3662, "dd3662", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd3662C1Ev();
extern void _ZN6dd3662D1Ev();
Name_Map name_map_dd3662[] = {
  NSPAIR(_ZN6dd3662C1Ev),
  NSPAIR(_ZN6dd3662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd3662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3662[];
extern void _ZN6dd36623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_dd3662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV6dd3662[];
static  VTT_ENTRY vtt_dd3662[] = {
  {&(_ZTV6dd3662[3]),  3,10},
  {&(_ZTV6dd3662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static VTBL_ENTRY alt_thunk_names1290[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3662 = {  "dd3662", // class name
  bases_dd3662, 3,
  &(vtc_dd3662[0]), // expected_vtbl_contents
  &(vtt_dd3662[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd3662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3662),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1290,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03662  : dd3662 {
  int e;
  ~ee03662(); // tgen
  ee03662(); // tgen
};
//SIG(1 ee03662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee03662 ::~ee03662(){ note_dtor("ee03662", this);} // tgen
ee03662 ::ee03662(){ note_ctor("ee03662", this);} // tgen

static void Test_ee03662()
{
  extern Class_Descriptor cd_ee03662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee03662, buf);
    ee03662 *dp, &lv = *(dp=new (buf) ee03662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee03662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee03662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee03662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(16,12), "ee03662");
    check_base_class_offset(lv, (dd3662*), 0, "ee03662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03662.e");
    test_class_info(&lv, &cd_ee03662);
    dp->~ee03662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03662(Test_ee03662, "ee03662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee03662C1Ev();
extern void _ZN7ee03662D1Ev();
Name_Map name_map_ee03662[] = {
  NSPAIR(_ZN7ee03662C1Ev),
  NSPAIR(_ZN7ee03662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee03662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03662[];
extern void _ZN6dd36623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee03662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee03662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee03662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee03662[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee03662[] = {
  {&(_ZTV7ee03662[3]),  3,10},
  {&(_tg__ZTV6dd3662__7ee03662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee03662[4]),  4,6},
  {&(_ZTV7ee03662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee03662[];
extern  VTBL_ENTRY _ZTV7ee03662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03662[];
static VTBL_ENTRY alt_thunk_names1291[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03662 = {  "ee03662", // class name
  bases_ee03662, 4,
  &(vtc_ee03662[0]), // expected_vtbl_contents
  &(vtt_ee03662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee03662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1291,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13662  : virtual dd3662 {
  int e;
  ~ee13662(); // tgen
  ee13662(); // tgen
};
//SIG(1 ee13662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee13662 ::~ee13662(){ note_dtor("ee13662", this);} // tgen
ee13662 ::ee13662(){ note_ctor("ee13662", this);} // tgen

static void Test_ee13662()
{
  extern Class_Descriptor cd_ee13662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee13662, buf);
    ee13662 *dp, &lv = *(dp=new (buf) ee13662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee13662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee13662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee13662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(32,16), "ee13662");
    check_base_class_offset(lv, (dd3662*), ABISELECT(16,8), "ee13662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13662.e");
    test_class_info(&lv, &cd_ee13662);
    dp->~ee13662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13662(Test_ee13662, "ee13662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee13662C1Ev();
extern void _ZN7ee13662D1Ev();
Name_Map name_map_ee13662[] = {
  NSPAIR(_ZN7ee13662C1Ev),
  NSPAIR(_ZN7ee13662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee13662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13662[];
extern void _ZN6dd36623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee13662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13662[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee13662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee13662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee13662[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee13662[] = {
  {&(_ZTV7ee13662[4]),  4,15},
  {&(_ZTV7ee13662[8]),  8,15},
  {&(_ZTV7ee13662[13]),  13,15},
  {&(_tg__ZTV6dd3662__7ee13662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee13662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13662[];
extern  VTBL_ENTRY _ZTV7ee13662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13662[];
static VTBL_ENTRY alt_thunk_names1292[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13662 = {  "ee13662", // class name
  bases_ee13662, 4,
  &(vtc_ee13662[0]), // expected_vtbl_contents
  &(vtt_ee13662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee13662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13662),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1292,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23662  : dd3662 {
  int e;
  virtual void  foo(); // _ZN7ee236623fooEv
  ~ee23662(); // tgen
  ee23662(); // tgen
};
//SIG(1 ee23662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee23662 ::foo(){vfunc_called(this, "_ZN7ee236623fooEv");}
ee23662 ::~ee23662(){ note_dtor("ee23662", this);} // tgen
ee23662 ::ee23662(){ note_ctor("ee23662", this);} // tgen

static void Test_ee23662()
{
  extern Class_Descriptor cd_ee23662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee23662, buf);
    ee23662 *dp, &lv = *(dp=new (buf) ee23662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee23662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee23662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee23662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(16,12), "ee23662");
    check_base_class_offset(lv, (dd3662*), 0, "ee23662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23662.e");
    test_class_info(&lv, &cd_ee23662);
    dp->~ee23662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23662(Test_ee23662, "ee23662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee23662C1Ev();
extern void _ZN7ee23662D1Ev();
Name_Map name_map_ee23662[] = {
  NSPAIR(_ZN7ee23662C1Ev),
  NSPAIR(_ZN7ee23662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee23662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23662[];
extern void _ZN7ee236623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee236623fooEv,_ZTv0_n12_N7ee236623fooEv)();
extern void ABISELECT(_ZThn16_N7ee236623fooEv,_ZThn12_N7ee236623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee23662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23662[0]),
  (VTBL_ENTRY)&_ZN7ee236623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee236623fooEv,_ZTv0_n12_N7ee236623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee23662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee23662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee23662[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee23662[] = {
  {&(_ZTV7ee23662[3]),  3,10},
  {&(_tg__ZTV6dd3662__7ee23662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee23662[4]),  4,6},
  {&(_ZTV7ee23662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee23662[];
extern  VTBL_ENTRY _ZTV7ee23662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23662[];
static VTBL_ENTRY alt_thunk_names1293[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee236623fooEv,_ZTv0_n12_N7ee236623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee236623fooEv,_ZThn12_N7ee236623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23662 = {  "ee23662", // class name
  bases_ee23662, 4,
  &(vtc_ee23662[0]), // expected_vtbl_contents
  &(vtt_ee23662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee23662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1293,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33662  : virtual dd3662 {
  int e;
  virtual void  foo(); // _ZN7ee336623fooEv
  ~ee33662(); // tgen
  ee33662(); // tgen
};
//SIG(1 ee33662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee33662 ::foo(){vfunc_called(this, "_ZN7ee336623fooEv");}
ee33662 ::~ee33662(){ note_dtor("ee33662", this);} // tgen
ee33662 ::ee33662(){ note_ctor("ee33662", this);} // tgen

static void Test_ee33662()
{
  extern Class_Descriptor cd_ee33662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee33662, buf);
    ee33662 *dp, &lv = *(dp=new (buf) ee33662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee33662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee33662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee33662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(32,16), "ee33662");
    check_base_class_offset(lv, (dd3662*), ABISELECT(16,8), "ee33662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33662.e");
    test_class_info(&lv, &cd_ee33662);
    dp->~ee33662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33662(Test_ee33662, "ee33662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee33662C1Ev();
extern void _ZN7ee33662D1Ev();
Name_Map name_map_ee33662[] = {
  NSPAIR(_ZN7ee33662C1Ev),
  NSPAIR(_ZN7ee33662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee33662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33662[];
extern void _ZN7ee336623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee336623fooEv,_ZTv0_n16_N7ee336623fooEv)();
extern void ABISELECT(_ZThn16_N7ee336623fooEv,_ZThn8_N7ee336623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee336623fooEv,_ZTv0_n12_N7ee336623fooEv)();
extern void ABISELECT(_ZThn32_N7ee336623fooEv,_ZThn16_N7ee336623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY vtc_ee33662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33662[0]),
  (VTBL_ENTRY)&_ZN7ee336623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee336623fooEv,_ZTv0_n16_N7ee336623fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee336623fooEv,_ZTv0_n12_N7ee336623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
extern VTBL_ENTRY _ZTV7ee33662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee33662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee33662[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee33662[] = {
  {&(_ZTV7ee33662[4]),  4,16},
  {&(_ZTV7ee33662[9]),  9,16},
  {&(_ZTV7ee33662[14]),  14,16},
  {&(_tg__ZTV6dd3662__7ee33662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee33662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33662[];
extern  VTBL_ENTRY _ZTV7ee33662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33662[];
static VTBL_ENTRY alt_thunk_names1294[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee336623fooEv,_ZTv0_n12_N7ee336623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee336623fooEv,_ZThn16_N7ee336623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee336623fooEv,_ZTv0_n16_N7ee336623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee336623fooEv,_ZThn8_N7ee336623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33662 = {  "ee33662", // class name
  bases_ee33662, 4,
  &(vtc_ee33662[0]), // expected_vtbl_contents
  &(vtt_ee33662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee33662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33662),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1294,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43662  : dd3662 {
  int e;
  virtual void  bar(); // _ZN7ee436623barEv
  ~ee43662(); // tgen
  ee43662(); // tgen
};
//SIG(1 ee43662) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee43662 ::bar(){vfunc_called(this, "_ZN7ee436623barEv");}
ee43662 ::~ee43662(){ note_dtor("ee43662", this);} // tgen
ee43662 ::ee43662(){ note_ctor("ee43662", this);} // tgen

static void Test_ee43662()
{
  extern Class_Descriptor cd_ee43662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee43662, buf);
    ee43662 *dp, &lv = *(dp=new (buf) ee43662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee43662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee43662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee43662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(16,12), "ee43662");
    check_base_class_offset(lv, (dd3662*), 0, "ee43662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43662.e");
    test_class_info(&lv, &cd_ee43662);
    dp->~ee43662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43662(Test_ee43662, "ee43662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee43662C1Ev();
extern void _ZN7ee43662D1Ev();
Name_Map name_map_ee43662[] = {
  NSPAIR(_ZN7ee43662C1Ev),
  NSPAIR(_ZN7ee43662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee43662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43662[];
extern void _ZN6dd36623fooEv();
extern void _ZN7ee436623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee436623barEv,_ZTv0_n16_N7ee436623barEv)();
extern void ABISELECT(_ZThn16_N7ee436623barEv,_ZThn12_N7ee436623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
  (VTBL_ENTRY)&_ZN7ee436623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee436623barEv,_ZTv0_n16_N7ee436623barEv),
};
extern VTBL_ENTRY _ZTV7ee43662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee43662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee43662[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee43662[] = {
  {&(_ZTV7ee43662[3]),  3,11},
  {&(_tg__ZTV6dd3662__7ee43662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee43662[4]),  4,6},
  {&(_ZTV7ee43662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee43662[];
extern  VTBL_ENTRY _ZTV7ee43662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43662[];
static VTBL_ENTRY alt_thunk_names1295[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee436623barEv,_ZTv0_n16_N7ee436623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee436623barEv,_ZThn12_N7ee436623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43662 = {  "ee43662", // class name
  bases_ee43662, 4,
  &(vtc_ee43662[0]), // expected_vtbl_contents
  &(vtt_ee43662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee43662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1295,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53662  : virtual dd3662 {
  int e;
  virtual void  bar(); // _ZN7ee536623barEv
  ~ee53662(); // tgen
  ee53662(); // tgen
};
//SIG(1 ee53662) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee53662 ::bar(){vfunc_called(this, "_ZN7ee536623barEv");}
ee53662 ::~ee53662(){ note_dtor("ee53662", this);} // tgen
ee53662 ::ee53662(){ note_ctor("ee53662", this);} // tgen

static void Test_ee53662()
{
  extern Class_Descriptor cd_ee53662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee53662, buf);
    ee53662 *dp, &lv = *(dp=new (buf) ee53662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee53662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee53662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee53662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(32,16), "ee53662");
    check_base_class_offset(lv, (dd3662*), ABISELECT(16,8), "ee53662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53662.e");
    test_class_info(&lv, &cd_ee53662);
    dp->~ee53662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53662(Test_ee53662, "ee53662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee53662C1Ev();
extern void _ZN7ee53662D1Ev();
Name_Map name_map_ee53662[] = {
  NSPAIR(_ZN7ee53662C1Ev),
  NSPAIR(_ZN7ee53662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee53662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53662[];
extern void _ZN7ee536623barEv();
extern void _ZN6dd36623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee536623barEv,_ZTv0_n16_N7ee536623barEv)();
extern void ABISELECT(_ZThn32_N7ee536623barEv,_ZThn16_N7ee536623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53662[0]),
  (VTBL_ENTRY)&_ZN7ee536623barEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee536623barEv,_ZTv0_n16_N7ee536623barEv),
};
extern VTBL_ENTRY _ZTV7ee53662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee53662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee53662[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee53662[] = {
  {&(_ZTV7ee53662[4]),  4,16},
  {&(_ZTV7ee53662[9]),  9,16},
  {&(_ZTV7ee53662[14]),  14,16},
  {&(_tg__ZTV6dd3662__7ee53662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee53662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53662[];
extern  VTBL_ENTRY _ZTV7ee53662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53662[];
static VTBL_ENTRY alt_thunk_names1296[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee536623barEv,_ZTv0_n16_N7ee536623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee536623barEv,_ZThn16_N7ee536623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53662 = {  "ee53662", // class name
  bases_ee53662, 4,
  &(vtc_ee53662[0]), // expected_vtbl_contents
  &(vtt_ee53662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee53662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53662),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1296,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63662  : dd3662 {
  int e;
  virtual void  foo(); // _ZN7ee636623fooEv
  virtual void  bar(); // _ZN7ee636623barEv
  ~ee63662(); // tgen
  ee63662(); // tgen
};
//SIG(1 ee63662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63662 ::foo(){vfunc_called(this, "_ZN7ee636623fooEv");}
void  ee63662 ::bar(){vfunc_called(this, "_ZN7ee636623barEv");}
ee63662 ::~ee63662(){ note_dtor("ee63662", this);} // tgen
ee63662 ::ee63662(){ note_ctor("ee63662", this);} // tgen

static void Test_ee63662()
{
  extern Class_Descriptor cd_ee63662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee63662, buf);
    ee63662 *dp, &lv = *(dp=new (buf) ee63662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee63662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee63662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee63662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(16,12), "ee63662");
    check_base_class_offset(lv, (dd3662*), 0, "ee63662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63662.e");
    test_class_info(&lv, &cd_ee63662);
    dp->~ee63662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63662(Test_ee63662, "ee63662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee63662C1Ev();
extern void _ZN7ee63662D1Ev();
Name_Map name_map_ee63662[] = {
  NSPAIR(_ZN7ee63662C1Ev),
  NSPAIR(_ZN7ee63662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee63662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63662[];
extern void _ZN7ee636623fooEv();
extern void _ZN7ee636623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee636623fooEv,_ZTv0_n12_N7ee636623fooEv)();
extern void ABISELECT(_ZThn16_N7ee636623fooEv,_ZThn12_N7ee636623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee636623barEv,_ZTv0_n16_N7ee636623barEv)();
extern void ABISELECT(_ZThn16_N7ee636623barEv,_ZThn12_N7ee636623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63662[0]),
  (VTBL_ENTRY)&_ZN7ee636623fooEv,
  (VTBL_ENTRY)&_ZN7ee636623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee636623fooEv,_ZTv0_n12_N7ee636623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee636623barEv,_ZTv0_n16_N7ee636623barEv),
};
extern VTBL_ENTRY _ZTV7ee63662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee63662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee63662[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee63662[] = {
  {&(_ZTV7ee63662[3]),  3,11},
  {&(_tg__ZTV6dd3662__7ee63662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee63662[4]),  4,6},
  {&(_ZTV7ee63662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee63662[];
extern  VTBL_ENTRY _ZTV7ee63662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63662[];
static VTBL_ENTRY alt_thunk_names1297[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn12_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee636623barEv,_ZTv0_n16_N7ee636623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee636623barEv,_ZThn12_N7ee636623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee636623fooEv,_ZTv0_n12_N7ee636623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee636623fooEv,_ZThn12_N7ee636623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63662 = {  "ee63662", // class name
  bases_ee63662, 4,
  &(vtc_ee63662[0]), // expected_vtbl_contents
  &(vtt_ee63662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee63662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1297,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73662  : virtual dd3662 {
  int e;
  virtual void  foo(); // _ZN7ee736623fooEv
  virtual void  bar(); // _ZN7ee736623barEv
  ~ee73662(); // tgen
  ee73662(); // tgen
};
//SIG(1 ee73662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73662 ::foo(){vfunc_called(this, "_ZN7ee736623fooEv");}
void  ee73662 ::bar(){vfunc_called(this, "_ZN7ee736623barEv");}
ee73662 ::~ee73662(){ note_dtor("ee73662", this);} // tgen
ee73662 ::ee73662(){ note_ctor("ee73662", this);} // tgen

static void Test_ee73662()
{
  extern Class_Descriptor cd_ee73662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee73662, buf);
    ee73662 *dp, &lv = *(dp=new (buf) ee73662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee73662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee73662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee73662");
    check_base_class_offset(lv, (cc662*)(dd3662*), ABISELECT(32,16), "ee73662");
    check_base_class_offset(lv, (dd3662*), ABISELECT(16,8), "ee73662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73662.e");
    test_class_info(&lv, &cd_ee73662);
    dp->~ee73662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73662(Test_ee73662, "ee73662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee73662C1Ev();
extern void _ZN7ee73662D1Ev();
Name_Map name_map_ee73662[] = {
  NSPAIR(_ZN7ee73662C1Ev),
  NSPAIR(_ZN7ee73662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd3662;
extern VTBL_ENTRY _ZTI6dd3662[];
extern  VTBL_ENTRY _ZTV6dd3662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3662[];
static Base_Class bases_ee73662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd3662,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73662[];
extern void _ZN7ee736623fooEv();
extern void _ZN7ee736623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee736623fooEv,_ZTv0_n16_N7ee736623fooEv)();
extern void ABISELECT(_ZThn16_N7ee736623fooEv,_ZThn8_N7ee736623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee736623fooEv,_ZTv0_n12_N7ee736623fooEv)();
extern void ABISELECT(_ZThn32_N7ee736623fooEv,_ZThn16_N7ee736623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee736623barEv,_ZTv0_n16_N7ee736623barEv)();
extern void ABISELECT(_ZThn32_N7ee736623barEv,_ZThn16_N7ee736623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73662[0]),
  (VTBL_ENTRY)&_ZN7ee736623fooEv,
  (VTBL_ENTRY)&_ZN7ee736623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee736623fooEv,_ZTv0_n16_N7ee736623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee736623fooEv,_ZTv0_n12_N7ee736623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee736623barEv,_ZTv0_n16_N7ee736623barEv),
};
extern VTBL_ENTRY _ZTV7ee73662[];
extern void _ZN6dd36623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3662__7ee73662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&_ZN6dd36623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv)();
extern void ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv)() __attribute__((weak));
extern void _ZN5cc6623barEv();
static  VTBL_ENTRY _tg__ZTV5cc662__6dd3662__7ee73662[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv),
  (VTBL_ENTRY)&_ZN5cc6623barEv,
};
static  VTT_ENTRY vtt_ee73662[] = {
  {&(_ZTV7ee73662[4]),  4,17},
  {&(_ZTV7ee73662[10]),  10,17},
  {&(_ZTV7ee73662[15]),  15,17},
  {&(_tg__ZTV6dd3662__7ee73662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd3662__7ee73662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73662[];
extern  VTBL_ENTRY _ZTV7ee73662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73662[];
static VTBL_ENTRY alt_thunk_names1298[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd36623fooEv,_ZTv0_n12_N6dd36623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd36623fooEv,_ZThn8_N6dd36623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee736623barEv,_ZTv0_n16_N7ee736623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee736623barEv,_ZThn16_N7ee736623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee736623fooEv,_ZTv0_n12_N7ee736623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee736623fooEv,_ZThn16_N7ee736623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee736623fooEv,_ZTv0_n16_N7ee736623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee736623fooEv,_ZThn8_N7ee736623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73662 = {  "ee73662", // class name
  bases_ee73662, 4,
  &(vtc_ee73662[0]), // expected_vtbl_contents
  &(vtt_ee73662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee73662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73662),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1298,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4662  : cc662 {
  int d;
  virtual void  bar(); // _ZN6dd46623barEv
  ~dd4662(); // tgen
  dd4662(); // tgen
};
//SIG(-1 dd4662) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd4662 ::bar(){vfunc_called(this, "_ZN6dd46623barEv");}
dd4662 ::~dd4662(){ note_dtor("dd4662", this);} // tgen
dd4662 ::dd4662(){ note_ctor("dd4662", this);} // tgen

static void Test_dd4662()
{
  extern Class_Descriptor cd_dd4662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd4662, buf);
    dd4662 *dp, &lv = *(dp=new (buf) dd4662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd4662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), 0, "dd4662");
    check_base_class_offset(lv, (bb62*)(cc662*), 0, "dd4662");
    check_base_class_offset(lv, (cc662*), 0, "dd4662");
    check_field_offset(lv, d, ABISELECT(20,16), "dd4662.d");
    test_class_info(&lv, &cd_dd4662);
    dp->~dd4662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4662(Test_dd4662, "dd4662", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd4662C1Ev();
extern void _ZN6dd4662D1Ev();
Name_Map name_map_dd4662[] = {
  NSPAIR(_ZN6dd4662C1Ev),
  NSPAIR(_ZN6dd4662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd4662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd4662[];
extern void _ZN5cc6623fooEv();
extern void _ZN6dd46623barEv();
static  VTBL_ENTRY vtc_dd4662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd4662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN6dd46623barEv,
};
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
Class_Descriptor cd_dd4662 = {  "dd4662", // class name
  bases_dd4662, 3,
  &(vtc_dd4662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd4662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4662),4, //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  ee04662  : dd4662 {
  int e;
  ~ee04662(); // tgen
  ee04662(); // tgen
};
//SIG(1 ee04662) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee04662 ::~ee04662(){ note_dtor("ee04662", this);} // tgen
ee04662 ::ee04662(){ note_ctor("ee04662", this);} // tgen

static void Test_ee04662()
{
  extern Class_Descriptor cd_ee04662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee04662, buf);
    ee04662 *dp, &lv = *(dp=new (buf) ee04662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee04662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), 0, "ee04662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), 0, "ee04662");
    check_base_class_offset(lv, (cc662*)(dd4662*), 0, "ee04662");
    check_base_class_offset(lv, (dd4662*), 0, "ee04662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee04662.e");
    test_class_info(&lv, &cd_ee04662);
    dp->~ee04662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04662(Test_ee04662, "ee04662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee04662C1Ev();
extern void _ZN7ee04662D1Ev();
Name_Map name_map_ee04662[] = {
  NSPAIR(_ZN7ee04662C1Ev),
  NSPAIR(_ZN7ee04662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee04662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04662[];
extern void _ZN5cc6623fooEv();
extern void _ZN6dd46623barEv();
static  VTBL_ENTRY vtc_ee04662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee04662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN6dd46623barEv,
};
extern VTBL_ENTRY _ZTI7ee04662[];
extern  VTBL_ENTRY _ZTV7ee04662[];
Class_Descriptor cd_ee04662 = {  "ee04662", // class name
  bases_ee04662, 4,
  &(vtc_ee04662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee04662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04662),4, //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  ee14662  : virtual dd4662 {
  int e;
  ~ee14662(); // tgen
  ee14662(); // tgen
};
//SIG(1 ee14662) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee14662 ::~ee14662(){ note_dtor("ee14662", this);} // tgen
ee14662 ::ee14662(){ note_ctor("ee14662", this);} // tgen

static void Test_ee14662()
{
  extern Class_Descriptor cd_ee14662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee14662, buf);
    ee14662 *dp, &lv = *(dp=new (buf) ee14662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee14662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee14662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee14662");
    check_base_class_offset(lv, (cc662*)(dd4662*), ABISELECT(16,8), "ee14662");
    check_base_class_offset(lv, (dd4662*), ABISELECT(16,8), "ee14662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14662.e");
    test_class_info(&lv, &cd_ee14662);
    dp->~ee14662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14662(Test_ee14662, "ee14662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee14662C1Ev();
extern void _ZN7ee14662D1Ev();
Name_Map name_map_ee14662[] = {
  NSPAIR(_ZN7ee14662C1Ev),
  NSPAIR(_ZN7ee14662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee14662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14662[];
extern void _ZN5cc6623fooEv();
extern void _ZN6dd46623barEv();
static  VTBL_ENTRY vtc_ee14662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14662[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN6dd46623barEv,
};
extern VTBL_ENTRY _ZTV7ee14662[];
static  VTT_ENTRY vtt_ee14662[] = {
  {&(_ZTV7ee14662[3]),  3,9},
  {&(_ZTV7ee14662[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee14662[];
extern  VTBL_ENTRY _ZTV7ee14662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14662[];
Class_Descriptor cd_ee14662 = {  "ee14662", // class name
  bases_ee14662, 4,
  &(vtc_ee14662[0]), // expected_vtbl_contents
  &(vtt_ee14662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee14662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14662),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14662),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  ee24662  : dd4662 {
  int e;
  virtual void  foo(); // _ZN7ee246623fooEv
  ~ee24662(); // tgen
  ee24662(); // tgen
};
//SIG(1 ee24662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee24662 ::foo(){vfunc_called(this, "_ZN7ee246623fooEv");}
ee24662 ::~ee24662(){ note_dtor("ee24662", this);} // tgen
ee24662 ::ee24662(){ note_ctor("ee24662", this);} // tgen

static void Test_ee24662()
{
  extern Class_Descriptor cd_ee24662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee24662, buf);
    ee24662 *dp, &lv = *(dp=new (buf) ee24662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee24662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), 0, "ee24662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), 0, "ee24662");
    check_base_class_offset(lv, (cc662*)(dd4662*), 0, "ee24662");
    check_base_class_offset(lv, (dd4662*), 0, "ee24662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee24662.e");
    test_class_info(&lv, &cd_ee24662);
    dp->~ee24662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24662(Test_ee24662, "ee24662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee24662C1Ev();
extern void _ZN7ee24662D1Ev();
Name_Map name_map_ee24662[] = {
  NSPAIR(_ZN7ee24662C1Ev),
  NSPAIR(_ZN7ee24662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee24662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee24662[];
extern void _ZN7ee246623fooEv();
extern void _ZN6dd46623barEv();
static  VTBL_ENTRY vtc_ee24662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee24662[0]),
  (VTBL_ENTRY)&_ZN7ee246623fooEv,
  (VTBL_ENTRY)&_ZN6dd46623barEv,
};
extern VTBL_ENTRY _ZTI7ee24662[];
extern  VTBL_ENTRY _ZTV7ee24662[];
Class_Descriptor cd_ee24662 = {  "ee24662", // class name
  bases_ee24662, 4,
  &(vtc_ee24662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee24662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24662),4, //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  ee34662  : virtual dd4662 {
  int e;
  virtual void  foo(); // _ZN7ee346623fooEv
  ~ee34662(); // tgen
  ee34662(); // tgen
};
//SIG(1 ee34662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee34662 ::foo(){vfunc_called(this, "_ZN7ee346623fooEv");}
ee34662 ::~ee34662(){ note_dtor("ee34662", this);} // tgen
ee34662 ::ee34662(){ note_ctor("ee34662", this);} // tgen

static void Test_ee34662()
{
  extern Class_Descriptor cd_ee34662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee34662, buf);
    ee34662 *dp, &lv = *(dp=new (buf) ee34662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee34662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee34662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee34662");
    check_base_class_offset(lv, (cc662*)(dd4662*), ABISELECT(16,8), "ee34662");
    check_base_class_offset(lv, (dd4662*), ABISELECT(16,8), "ee34662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34662.e");
    test_class_info(&lv, &cd_ee34662);
    dp->~ee34662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34662(Test_ee34662, "ee34662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee34662C1Ev();
extern void _ZN7ee34662D1Ev();
Name_Map name_map_ee34662[] = {
  NSPAIR(_ZN7ee34662C1Ev),
  NSPAIR(_ZN7ee34662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee34662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34662[];
extern void _ZN7ee346623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee346623fooEv,_ZTv0_n12_N7ee346623fooEv)();
extern void ABISELECT(_ZThn16_N7ee346623fooEv,_ZThn8_N7ee346623fooEv)() __attribute__((weak));
extern void _ZN6dd46623barEv();
static  VTBL_ENTRY vtc_ee34662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34662[0]),
  (VTBL_ENTRY)&_ZN7ee346623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee346623fooEv,_ZTv0_n12_N7ee346623fooEv),
  (VTBL_ENTRY)&_ZN6dd46623barEv,
};
extern VTBL_ENTRY _ZTV7ee34662[];
static  VTT_ENTRY vtt_ee34662[] = {
  {&(_ZTV7ee34662[3]),  3,10},
  {&(_ZTV7ee34662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee34662[];
extern  VTBL_ENTRY _ZTV7ee34662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34662[];
static VTBL_ENTRY alt_thunk_names1299[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee346623fooEv,_ZTv0_n12_N7ee346623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee346623fooEv,_ZThn8_N7ee346623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34662 = {  "ee34662", // class name
  bases_ee34662, 4,
  &(vtc_ee34662[0]), // expected_vtbl_contents
  &(vtt_ee34662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee34662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1299,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44662  : dd4662 {
  int e;
  virtual void  bar(); // _ZN7ee446623barEv
  ~ee44662(); // tgen
  ee44662(); // tgen
};
//SIG(1 ee44662) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee44662 ::bar(){vfunc_called(this, "_ZN7ee446623barEv");}
ee44662 ::~ee44662(){ note_dtor("ee44662", this);} // tgen
ee44662 ::ee44662(){ note_ctor("ee44662", this);} // tgen

static void Test_ee44662()
{
  extern Class_Descriptor cd_ee44662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee44662, buf);
    ee44662 *dp, &lv = *(dp=new (buf) ee44662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee44662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), 0, "ee44662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), 0, "ee44662");
    check_base_class_offset(lv, (cc662*)(dd4662*), 0, "ee44662");
    check_base_class_offset(lv, (dd4662*), 0, "ee44662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee44662.e");
    test_class_info(&lv, &cd_ee44662);
    dp->~ee44662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44662(Test_ee44662, "ee44662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee44662C1Ev();
extern void _ZN7ee44662D1Ev();
Name_Map name_map_ee44662[] = {
  NSPAIR(_ZN7ee44662C1Ev),
  NSPAIR(_ZN7ee44662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee44662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee44662[];
extern void _ZN5cc6623fooEv();
extern void _ZN7ee446623barEv();
static  VTBL_ENTRY vtc_ee44662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee44662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&_ZN7ee446623barEv,
};
extern VTBL_ENTRY _ZTI7ee44662[];
extern  VTBL_ENTRY _ZTV7ee44662[];
Class_Descriptor cd_ee44662 = {  "ee44662", // class name
  bases_ee44662, 4,
  &(vtc_ee44662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee44662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44662),4, //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  ee54662  : virtual dd4662 {
  int e;
  virtual void  bar(); // _ZN7ee546623barEv
  ~ee54662(); // tgen
  ee54662(); // tgen
};
//SIG(1 ee54662) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee54662 ::bar(){vfunc_called(this, "_ZN7ee546623barEv");}
ee54662 ::~ee54662(){ note_dtor("ee54662", this);} // tgen
ee54662 ::ee54662(){ note_ctor("ee54662", this);} // tgen

static void Test_ee54662()
{
  extern Class_Descriptor cd_ee54662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee54662, buf);
    ee54662 *dp, &lv = *(dp=new (buf) ee54662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee54662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee54662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee54662");
    check_base_class_offset(lv, (cc662*)(dd4662*), ABISELECT(16,8), "ee54662");
    check_base_class_offset(lv, (dd4662*), ABISELECT(16,8), "ee54662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54662.e");
    test_class_info(&lv, &cd_ee54662);
    dp->~ee54662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54662(Test_ee54662, "ee54662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee54662C1Ev();
extern void _ZN7ee54662D1Ev();
Name_Map name_map_ee54662[] = {
  NSPAIR(_ZN7ee54662C1Ev),
  NSPAIR(_ZN7ee54662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee54662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54662[];
extern void _ZN7ee546623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee546623barEv,_ZTv0_n16_N7ee546623barEv)();
extern void ABISELECT(_ZThn16_N7ee546623barEv,_ZThn8_N7ee546623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54662[0]),
  (VTBL_ENTRY)&_ZN7ee546623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee546623barEv,_ZTv0_n16_N7ee546623barEv),
};
extern VTBL_ENTRY _ZTV7ee54662[];
static  VTT_ENTRY vtt_ee54662[] = {
  {&(_ZTV7ee54662[3]),  3,10},
  {&(_ZTV7ee54662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee54662[];
extern  VTBL_ENTRY _ZTV7ee54662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54662[];
static VTBL_ENTRY alt_thunk_names1300[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee546623barEv,_ZTv0_n16_N7ee546623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee546623barEv,_ZThn8_N7ee546623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54662 = {  "ee54662", // class name
  bases_ee54662, 4,
  &(vtc_ee54662[0]), // expected_vtbl_contents
  &(vtt_ee54662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee54662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1300,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64662  : dd4662 {
  int e;
  virtual void  foo(); // _ZN7ee646623fooEv
  virtual void  bar(); // _ZN7ee646623barEv
  ~ee64662(); // tgen
  ee64662(); // tgen
};
//SIG(1 ee64662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64662 ::foo(){vfunc_called(this, "_ZN7ee646623fooEv");}
void  ee64662 ::bar(){vfunc_called(this, "_ZN7ee646623barEv");}
ee64662 ::~ee64662(){ note_dtor("ee64662", this);} // tgen
ee64662 ::ee64662(){ note_ctor("ee64662", this);} // tgen

static void Test_ee64662()
{
  extern Class_Descriptor cd_ee64662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee64662, buf);
    ee64662 *dp, &lv = *(dp=new (buf) ee64662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee64662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), 0, "ee64662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), 0, "ee64662");
    check_base_class_offset(lv, (cc662*)(dd4662*), 0, "ee64662");
    check_base_class_offset(lv, (dd4662*), 0, "ee64662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee64662.e");
    test_class_info(&lv, &cd_ee64662);
    dp->~ee64662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64662(Test_ee64662, "ee64662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee64662C1Ev();
extern void _ZN7ee64662D1Ev();
Name_Map name_map_ee64662[] = {
  NSPAIR(_ZN7ee64662C1Ev),
  NSPAIR(_ZN7ee64662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee64662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee64662[];
extern void _ZN7ee646623fooEv();
extern void _ZN7ee646623barEv();
static  VTBL_ENTRY vtc_ee64662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee64662[0]),
  (VTBL_ENTRY)&_ZN7ee646623fooEv,
  (VTBL_ENTRY)&_ZN7ee646623barEv,
};
extern VTBL_ENTRY _ZTI7ee64662[];
extern  VTBL_ENTRY _ZTV7ee64662[];
Class_Descriptor cd_ee64662 = {  "ee64662", // class name
  bases_ee64662, 4,
  &(vtc_ee64662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee64662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64662),4, //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  ee74662  : virtual dd4662 {
  int e;
  virtual void  foo(); // _ZN7ee746623fooEv
  virtual void  bar(); // _ZN7ee746623barEv
  ~ee74662(); // tgen
  ee74662(); // tgen
};
//SIG(1 ee74662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74662 ::foo(){vfunc_called(this, "_ZN7ee746623fooEv");}
void  ee74662 ::bar(){vfunc_called(this, "_ZN7ee746623barEv");}
ee74662 ::~ee74662(){ note_dtor("ee74662", this);} // tgen
ee74662 ::ee74662(){ note_ctor("ee74662", this);} // tgen

static void Test_ee74662()
{
  extern Class_Descriptor cd_ee74662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee74662, buf);
    ee74662 *dp, &lv = *(dp=new (buf) ee74662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee74662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee74662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd4662*), ABISELECT(16,8), "ee74662");
    check_base_class_offset(lv, (cc662*)(dd4662*), ABISELECT(16,8), "ee74662");
    check_base_class_offset(lv, (dd4662*), ABISELECT(16,8), "ee74662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74662.e");
    test_class_info(&lv, &cd_ee74662);
    dp->~ee74662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74662(Test_ee74662, "ee74662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee74662C1Ev();
extern void _ZN7ee74662D1Ev();
Name_Map name_map_ee74662[] = {
  NSPAIR(_ZN7ee74662C1Ev),
  NSPAIR(_ZN7ee74662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd4662;
extern VTBL_ENTRY _ZTI6dd4662[];
extern  VTBL_ENTRY _ZTV6dd4662[];
static Base_Class bases_ee74662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4662,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee74662[];
extern void _ZN7ee746623fooEv();
extern void _ZN7ee746623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee746623fooEv,_ZTv0_n12_N7ee746623fooEv)();
extern void ABISELECT(_ZThn16_N7ee746623fooEv,_ZThn8_N7ee746623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee746623barEv,_ZTv0_n16_N7ee746623barEv)();
extern void ABISELECT(_ZThn16_N7ee746623barEv,_ZThn8_N7ee746623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74662[0]),
  (VTBL_ENTRY)&_ZN7ee746623fooEv,
  (VTBL_ENTRY)&_ZN7ee746623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee746623fooEv,_ZTv0_n12_N7ee746623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee746623barEv,_ZTv0_n16_N7ee746623barEv),
};
extern VTBL_ENTRY _ZTV7ee74662[];
static  VTT_ENTRY vtt_ee74662[] = {
  {&(_ZTV7ee74662[3]),  3,11},
  {&(_ZTV7ee74662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee74662[];
extern  VTBL_ENTRY _ZTV7ee74662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74662[];
static VTBL_ENTRY alt_thunk_names1301[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee746623barEv,_ZTv0_n16_N7ee746623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee746623barEv,_ZThn8_N7ee746623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee746623fooEv,_ZTv0_n12_N7ee746623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee746623fooEv,_ZThn8_N7ee746623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74662 = {  "ee74662", // class name
  bases_ee74662, 4,
  &(vtc_ee74662[0]), // expected_vtbl_contents
  &(vtt_ee74662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee74662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1301,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5662  : virtual cc662 {
  int d;
  virtual void  bar(); // _ZN6dd56623barEv
  ~dd5662(); // tgen
  dd5662(); // tgen
};
//SIG(-1 dd5662) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd5662 ::bar(){vfunc_called(this, "_ZN6dd56623barEv");}
dd5662 ::~dd5662(){ note_dtor("dd5662", this);} // tgen
dd5662 ::dd5662(){ note_ctor("dd5662", this);} // tgen

static void Test_dd5662()
{
  extern Class_Descriptor cd_dd5662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd5662, buf);
    dd5662 *dp, &lv = *(dp=new (buf) dd5662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd5662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,8), "dd5662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,8), "dd5662");
    check_base_class_offset(lv, (cc662*), ABISELECT(16,8), "dd5662");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5662.d");
    test_class_info(&lv, &cd_dd5662);
    dp->~dd5662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5662(Test_dd5662, "dd5662", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd5662C1Ev();
extern void _ZN6dd5662D1Ev();
Name_Map name_map_dd5662[] = {
  NSPAIR(_ZN6dd5662C1Ev),
  NSPAIR(_ZN6dd5662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd5662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5662[];
extern void _ZN6dd56623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
extern VTBL_ENTRY _ZTV6dd5662[];
static  VTT_ENTRY vtt_dd5662[] = {
  {&(_ZTV6dd5662[3]),  3,10},
  {&(_ZTV6dd5662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static VTBL_ENTRY alt_thunk_names1302[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5662 = {  "dd5662", // class name
  bases_dd5662, 3,
  &(vtc_dd5662[0]), // expected_vtbl_contents
  &(vtt_dd5662[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd5662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5662),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1302,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05662  : dd5662 {
  int e;
  ~ee05662(); // tgen
  ee05662(); // tgen
};
//SIG(1 ee05662) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee05662 ::~ee05662(){ note_dtor("ee05662", this);} // tgen
ee05662 ::ee05662(){ note_ctor("ee05662", this);} // tgen

static void Test_ee05662()
{
  extern Class_Descriptor cd_ee05662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee05662, buf);
    ee05662 *dp, &lv = *(dp=new (buf) ee05662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee05662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee05662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee05662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(16,12), "ee05662");
    check_base_class_offset(lv, (dd5662*), 0, "ee05662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05662.e");
    test_class_info(&lv, &cd_ee05662);
    dp->~ee05662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05662(Test_ee05662, "ee05662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee05662C1Ev();
extern void _ZN7ee05662D1Ev();
Name_Map name_map_ee05662[] = {
  NSPAIR(_ZN7ee05662C1Ev),
  NSPAIR(_ZN7ee05662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee05662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05662[];
extern void _ZN6dd56623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
extern VTBL_ENTRY _ZTV7ee05662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee05662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee05662[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee05662[] = {
  {&(_ZTV7ee05662[3]),  3,10},
  {&(_tg__ZTV6dd5662__7ee05662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee05662[4]),  4,6},
  {&(_ZTV7ee05662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee05662[];
extern  VTBL_ENTRY _ZTV7ee05662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05662[];
static VTBL_ENTRY alt_thunk_names1303[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05662 = {  "ee05662", // class name
  bases_ee05662, 4,
  &(vtc_ee05662[0]), // expected_vtbl_contents
  &(vtt_ee05662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee05662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1303,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15662  : virtual dd5662 {
  int e;
  ~ee15662(); // tgen
  ee15662(); // tgen
};
//SIG(1 ee15662) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee15662 ::~ee15662(){ note_dtor("ee15662", this);} // tgen
ee15662 ::ee15662(){ note_ctor("ee15662", this);} // tgen

static void Test_ee15662()
{
  extern Class_Descriptor cd_ee15662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee15662, buf);
    ee15662 *dp, &lv = *(dp=new (buf) ee15662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee15662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee15662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee15662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(32,16), "ee15662");
    check_base_class_offset(lv, (dd5662*), ABISELECT(16,8), "ee15662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15662.e");
    test_class_info(&lv, &cd_ee15662);
    dp->~ee15662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15662(Test_ee15662, "ee15662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee15662C1Ev();
extern void _ZN7ee15662D1Ev();
Name_Map name_map_ee15662[] = {
  NSPAIR(_ZN7ee15662C1Ev),
  NSPAIR(_ZN7ee15662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee15662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15662[];
extern void _ZN6dd56623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15662[0]),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
extern VTBL_ENTRY _ZTV7ee15662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee15662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee15662[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee15662[] = {
  {&(_ZTV7ee15662[4]),  4,15},
  {&(_ZTV7ee15662[8]),  8,15},
  {&(_ZTV7ee15662[13]),  13,15},
  {&(_tg__ZTV6dd5662__7ee15662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee15662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15662[];
extern  VTBL_ENTRY _ZTV7ee15662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15662[];
static VTBL_ENTRY alt_thunk_names1304[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15662 = {  "ee15662", // class name
  bases_ee15662, 4,
  &(vtc_ee15662[0]), // expected_vtbl_contents
  &(vtt_ee15662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee15662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15662),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1304,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25662  : dd5662 {
  int e;
  virtual void  foo(); // _ZN7ee256623fooEv
  ~ee25662(); // tgen
  ee25662(); // tgen
};
//SIG(1 ee25662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee25662 ::foo(){vfunc_called(this, "_ZN7ee256623fooEv");}
ee25662 ::~ee25662(){ note_dtor("ee25662", this);} // tgen
ee25662 ::ee25662(){ note_ctor("ee25662", this);} // tgen

static void Test_ee25662()
{
  extern Class_Descriptor cd_ee25662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee25662, buf);
    ee25662 *dp, &lv = *(dp=new (buf) ee25662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee25662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee25662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee25662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(16,12), "ee25662");
    check_base_class_offset(lv, (dd5662*), 0, "ee25662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25662.e");
    test_class_info(&lv, &cd_ee25662);
    dp->~ee25662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25662(Test_ee25662, "ee25662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee25662C1Ev();
extern void _ZN7ee25662D1Ev();
Name_Map name_map_ee25662[] = {
  NSPAIR(_ZN7ee25662C1Ev),
  NSPAIR(_ZN7ee25662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee25662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25662[];
extern void _ZN6dd56623barEv();
extern void _ZN7ee256623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee256623fooEv,_ZTv0_n12_N7ee256623fooEv)();
extern void ABISELECT(_ZThn16_N7ee256623fooEv,_ZThn12_N7ee256623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
  (VTBL_ENTRY)&_ZN7ee256623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee256623fooEv,_ZTv0_n12_N7ee256623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
extern VTBL_ENTRY _ZTV7ee25662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee25662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee25662[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee25662[] = {
  {&(_ZTV7ee25662[3]),  3,11},
  {&(_tg__ZTV6dd5662__7ee25662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee25662[4]),  4,6},
  {&(_ZTV7ee25662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee25662[];
extern  VTBL_ENTRY _ZTV7ee25662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25662[];
static VTBL_ENTRY alt_thunk_names1305[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee256623fooEv,_ZTv0_n12_N7ee256623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee256623fooEv,_ZThn12_N7ee256623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25662 = {  "ee25662", // class name
  bases_ee25662, 4,
  &(vtc_ee25662[0]), // expected_vtbl_contents
  &(vtt_ee25662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee25662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1305,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35662  : virtual dd5662 {
  int e;
  virtual void  foo(); // _ZN7ee356623fooEv
  ~ee35662(); // tgen
  ee35662(); // tgen
};
//SIG(1 ee35662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee35662 ::foo(){vfunc_called(this, "_ZN7ee356623fooEv");}
ee35662 ::~ee35662(){ note_dtor("ee35662", this);} // tgen
ee35662 ::ee35662(){ note_ctor("ee35662", this);} // tgen

static void Test_ee35662()
{
  extern Class_Descriptor cd_ee35662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee35662, buf);
    ee35662 *dp, &lv = *(dp=new (buf) ee35662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee35662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee35662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee35662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(32,16), "ee35662");
    check_base_class_offset(lv, (dd5662*), ABISELECT(16,8), "ee35662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35662.e");
    test_class_info(&lv, &cd_ee35662);
    dp->~ee35662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35662(Test_ee35662, "ee35662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee35662C1Ev();
extern void _ZN7ee35662D1Ev();
Name_Map name_map_ee35662[] = {
  NSPAIR(_ZN7ee35662C1Ev),
  NSPAIR(_ZN7ee35662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee35662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35662[];
extern void _ZN7ee356623fooEv();
extern void _ZN6dd56623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee356623fooEv,_ZTv0_n12_N7ee356623fooEv)();
extern void ABISELECT(_ZThn32_N7ee356623fooEv,_ZThn16_N7ee356623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35662[0]),
  (VTBL_ENTRY)&_ZN7ee356623fooEv,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee356623fooEv,_ZTv0_n12_N7ee356623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
extern VTBL_ENTRY _ZTV7ee35662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee35662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee35662[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee35662[] = {
  {&(_ZTV7ee35662[4]),  4,16},
  {&(_ZTV7ee35662[9]),  9,16},
  {&(_ZTV7ee35662[14]),  14,16},
  {&(_tg__ZTV6dd5662__7ee35662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee35662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35662[];
extern  VTBL_ENTRY _ZTV7ee35662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35662[];
static VTBL_ENTRY alt_thunk_names1306[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee356623fooEv,_ZTv0_n12_N7ee356623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee356623fooEv,_ZThn16_N7ee356623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35662 = {  "ee35662", // class name
  bases_ee35662, 4,
  &(vtc_ee35662[0]), // expected_vtbl_contents
  &(vtt_ee35662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee35662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35662),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1306,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45662  : dd5662 {
  int e;
  virtual void  bar(); // _ZN7ee456623barEv
  ~ee45662(); // tgen
  ee45662(); // tgen
};
//SIG(1 ee45662) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee45662 ::bar(){vfunc_called(this, "_ZN7ee456623barEv");}
ee45662 ::~ee45662(){ note_dtor("ee45662", this);} // tgen
ee45662 ::ee45662(){ note_ctor("ee45662", this);} // tgen

static void Test_ee45662()
{
  extern Class_Descriptor cd_ee45662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee45662, buf);
    ee45662 *dp, &lv = *(dp=new (buf) ee45662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee45662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee45662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee45662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(16,12), "ee45662");
    check_base_class_offset(lv, (dd5662*), 0, "ee45662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45662.e");
    test_class_info(&lv, &cd_ee45662);
    dp->~ee45662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45662(Test_ee45662, "ee45662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee45662C1Ev();
extern void _ZN7ee45662D1Ev();
Name_Map name_map_ee45662[] = {
  NSPAIR(_ZN7ee45662C1Ev),
  NSPAIR(_ZN7ee45662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee45662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45662[];
extern void _ZN7ee456623barEv();
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee456623barEv,_ZTv0_n16_N7ee456623barEv)();
extern void ABISELECT(_ZThn16_N7ee456623barEv,_ZThn12_N7ee456623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45662[0]),
  (VTBL_ENTRY)&_ZN7ee456623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee456623barEv,_ZTv0_n16_N7ee456623barEv),
};
extern VTBL_ENTRY _ZTV7ee45662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee45662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee45662[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee45662[] = {
  {&(_ZTV7ee45662[3]),  3,10},
  {&(_tg__ZTV6dd5662__7ee45662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee45662[4]),  4,6},
  {&(_ZTV7ee45662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee45662[];
extern  VTBL_ENTRY _ZTV7ee45662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45662[];
static VTBL_ENTRY alt_thunk_names1307[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee456623barEv,_ZTv0_n16_N7ee456623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee456623barEv,_ZThn12_N7ee456623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45662 = {  "ee45662", // class name
  bases_ee45662, 4,
  &(vtc_ee45662[0]), // expected_vtbl_contents
  &(vtt_ee45662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee45662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1307,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55662  : virtual dd5662 {
  int e;
  virtual void  bar(); // _ZN7ee556623barEv
  ~ee55662(); // tgen
  ee55662(); // tgen
};
//SIG(1 ee55662) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee55662 ::bar(){vfunc_called(this, "_ZN7ee556623barEv");}
ee55662 ::~ee55662(){ note_dtor("ee55662", this);} // tgen
ee55662 ::ee55662(){ note_ctor("ee55662", this);} // tgen

static void Test_ee55662()
{
  extern Class_Descriptor cd_ee55662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee55662, buf);
    ee55662 *dp, &lv = *(dp=new (buf) ee55662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee55662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee55662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee55662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(32,16), "ee55662");
    check_base_class_offset(lv, (dd5662*), ABISELECT(16,8), "ee55662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55662.e");
    test_class_info(&lv, &cd_ee55662);
    dp->~ee55662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55662(Test_ee55662, "ee55662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee55662C1Ev();
extern void _ZN7ee55662D1Ev();
Name_Map name_map_ee55662[] = {
  NSPAIR(_ZN7ee55662C1Ev),
  NSPAIR(_ZN7ee55662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee55662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55662[];
extern void _ZN7ee556623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee556623barEv,_ZTv0_n16_N7ee556623barEv)();
extern void ABISELECT(_ZThn16_N7ee556623barEv,_ZThn8_N7ee556623barEv)() __attribute__((weak));
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee556623barEv,_ZTv0_n16_N7ee556623barEv)();
extern void ABISELECT(_ZThn32_N7ee556623barEv,_ZThn16_N7ee556623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55662[0]),
  (VTBL_ENTRY)&_ZN7ee556623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee556623barEv,_ZTv0_n16_N7ee556623barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee556623barEv,_ZTv0_n16_N7ee556623barEv),
};
extern VTBL_ENTRY _ZTV7ee55662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee55662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee55662[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee55662[] = {
  {&(_ZTV7ee55662[4]),  4,16},
  {&(_ZTV7ee55662[9]),  9,16},
  {&(_ZTV7ee55662[14]),  14,16},
  {&(_tg__ZTV6dd5662__7ee55662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee55662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55662[];
extern  VTBL_ENTRY _ZTV7ee55662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55662[];
static VTBL_ENTRY alt_thunk_names1308[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee556623barEv,_ZTv0_n16_N7ee556623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee556623barEv,_ZThn16_N7ee556623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee556623barEv,_ZThn8_N7ee556623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55662 = {  "ee55662", // class name
  bases_ee55662, 4,
  &(vtc_ee55662[0]), // expected_vtbl_contents
  &(vtt_ee55662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee55662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55662),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1308,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65662  : dd5662 {
  int e;
  virtual void  foo(); // _ZN7ee656623fooEv
  virtual void  bar(); // _ZN7ee656623barEv
  ~ee65662(); // tgen
  ee65662(); // tgen
};
//SIG(1 ee65662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65662 ::foo(){vfunc_called(this, "_ZN7ee656623fooEv");}
void  ee65662 ::bar(){vfunc_called(this, "_ZN7ee656623barEv");}
ee65662 ::~ee65662(){ note_dtor("ee65662", this);} // tgen
ee65662 ::ee65662(){ note_ctor("ee65662", this);} // tgen

static void Test_ee65662()
{
  extern Class_Descriptor cd_ee65662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee65662, buf);
    ee65662 *dp, &lv = *(dp=new (buf) ee65662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee65662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee65662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee65662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(16,12), "ee65662");
    check_base_class_offset(lv, (dd5662*), 0, "ee65662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65662.e");
    test_class_info(&lv, &cd_ee65662);
    dp->~ee65662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65662(Test_ee65662, "ee65662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee65662C1Ev();
extern void _ZN7ee65662D1Ev();
Name_Map name_map_ee65662[] = {
  NSPAIR(_ZN7ee65662C1Ev),
  NSPAIR(_ZN7ee65662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee65662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65662[];
extern void _ZN7ee656623barEv();
extern void _ZN7ee656623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee656623fooEv,_ZTv0_n12_N7ee656623fooEv)();
extern void ABISELECT(_ZThn16_N7ee656623fooEv,_ZThn12_N7ee656623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee656623barEv,_ZTv0_n16_N7ee656623barEv)();
extern void ABISELECT(_ZThn16_N7ee656623barEv,_ZThn12_N7ee656623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65662[0]),
  (VTBL_ENTRY)&_ZN7ee656623barEv,
  (VTBL_ENTRY)&_ZN7ee656623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee656623fooEv,_ZTv0_n12_N7ee656623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee656623barEv,_ZTv0_n16_N7ee656623barEv),
};
extern VTBL_ENTRY _ZTV7ee65662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee65662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee65662[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee65662[] = {
  {&(_ZTV7ee65662[3]),  3,11},
  {&(_tg__ZTV6dd5662__7ee65662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee65662[4]),  4,6},
  {&(_ZTV7ee65662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee65662[];
extern  VTBL_ENTRY _ZTV7ee65662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65662[];
static VTBL_ENTRY alt_thunk_names1309[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn12_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee656623barEv,_ZTv0_n16_N7ee656623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee656623barEv,_ZThn12_N7ee656623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee656623fooEv,_ZTv0_n12_N7ee656623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee656623fooEv,_ZThn12_N7ee656623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65662 = {  "ee65662", // class name
  bases_ee65662, 4,
  &(vtc_ee65662[0]), // expected_vtbl_contents
  &(vtt_ee65662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee65662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1309,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75662  : virtual dd5662 {
  int e;
  virtual void  foo(); // _ZN7ee756623fooEv
  virtual void  bar(); // _ZN7ee756623barEv
  ~ee75662(); // tgen
  ee75662(); // tgen
};
//SIG(1 ee75662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75662 ::foo(){vfunc_called(this, "_ZN7ee756623fooEv");}
void  ee75662 ::bar(){vfunc_called(this, "_ZN7ee756623barEv");}
ee75662 ::~ee75662(){ note_dtor("ee75662", this);} // tgen
ee75662 ::ee75662(){ note_ctor("ee75662", this);} // tgen

static void Test_ee75662()
{
  extern Class_Descriptor cd_ee75662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee75662, buf);
    ee75662 *dp, &lv = *(dp=new (buf) ee75662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee75662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee75662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee75662");
    check_base_class_offset(lv, (cc662*)(dd5662*), ABISELECT(32,16), "ee75662");
    check_base_class_offset(lv, (dd5662*), ABISELECT(16,8), "ee75662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75662.e");
    test_class_info(&lv, &cd_ee75662);
    dp->~ee75662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75662(Test_ee75662, "ee75662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee75662C1Ev();
extern void _ZN7ee75662D1Ev();
Name_Map name_map_ee75662[] = {
  NSPAIR(_ZN7ee75662C1Ev),
  NSPAIR(_ZN7ee75662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd5662;
extern VTBL_ENTRY _ZTI6dd5662[];
extern  VTBL_ENTRY _ZTV6dd5662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5662[];
static Base_Class bases_ee75662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd5662,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75662[];
extern void _ZN7ee756623fooEv();
extern void _ZN7ee756623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee756623barEv,_ZTv0_n16_N7ee756623barEv)();
extern void ABISELECT(_ZThn16_N7ee756623barEv,_ZThn8_N7ee756623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee756623fooEv,_ZTv0_n12_N7ee756623fooEv)();
extern void ABISELECT(_ZThn32_N7ee756623fooEv,_ZThn16_N7ee756623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee756623barEv,_ZTv0_n16_N7ee756623barEv)();
extern void ABISELECT(_ZThn32_N7ee756623barEv,_ZThn16_N7ee756623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75662[0]),
  (VTBL_ENTRY)&_ZN7ee756623fooEv,
  (VTBL_ENTRY)&_ZN7ee756623barEv,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee756623barEv,_ZTv0_n16_N7ee756623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee756623fooEv,_ZTv0_n12_N7ee756623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee756623barEv,_ZTv0_n16_N7ee756623barEv),
};
extern VTBL_ENTRY _ZTV7ee75662[];
extern void _ZN6dd56623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5662__7ee75662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN6dd56623barEv,
};
extern void _ZN5cc6623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv)();
extern void ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd5662__7ee75662[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5662[0]),
  (VTBL_ENTRY)&_ZN5cc6623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv),
};
static  VTT_ENTRY vtt_ee75662[] = {
  {&(_ZTV7ee75662[4]),  4,17},
  {&(_ZTV7ee75662[10]),  10,17},
  {&(_ZTV7ee75662[15]),  15,17},
  {&(_tg__ZTV6dd5662__7ee75662[3]),  3,4},
  {&(_tg__ZTV5cc662__6dd5662__7ee75662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75662[];
extern  VTBL_ENTRY _ZTV7ee75662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75662[];
static VTBL_ENTRY alt_thunk_names1310[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd56623barEv,_ZTv0_n16_N6dd56623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd56623barEv,_ZThn8_N6dd56623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee756623fooEv,_ZTv0_n12_N7ee756623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee756623fooEv,_ZThn16_N7ee756623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee756623barEv,_ZTv0_n16_N7ee756623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee756623barEv,_ZThn16_N7ee756623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee756623barEv,_ZThn8_N7ee756623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75662 = {  "ee75662", // class name
  bases_ee75662, 4,
  &(vtc_ee75662[0]), // expected_vtbl_contents
  &(vtt_ee75662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee75662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75662),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1310,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6662  : cc662 {
  int d;
  virtual void  bar(); // _ZN6dd66623barEv
  virtual void  foo(); // _ZN6dd66623fooEv
  ~dd6662(); // tgen
  dd6662(); // tgen
};
//SIG(-1 dd6662) C1{ BC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd6662 ::bar(){vfunc_called(this, "_ZN6dd66623barEv");}
void  dd6662 ::foo(){vfunc_called(this, "_ZN6dd66623fooEv");}
dd6662 ::~dd6662(){ note_dtor("dd6662", this);} // tgen
dd6662 ::dd6662(){ note_ctor("dd6662", this);} // tgen

static void Test_dd6662()
{
  extern Class_Descriptor cd_dd6662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,6)];
    init_test(&cd_dd6662, buf);
    dd6662 *dp, &lv = *(dp=new (buf) dd6662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,20), "sizeof(dd6662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), 0, "dd6662");
    check_base_class_offset(lv, (bb62*)(cc662*), 0, "dd6662");
    check_base_class_offset(lv, (cc662*), 0, "dd6662");
    check_field_offset(lv, d, ABISELECT(20,16), "dd6662.d");
    test_class_info(&lv, &cd_dd6662);
    dp->~dd6662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6662(Test_dd6662, "dd6662", ABISELECT(24,20));

#else // __cplusplus

extern void _ZN6dd6662C1Ev();
extern void _ZN6dd6662D1Ev();
Name_Map name_map_dd6662[] = {
  NSPAIR(_ZN6dd6662C1Ev),
  NSPAIR(_ZN6dd6662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd6662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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 _ZTI6dd6662[];
extern void _ZN6dd66623fooEv();
extern void _ZN6dd66623barEv();
static  VTBL_ENTRY vtc_dd6662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6dd6662[0]),
  (VTBL_ENTRY)&_ZN6dd66623fooEv,
  (VTBL_ENTRY)&_ZN6dd66623barEv,
};
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
Class_Descriptor cd_dd6662 = {  "dd6662", // class name
  bases_dd6662, 3,
  &(vtc_dd6662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,20), // object size
  NSPAIRA(_ZTI6dd6662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6662),4, //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  ee06662  : dd6662 {
  int e;
  ~ee06662(); // tgen
  ee06662(); // tgen
};
//SIG(1 ee06662) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee06662 ::~ee06662(){ note_dtor("ee06662", this);} // tgen
ee06662 ::ee06662(){ note_ctor("ee06662", this);} // tgen

static void Test_ee06662()
{
  extern Class_Descriptor cd_ee06662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee06662, buf);
    ee06662 *dp, &lv = *(dp=new (buf) ee06662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee06662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), 0, "ee06662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), 0, "ee06662");
    check_base_class_offset(lv, (cc662*)(dd6662*), 0, "ee06662");
    check_base_class_offset(lv, (dd6662*), 0, "ee06662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee06662.e");
    test_class_info(&lv, &cd_ee06662);
    dp->~ee06662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06662(Test_ee06662, "ee06662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee06662C1Ev();
extern void _ZN7ee06662D1Ev();
Name_Map name_map_ee06662[] = {
  NSPAIR(_ZN7ee06662C1Ev),
  NSPAIR(_ZN7ee06662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee06662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06662[];
extern void _ZN6dd66623fooEv();
extern void _ZN6dd66623barEv();
static  VTBL_ENTRY vtc_ee06662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee06662[0]),
  (VTBL_ENTRY)&_ZN6dd66623fooEv,
  (VTBL_ENTRY)&_ZN6dd66623barEv,
};
extern VTBL_ENTRY _ZTI7ee06662[];
extern  VTBL_ENTRY _ZTV7ee06662[];
Class_Descriptor cd_ee06662 = {  "ee06662", // class name
  bases_ee06662, 4,
  &(vtc_ee06662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee06662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06662),4, //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  ee16662  : virtual dd6662 {
  int e;
  ~ee16662(); // tgen
  ee16662(); // tgen
};
//SIG(1 ee16662) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee16662 ::~ee16662(){ note_dtor("ee16662", this);} // tgen
ee16662 ::ee16662(){ note_ctor("ee16662", this);} // tgen

static void Test_ee16662()
{
  extern Class_Descriptor cd_ee16662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee16662, buf);
    ee16662 *dp, &lv = *(dp=new (buf) ee16662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee16662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee16662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee16662");
    check_base_class_offset(lv, (cc662*)(dd6662*), ABISELECT(16,8), "ee16662");
    check_base_class_offset(lv, (dd6662*), ABISELECT(16,8), "ee16662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16662.e");
    test_class_info(&lv, &cd_ee16662);
    dp->~ee16662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16662(Test_ee16662, "ee16662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee16662C1Ev();
extern void _ZN7ee16662D1Ev();
Name_Map name_map_ee16662[] = {
  NSPAIR(_ZN7ee16662C1Ev),
  NSPAIR(_ZN7ee16662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee16662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16662[];
extern void _ZN6dd66623fooEv();
extern void _ZN6dd66623barEv();
static  VTBL_ENTRY vtc_ee16662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16662[0]),
  0,
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16662[0]),
  (VTBL_ENTRY)&_ZN6dd66623fooEv,
  (VTBL_ENTRY)&_ZN6dd66623barEv,
};
extern VTBL_ENTRY _ZTV7ee16662[];
static  VTT_ENTRY vtt_ee16662[] = {
  {&(_ZTV7ee16662[3]),  3,9},
  {&(_ZTV7ee16662[7]),  7,9},
};
extern VTBL_ENTRY _ZTI7ee16662[];
extern  VTBL_ENTRY _ZTV7ee16662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16662[];
Class_Descriptor cd_ee16662 = {  "ee16662", // class name
  bases_ee16662, 4,
  &(vtc_ee16662[0]), // expected_vtbl_contents
  &(vtt_ee16662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee16662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16662),9, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16662),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  ee26662  : dd6662 {
  int e;
  virtual void  foo(); // _ZN7ee266623fooEv
  ~ee26662(); // tgen
  ee26662(); // tgen
};
//SIG(1 ee26662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26662 ::foo(){vfunc_called(this, "_ZN7ee266623fooEv");}
ee26662 ::~ee26662(){ note_dtor("ee26662", this);} // tgen
ee26662 ::ee26662(){ note_ctor("ee26662", this);} // tgen

static void Test_ee26662()
{
  extern Class_Descriptor cd_ee26662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee26662, buf);
    ee26662 *dp, &lv = *(dp=new (buf) ee26662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee26662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), 0, "ee26662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), 0, "ee26662");
    check_base_class_offset(lv, (cc662*)(dd6662*), 0, "ee26662");
    check_base_class_offset(lv, (dd6662*), 0, "ee26662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee26662.e");
    test_class_info(&lv, &cd_ee26662);
    dp->~ee26662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26662(Test_ee26662, "ee26662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee26662C1Ev();
extern void _ZN7ee26662D1Ev();
Name_Map name_map_ee26662[] = {
  NSPAIR(_ZN7ee26662C1Ev),
  NSPAIR(_ZN7ee26662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee26662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee26662[];
extern void _ZN7ee266623fooEv();
extern void _ZN6dd66623barEv();
static  VTBL_ENTRY vtc_ee26662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee26662[0]),
  (VTBL_ENTRY)&_ZN7ee266623fooEv,
  (VTBL_ENTRY)&_ZN6dd66623barEv,
};
extern VTBL_ENTRY _ZTI7ee26662[];
extern  VTBL_ENTRY _ZTV7ee26662[];
Class_Descriptor cd_ee26662 = {  "ee26662", // class name
  bases_ee26662, 4,
  &(vtc_ee26662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee26662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26662),4, //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  ee36662  : virtual dd6662 {
  int e;
  virtual void  foo(); // _ZN7ee366623fooEv
  ~ee36662(); // tgen
  ee36662(); // tgen
};
//SIG(1 ee36662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36662 ::foo(){vfunc_called(this, "_ZN7ee366623fooEv");}
ee36662 ::~ee36662(){ note_dtor("ee36662", this);} // tgen
ee36662 ::ee36662(){ note_ctor("ee36662", this);} // tgen

static void Test_ee36662()
{
  extern Class_Descriptor cd_ee36662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee36662, buf);
    ee36662 *dp, &lv = *(dp=new (buf) ee36662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee36662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee36662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee36662");
    check_base_class_offset(lv, (cc662*)(dd6662*), ABISELECT(16,8), "ee36662");
    check_base_class_offset(lv, (dd6662*), ABISELECT(16,8), "ee36662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36662.e");
    test_class_info(&lv, &cd_ee36662);
    dp->~ee36662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36662(Test_ee36662, "ee36662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee36662C1Ev();
extern void _ZN7ee36662D1Ev();
Name_Map name_map_ee36662[] = {
  NSPAIR(_ZN7ee36662C1Ev),
  NSPAIR(_ZN7ee36662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee36662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36662[];
extern void _ZN7ee366623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee366623fooEv,_ZTv0_n12_N7ee366623fooEv)();
extern void ABISELECT(_ZThn16_N7ee366623fooEv,_ZThn8_N7ee366623fooEv)() __attribute__((weak));
extern void _ZN6dd66623barEv();
static  VTBL_ENTRY vtc_ee36662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36662[0]),
  (VTBL_ENTRY)&_ZN7ee366623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee366623fooEv,_ZTv0_n12_N7ee366623fooEv),
  (VTBL_ENTRY)&_ZN6dd66623barEv,
};
extern VTBL_ENTRY _ZTV7ee36662[];
static  VTT_ENTRY vtt_ee36662[] = {
  {&(_ZTV7ee36662[3]),  3,10},
  {&(_ZTV7ee36662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee36662[];
extern  VTBL_ENTRY _ZTV7ee36662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36662[];
static VTBL_ENTRY alt_thunk_names1311[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee366623fooEv,_ZTv0_n12_N7ee366623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee366623fooEv,_ZThn8_N7ee366623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36662 = {  "ee36662", // class name
  bases_ee36662, 4,
  &(vtc_ee36662[0]), // expected_vtbl_contents
  &(vtt_ee36662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee36662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1311,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46662  : dd6662 {
  int e;
  virtual void  bar(); // _ZN7ee466623barEv
  ~ee46662(); // tgen
  ee46662(); // tgen
};
//SIG(1 ee46662) C1{ BC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46662 ::bar(){vfunc_called(this, "_ZN7ee466623barEv");}
ee46662 ::~ee46662(){ note_dtor("ee46662", this);} // tgen
ee46662 ::ee46662(){ note_ctor("ee46662", this);} // tgen

static void Test_ee46662()
{
  extern Class_Descriptor cd_ee46662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee46662, buf);
    ee46662 *dp, &lv = *(dp=new (buf) ee46662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee46662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), 0, "ee46662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), 0, "ee46662");
    check_base_class_offset(lv, (cc662*)(dd6662*), 0, "ee46662");
    check_base_class_offset(lv, (dd6662*), 0, "ee46662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee46662.e");
    test_class_info(&lv, &cd_ee46662);
    dp->~ee46662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46662(Test_ee46662, "ee46662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee46662C1Ev();
extern void _ZN7ee46662D1Ev();
Name_Map name_map_ee46662[] = {
  NSPAIR(_ZN7ee46662C1Ev),
  NSPAIR(_ZN7ee46662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee46662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee46662[];
extern void _ZN6dd66623fooEv();
extern void _ZN7ee466623barEv();
static  VTBL_ENTRY vtc_ee46662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee46662[0]),
  (VTBL_ENTRY)&_ZN6dd66623fooEv,
  (VTBL_ENTRY)&_ZN7ee466623barEv,
};
extern VTBL_ENTRY _ZTI7ee46662[];
extern  VTBL_ENTRY _ZTV7ee46662[];
Class_Descriptor cd_ee46662 = {  "ee46662", // class name
  bases_ee46662, 4,
  &(vtc_ee46662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee46662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46662),4, //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  ee56662  : virtual dd6662 {
  int e;
  virtual void  bar(); // _ZN7ee566623barEv
  ~ee56662(); // tgen
  ee56662(); // tgen
};
//SIG(1 ee56662) C1{ VBC2{ BC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56662 ::bar(){vfunc_called(this, "_ZN7ee566623barEv");}
ee56662 ::~ee56662(){ note_dtor("ee56662", this);} // tgen
ee56662 ::ee56662(){ note_ctor("ee56662", this);} // tgen

static void Test_ee56662()
{
  extern Class_Descriptor cd_ee56662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee56662, buf);
    ee56662 *dp, &lv = *(dp=new (buf) ee56662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee56662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee56662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee56662");
    check_base_class_offset(lv, (cc662*)(dd6662*), ABISELECT(16,8), "ee56662");
    check_base_class_offset(lv, (dd6662*), ABISELECT(16,8), "ee56662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56662.e");
    test_class_info(&lv, &cd_ee56662);
    dp->~ee56662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56662(Test_ee56662, "ee56662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee56662C1Ev();
extern void _ZN7ee56662D1Ev();
Name_Map name_map_ee56662[] = {
  NSPAIR(_ZN7ee56662C1Ev),
  NSPAIR(_ZN7ee56662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee56662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56662[];
extern void _ZN7ee566623barEv();
extern void _ZN6dd66623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee566623barEv,_ZTv0_n16_N7ee566623barEv)();
extern void ABISELECT(_ZThn16_N7ee566623barEv,_ZThn8_N7ee566623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56662[0]),
  (VTBL_ENTRY)&_ZN7ee566623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56662[0]),
  (VTBL_ENTRY)&_ZN6dd66623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee566623barEv,_ZTv0_n16_N7ee566623barEv),
};
extern VTBL_ENTRY _ZTV7ee56662[];
static  VTT_ENTRY vtt_ee56662[] = {
  {&(_ZTV7ee56662[3]),  3,10},
  {&(_ZTV7ee56662[8]),  8,10},
};
extern VTBL_ENTRY _ZTI7ee56662[];
extern  VTBL_ENTRY _ZTV7ee56662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56662[];
static VTBL_ENTRY alt_thunk_names1312[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee566623barEv,_ZTv0_n16_N7ee566623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee566623barEv,_ZThn8_N7ee566623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56662 = {  "ee56662", // class name
  bases_ee56662, 4,
  &(vtc_ee56662[0]), // expected_vtbl_contents
  &(vtt_ee56662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee56662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56662),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1312,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66662  : dd6662 {
  int e;
  virtual void  foo(); // _ZN7ee666623fooEv
  virtual void  bar(); // _ZN7ee666623barEv
  ~ee66662(); // tgen
  ee66662(); // tgen
};
//SIG(1 ee66662) C1{ BC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66662 ::foo(){vfunc_called(this, "_ZN7ee666623fooEv");}
void  ee66662 ::bar(){vfunc_called(this, "_ZN7ee666623barEv");}
ee66662 ::~ee66662(){ note_dtor("ee66662", this);} // tgen
ee66662 ::ee66662(){ note_ctor("ee66662", this);} // tgen

static void Test_ee66662()
{
  extern Class_Descriptor cd_ee66662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_ee66662, buf);
    ee66662 *dp, &lv = *(dp=new (buf) ee66662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(ee66662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), 0, "ee66662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), 0, "ee66662");
    check_base_class_offset(lv, (cc662*)(dd6662*), 0, "ee66662");
    check_base_class_offset(lv, (dd6662*), 0, "ee66662");
    check_field_offset(lv, e, ABISELECT(24,20), "ee66662.e");
    test_class_info(&lv, &cd_ee66662);
    dp->~ee66662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66662(Test_ee66662, "ee66662", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN7ee66662C1Ev();
extern void _ZN7ee66662D1Ev();
Name_Map name_map_ee66662[] = {
  NSPAIR(_ZN7ee66662C1Ev),
  NSPAIR(_ZN7ee66662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee66662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    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 _ZTI7ee66662[];
extern void _ZN7ee666623fooEv();
extern void _ZN7ee666623barEv();
static  VTBL_ENTRY vtc_ee66662[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7ee66662[0]),
  (VTBL_ENTRY)&_ZN7ee666623fooEv,
  (VTBL_ENTRY)&_ZN7ee666623barEv,
};
extern VTBL_ENTRY _ZTI7ee66662[];
extern  VTBL_ENTRY _ZTV7ee66662[];
Class_Descriptor cd_ee66662 = {  "ee66662", // class name
  bases_ee66662, 4,
  &(vtc_ee66662[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI7ee66662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66662),4, //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  ee76662  : virtual dd6662 {
  int e;
  virtual void  foo(); // _ZN7ee766623fooEv
  virtual void  bar(); // _ZN7ee766623barEv
  ~ee76662(); // tgen
  ee76662(); // tgen
};
//SIG(1 ee76662) C1{ VBC2{ BC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76662 ::foo(){vfunc_called(this, "_ZN7ee766623fooEv");}
void  ee76662 ::bar(){vfunc_called(this, "_ZN7ee766623barEv");}
ee76662 ::~ee76662(){ note_dtor("ee76662", this);} // tgen
ee76662 ::ee76662(){ note_ctor("ee76662", this);} // tgen

static void Test_ee76662()
{
  extern Class_Descriptor cd_ee76662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee76662, buf);
    ee76662 *dp, &lv = *(dp=new (buf) ee76662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee76662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee76662");
    check_base_class_offset(lv, (bb62*)(cc662*)(dd6662*), ABISELECT(16,8), "ee76662");
    check_base_class_offset(lv, (cc662*)(dd6662*), ABISELECT(16,8), "ee76662");
    check_base_class_offset(lv, (dd6662*), ABISELECT(16,8), "ee76662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76662.e");
    test_class_info(&lv, &cd_ee76662);
    dp->~ee76662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76662(Test_ee76662, "ee76662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee76662C1Ev();
extern void _ZN7ee76662D1Ev();
Name_Map name_map_ee76662[] = {
  NSPAIR(_ZN7ee76662C1Ev),
  NSPAIR(_ZN7ee76662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd6662;
extern VTBL_ENTRY _ZTI6dd6662[];
extern  VTBL_ENTRY _ZTV6dd6662[];
static Base_Class bases_ee76662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6662,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee76662[];
extern void _ZN7ee766623fooEv();
extern void _ZN7ee766623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee766623fooEv,_ZTv0_n12_N7ee766623fooEv)();
extern void ABISELECT(_ZThn16_N7ee766623fooEv,_ZThn8_N7ee766623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee766623barEv,_ZTv0_n16_N7ee766623barEv)();
extern void ABISELECT(_ZThn16_N7ee766623barEv,_ZThn8_N7ee766623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76662[0]),
  (VTBL_ENTRY)&_ZN7ee766623fooEv,
  (VTBL_ENTRY)&_ZN7ee766623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee766623fooEv,_ZTv0_n12_N7ee766623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee766623barEv,_ZTv0_n16_N7ee766623barEv),
};
extern VTBL_ENTRY _ZTV7ee76662[];
static  VTT_ENTRY vtt_ee76662[] = {
  {&(_ZTV7ee76662[3]),  3,11},
  {&(_ZTV7ee76662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee76662[];
extern  VTBL_ENTRY _ZTV7ee76662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76662[];
static VTBL_ENTRY alt_thunk_names1313[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee766623barEv,_ZTv0_n16_N7ee766623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee766623barEv,_ZThn8_N7ee766623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee766623fooEv,_ZTv0_n12_N7ee766623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee766623fooEv,_ZThn8_N7ee766623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76662 = {  "ee76662", // class name
  bases_ee76662, 4,
  &(vtc_ee76662[0]), // expected_vtbl_contents
  &(vtt_ee76662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee76662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76662),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1313,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7662  : virtual cc662 {
  int d;
  virtual void  bar(); // _ZN6dd76623barEv
  virtual void  foo(); // _ZN6dd76623fooEv
  ~dd7662(); // tgen
  dd7662(); // tgen
};
//SIG(-1 dd7662) C1{ VBC2{ BC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd7662 ::bar(){vfunc_called(this, "_ZN6dd76623barEv");}
void  dd7662 ::foo(){vfunc_called(this, "_ZN6dd76623fooEv");}
dd7662 ::~dd7662(){ note_dtor("dd7662", this);} // tgen
dd7662 ::dd7662(){ note_ctor("dd7662", this);} // tgen

static void Test_dd7662()
{
  extern Class_Descriptor cd_dd7662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,7)];
    init_test(&cd_dd7662, buf);
    dd7662 *dp, &lv = *(dp=new (buf) dd7662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,24), "sizeof(dd7662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,8), "dd7662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,8), "dd7662");
    check_base_class_offset(lv, (cc662*), ABISELECT(16,8), "dd7662");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7662.d");
    test_class_info(&lv, &cd_dd7662);
    dp->~dd7662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7662(Test_dd7662, "dd7662", ABISELECT(40,24));

#else // __cplusplus

extern void _ZN6dd7662C1Ev();
extern void _ZN6dd7662D1Ev();
Name_Map name_map_dd7662[] = {
  NSPAIR(_ZN6dd7662C1Ev),
  NSPAIR(_ZN6dd7662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
static Base_Class bases_dd7662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6dd7662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
extern VTBL_ENTRY _ZTV6dd7662[];
static  VTT_ENTRY vtt_dd7662[] = {
  {&(_ZTV6dd7662[3]),  3,11},
  {&(_ZTV6dd7662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static VTBL_ENTRY alt_thunk_names1314[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7662 = {  "dd7662", // class name
  bases_dd7662, 3,
  &(vtc_dd7662[0]), // expected_vtbl_contents
  &(vtt_dd7662[0]), // expected_vtt_contents
  ABISELECT(40,24), // object size
  NSPAIRA(_ZTI6dd7662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7662),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1314,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07662  : dd7662 {
  int e;
  ~ee07662(); // tgen
  ee07662(); // tgen
};
//SIG(1 ee07662) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee07662 ::~ee07662(){ note_dtor("ee07662", this);} // tgen
ee07662 ::ee07662(){ note_ctor("ee07662", this);} // tgen

static void Test_ee07662()
{
  extern Class_Descriptor cd_ee07662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee07662, buf);
    ee07662 *dp, &lv = *(dp=new (buf) ee07662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee07662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee07662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee07662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(16,12), "ee07662");
    check_base_class_offset(lv, (dd7662*), 0, "ee07662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07662.e");
    test_class_info(&lv, &cd_ee07662);
    dp->~ee07662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07662(Test_ee07662, "ee07662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee07662C1Ev();
extern void _ZN7ee07662D1Ev();
Name_Map name_map_ee07662[] = {
  NSPAIR(_ZN7ee07662C1Ev),
  NSPAIR(_ZN7ee07662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee07662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
extern VTBL_ENTRY _ZTV7ee07662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee07662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee07662[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee07662[] = {
  {&(_ZTV7ee07662[3]),  3,11},
  {&(_tg__ZTV6dd7662__7ee07662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee07662[4]),  4,6},
  {&(_ZTV7ee07662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee07662[];
extern  VTBL_ENTRY _ZTV7ee07662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07662[];
static VTBL_ENTRY alt_thunk_names1315[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07662 = {  "ee07662", // class name
  bases_ee07662, 4,
  &(vtc_ee07662[0]), // expected_vtbl_contents
  &(vtt_ee07662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee07662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1315,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17662  : virtual dd7662 {
  int e;
  ~ee17662(); // tgen
  ee17662(); // tgen
};
//SIG(1 ee17662) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee17662 ::~ee17662(){ note_dtor("ee17662", this);} // tgen
ee17662 ::ee17662(){ note_ctor("ee17662", this);} // tgen

static void Test_ee17662()
{
  extern Class_Descriptor cd_ee17662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee17662, buf);
    ee17662 *dp, &lv = *(dp=new (buf) ee17662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee17662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee17662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee17662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(32,16), "ee17662");
    check_base_class_offset(lv, (dd7662*), ABISELECT(16,8), "ee17662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17662.e");
    test_class_info(&lv, &cd_ee17662);
    dp->~ee17662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17662(Test_ee17662, "ee17662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee17662C1Ev();
extern void _ZN7ee17662D1Ev();
Name_Map name_map_ee17662[] = {
  NSPAIR(_ZN7ee17662C1Ev),
  NSPAIR(_ZN7ee17662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee17662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17662[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
extern VTBL_ENTRY _ZTV7ee17662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee17662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee17662[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee17662[] = {
  {&(_ZTV7ee17662[4]),  4,17},
  {&(_ZTV7ee17662[9]),  9,17},
  {&(_ZTV7ee17662[15]),  15,17},
  {&(_tg__ZTV6dd7662__7ee17662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee17662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17662[];
extern  VTBL_ENTRY _ZTV7ee17662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17662[];
static VTBL_ENTRY alt_thunk_names1316[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17662 = {  "ee17662", // class name
  bases_ee17662, 4,
  &(vtc_ee17662[0]), // expected_vtbl_contents
  &(vtt_ee17662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee17662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17662),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1316,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27662  : dd7662 {
  int e;
  virtual void  foo(); // _ZN7ee276623fooEv
  ~ee27662(); // tgen
  ee27662(); // tgen
};
//SIG(1 ee27662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27662 ::foo(){vfunc_called(this, "_ZN7ee276623fooEv");}
ee27662 ::~ee27662(){ note_dtor("ee27662", this);} // tgen
ee27662 ::ee27662(){ note_ctor("ee27662", this);} // tgen

static void Test_ee27662()
{
  extern Class_Descriptor cd_ee27662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee27662, buf);
    ee27662 *dp, &lv = *(dp=new (buf) ee27662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee27662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee27662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee27662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(16,12), "ee27662");
    check_base_class_offset(lv, (dd7662*), 0, "ee27662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27662.e");
    test_class_info(&lv, &cd_ee27662);
    dp->~ee27662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27662(Test_ee27662, "ee27662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee27662C1Ev();
extern void _ZN7ee27662D1Ev();
Name_Map name_map_ee27662[] = {
  NSPAIR(_ZN7ee27662C1Ev),
  NSPAIR(_ZN7ee27662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee27662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27662[];
extern void _ZN6dd76623barEv();
extern void _ZN7ee276623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee276623fooEv,_ZTv0_n12_N7ee276623fooEv)();
extern void ABISELECT(_ZThn16_N7ee276623fooEv,_ZThn12_N7ee276623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN7ee276623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee276623fooEv,_ZTv0_n12_N7ee276623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
extern VTBL_ENTRY _ZTV7ee27662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee27662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee27662[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee27662[] = {
  {&(_ZTV7ee27662[3]),  3,11},
  {&(_tg__ZTV6dd7662__7ee27662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee27662[4]),  4,6},
  {&(_ZTV7ee27662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee27662[];
extern  VTBL_ENTRY _ZTV7ee27662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27662[];
static VTBL_ENTRY alt_thunk_names1317[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee276623fooEv,_ZTv0_n12_N7ee276623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee276623fooEv,_ZThn12_N7ee276623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27662 = {  "ee27662", // class name
  bases_ee27662, 4,
  &(vtc_ee27662[0]), // expected_vtbl_contents
  &(vtt_ee27662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee27662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1317,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37662  : virtual dd7662 {
  int e;
  virtual void  foo(); // _ZN7ee376623fooEv
  ~ee37662(); // tgen
  ee37662(); // tgen
};
//SIG(1 ee37662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37662 ::foo(){vfunc_called(this, "_ZN7ee376623fooEv");}
ee37662 ::~ee37662(){ note_dtor("ee37662", this);} // tgen
ee37662 ::ee37662(){ note_ctor("ee37662", this);} // tgen

static void Test_ee37662()
{
  extern Class_Descriptor cd_ee37662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee37662, buf);
    ee37662 *dp, &lv = *(dp=new (buf) ee37662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee37662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee37662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee37662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(32,16), "ee37662");
    check_base_class_offset(lv, (dd7662*), ABISELECT(16,8), "ee37662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37662.e");
    test_class_info(&lv, &cd_ee37662);
    dp->~ee37662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37662(Test_ee37662, "ee37662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee37662C1Ev();
extern void _ZN7ee37662D1Ev();
Name_Map name_map_ee37662[] = {
  NSPAIR(_ZN7ee37662C1Ev),
  NSPAIR(_ZN7ee37662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee37662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37662[];
extern void _ZN7ee376623fooEv();
extern void _ZN6dd76623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee376623fooEv,_ZTv0_n20_N7ee376623fooEv)();
extern void ABISELECT(_ZThn16_N7ee376623fooEv,_ZThn8_N7ee376623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee376623fooEv,_ZTv0_n12_N7ee376623fooEv)();
extern void ABISELECT(_ZThn32_N7ee376623fooEv,_ZThn16_N7ee376623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37662[0]),
  (VTBL_ENTRY)&_ZN7ee376623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee376623fooEv,_ZTv0_n20_N7ee376623fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee376623fooEv,_ZTv0_n12_N7ee376623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
extern VTBL_ENTRY _ZTV7ee37662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee37662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee37662[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee37662[] = {
  {&(_ZTV7ee37662[4]),  4,18},
  {&(_ZTV7ee37662[10]),  10,18},
  {&(_ZTV7ee37662[16]),  16,18},
  {&(_tg__ZTV6dd7662__7ee37662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee37662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37662[];
extern  VTBL_ENTRY _ZTV7ee37662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37662[];
static VTBL_ENTRY alt_thunk_names1318[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee376623fooEv,_ZTv0_n12_N7ee376623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee376623fooEv,_ZThn16_N7ee376623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee376623fooEv,_ZTv0_n20_N7ee376623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee376623fooEv,_ZThn8_N7ee376623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37662 = {  "ee37662", // class name
  bases_ee37662, 4,
  &(vtc_ee37662[0]), // expected_vtbl_contents
  &(vtt_ee37662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee37662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37662),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1318,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47662  : dd7662 {
  int e;
  virtual void  bar(); // _ZN7ee476623barEv
  ~ee47662(); // tgen
  ee47662(); // tgen
};
//SIG(1 ee47662) C1{ BC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47662 ::bar(){vfunc_called(this, "_ZN7ee476623barEv");}
ee47662 ::~ee47662(){ note_dtor("ee47662", this);} // tgen
ee47662 ::ee47662(){ note_ctor("ee47662", this);} // tgen

static void Test_ee47662()
{
  extern Class_Descriptor cd_ee47662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee47662, buf);
    ee47662 *dp, &lv = *(dp=new (buf) ee47662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee47662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee47662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee47662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(16,12), "ee47662");
    check_base_class_offset(lv, (dd7662*), 0, "ee47662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47662.e");
    test_class_info(&lv, &cd_ee47662);
    dp->~ee47662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47662(Test_ee47662, "ee47662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee47662C1Ev();
extern void _ZN7ee47662D1Ev();
Name_Map name_map_ee47662[] = {
  NSPAIR(_ZN7ee47662C1Ev),
  NSPAIR(_ZN7ee47662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee47662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47662[];
extern void _ZN7ee476623barEv();
extern void _ZN6dd76623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee476623barEv,_ZTv0_n16_N7ee476623barEv)();
extern void ABISELECT(_ZThn16_N7ee476623barEv,_ZThn12_N7ee476623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47662[0]),
  (VTBL_ENTRY)&_ZN7ee476623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee476623barEv,_ZTv0_n16_N7ee476623barEv),
};
extern VTBL_ENTRY _ZTV7ee47662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee47662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee47662[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee47662[] = {
  {&(_ZTV7ee47662[3]),  3,11},
  {&(_tg__ZTV6dd7662__7ee47662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee47662[4]),  4,6},
  {&(_ZTV7ee47662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee47662[];
extern  VTBL_ENTRY _ZTV7ee47662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47662[];
static VTBL_ENTRY alt_thunk_names1319[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee476623barEv,_ZTv0_n16_N7ee476623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee476623barEv,_ZThn12_N7ee476623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47662 = {  "ee47662", // class name
  bases_ee47662, 4,
  &(vtc_ee47662[0]), // expected_vtbl_contents
  &(vtt_ee47662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee47662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1319,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57662  : virtual dd7662 {
  int e;
  virtual void  bar(); // _ZN7ee576623barEv
  ~ee57662(); // tgen
  ee57662(); // tgen
};
//SIG(1 ee57662) C1{ VBC2{ VBC3{ BC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57662 ::bar(){vfunc_called(this, "_ZN7ee576623barEv");}
ee57662 ::~ee57662(){ note_dtor("ee57662", this);} // tgen
ee57662 ::ee57662(){ note_ctor("ee57662", this);} // tgen

static void Test_ee57662()
{
  extern Class_Descriptor cd_ee57662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee57662, buf);
    ee57662 *dp, &lv = *(dp=new (buf) ee57662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee57662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee57662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee57662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(32,16), "ee57662");
    check_base_class_offset(lv, (dd7662*), ABISELECT(16,8), "ee57662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57662.e");
    test_class_info(&lv, &cd_ee57662);
    dp->~ee57662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57662(Test_ee57662, "ee57662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee57662C1Ev();
extern void _ZN7ee57662D1Ev();
Name_Map name_map_ee57662[] = {
  NSPAIR(_ZN7ee57662C1Ev),
  NSPAIR(_ZN7ee57662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee57662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57662[];
extern void _ZN7ee576623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee576623barEv,_ZTv0_n16_N7ee576623barEv)();
extern void ABISELECT(_ZThn16_N7ee576623barEv,_ZThn8_N7ee576623barEv)() __attribute__((weak));
extern void _ZN6dd76623fooEv();
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee576623barEv,_ZTv0_n16_N7ee576623barEv)();
extern void ABISELECT(_ZThn32_N7ee576623barEv,_ZThn16_N7ee576623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57662[0]),
  (VTBL_ENTRY)&_ZN7ee576623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee576623barEv,_ZTv0_n16_N7ee576623barEv),
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee576623barEv,_ZTv0_n16_N7ee576623barEv),
};
extern VTBL_ENTRY _ZTV7ee57662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee57662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee57662[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee57662[] = {
  {&(_ZTV7ee57662[4]),  4,18},
  {&(_ZTV7ee57662[10]),  10,18},
  {&(_ZTV7ee57662[16]),  16,18},
  {&(_tg__ZTV6dd7662__7ee57662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee57662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57662[];
extern  VTBL_ENTRY _ZTV7ee57662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57662[];
static VTBL_ENTRY alt_thunk_names1320[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee576623barEv,_ZTv0_n16_N7ee576623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee576623barEv,_ZThn16_N7ee576623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee576623barEv,_ZThn8_N7ee576623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57662 = {  "ee57662", // class name
  bases_ee57662, 4,
  &(vtc_ee57662[0]), // expected_vtbl_contents
  &(vtt_ee57662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee57662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57662),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1320,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67662  : dd7662 {
  int e;
  virtual void  foo(); // _ZN7ee676623fooEv
  virtual void  bar(); // _ZN7ee676623barEv
  ~ee67662(); // tgen
  ee67662(); // tgen
};
//SIG(1 ee67662) C1{ BC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67662 ::foo(){vfunc_called(this, "_ZN7ee676623fooEv");}
void  ee67662 ::bar(){vfunc_called(this, "_ZN7ee676623barEv");}
ee67662 ::~ee67662(){ note_dtor("ee67662", this);} // tgen
ee67662 ::ee67662(){ note_ctor("ee67662", this);} // tgen

static void Test_ee67662()
{
  extern Class_Descriptor cd_ee67662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee67662, buf);
    ee67662 *dp, &lv = *(dp=new (buf) ee67662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee67662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(16,12), "ee67662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(16,12), "ee67662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(16,12), "ee67662");
    check_base_class_offset(lv, (dd7662*), 0, "ee67662");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67662.e");
    test_class_info(&lv, &cd_ee67662);
    dp->~ee67662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67662(Test_ee67662, "ee67662", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee67662C1Ev();
extern void _ZN7ee67662D1Ev();
Name_Map name_map_ee67662[] = {
  NSPAIR(_ZN7ee67662C1Ev),
  NSPAIR(_ZN7ee67662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee67662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_cc662,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67662[];
extern void _ZN7ee676623barEv();
extern void _ZN7ee676623fooEv();
extern void ABISELECT(_ZTv0_n24_N7ee676623fooEv,_ZTv0_n12_N7ee676623fooEv)();
extern void ABISELECT(_ZThn16_N7ee676623fooEv,_ZThn12_N7ee676623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee676623barEv,_ZTv0_n16_N7ee676623barEv)();
extern void ABISELECT(_ZThn16_N7ee676623barEv,_ZThn12_N7ee676623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67662[0]),
  (VTBL_ENTRY)&_ZN7ee676623barEv,
  (VTBL_ENTRY)&_ZN7ee676623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee676623fooEv,_ZTv0_n12_N7ee676623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee676623barEv,_ZTv0_n16_N7ee676623barEv),
};
extern VTBL_ENTRY _ZTV7ee67662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee67662[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee67662[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee67662[] = {
  {&(_ZTV7ee67662[3]),  3,11},
  {&(_tg__ZTV6dd7662__7ee67662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee67662[4]),  4,6},
  {&(_ZTV7ee67662[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee67662[];
extern  VTBL_ENTRY _ZTV7ee67662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67662[];
static VTBL_ENTRY alt_thunk_names1321[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn12_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn12_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee676623barEv,_ZTv0_n16_N7ee676623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee676623barEv,_ZThn12_N7ee676623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee676623fooEv,_ZTv0_n12_N7ee676623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee676623fooEv,_ZThn12_N7ee676623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67662 = {  "ee67662", // class name
  bases_ee67662, 4,
  &(vtc_ee67662[0]), // expected_vtbl_contents
  &(vtt_ee67662[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee67662),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67662),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67662),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1321,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77662  : virtual dd7662 {
  int e;
  virtual void  foo(); // _ZN7ee776623fooEv
  virtual void  bar(); // _ZN7ee776623barEv
  ~ee77662(); // tgen
  ee77662(); // tgen
};
//SIG(1 ee77662) C1{ VBC2{ VBC3{ BC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77662 ::foo(){vfunc_called(this, "_ZN7ee776623fooEv");}
void  ee77662 ::bar(){vfunc_called(this, "_ZN7ee776623barEv");}
ee77662 ::~ee77662(){ note_dtor("ee77662", this);} // tgen
ee77662 ::ee77662(){ note_ctor("ee77662", this);} // tgen

static void Test_ee77662()
{
  extern Class_Descriptor cd_ee77662;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_ee77662, buf);
    ee77662 *dp, &lv = *(dp=new (buf) ee77662());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(ee77662)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77662)");
    check_base_class_offset(lv, (aa2*)(bb62*)(cc662*), ABISELECT(32,16), "ee77662");
    check_base_class_offset(lv, (bb62*)(cc662*), ABISELECT(32,16), "ee77662");
    check_base_class_offset(lv, (cc662*)(dd7662*), ABISELECT(32,16), "ee77662");
    check_base_class_offset(lv, (dd7662*), ABISELECT(16,8), "ee77662");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77662.e");
    test_class_info(&lv, &cd_ee77662);
    dp->~ee77662();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77662(Test_ee77662, "ee77662", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN7ee77662C1Ev();
extern void _ZN7ee77662D1Ev();
Name_Map name_map_ee77662[] = {
  NSPAIR(_ZN7ee77662C1Ev),
  NSPAIR(_ZN7ee77662D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc662;
extern VTBL_ENTRY _ZTI5cc662[];
extern  VTBL_ENTRY _ZTV5cc662[];
extern Class_Descriptor cd_dd7662;
extern VTBL_ENTRY _ZTI6dd7662[];
extern  VTBL_ENTRY _ZTV6dd7662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7662[];
static Base_Class bases_ee77662[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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_cc662,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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
    3, //immediately_derived
  0, 1},
  {&cd_dd7662,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77662[];
extern void _ZN7ee776623fooEv();
extern void _ZN7ee776623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee776623barEv,_ZTv0_n16_N7ee776623barEv)();
extern void ABISELECT(_ZThn16_N7ee776623barEv,_ZThn8_N7ee776623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee776623fooEv,_ZTv0_n20_N7ee776623fooEv)();
extern void ABISELECT(_ZThn16_N7ee776623fooEv,_ZThn8_N7ee776623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee776623fooEv,_ZTv0_n12_N7ee776623fooEv)();
extern void ABISELECT(_ZThn32_N7ee776623fooEv,_ZThn16_N7ee776623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee776623barEv,_ZTv0_n16_N7ee776623barEv)();
extern void ABISELECT(_ZThn32_N7ee776623barEv,_ZThn16_N7ee776623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77662[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77662[0]),
  (VTBL_ENTRY)&_ZN7ee776623fooEv,
  (VTBL_ENTRY)&_ZN7ee776623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee776623barEv,_ZTv0_n16_N7ee776623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee776623fooEv,_ZTv0_n20_N7ee776623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee776623fooEv,_ZTv0_n12_N7ee776623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee776623barEv,_ZTv0_n16_N7ee776623barEv),
};
extern VTBL_ENTRY _ZTV7ee77662[];
extern void _ZN6dd76623barEv();
extern void _ZN6dd76623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7662__7ee77662[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&_ZN6dd76623barEv,
  (VTBL_ENTRY)&_ZN6dd76623fooEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv)();
extern void ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv)();
extern void ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc662__6dd7662__7ee77662[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7662[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv),
};
static  VTT_ENTRY vtt_ee77662[] = {
  {&(_ZTV7ee77662[4]),  4,19},
  {&(_ZTV7ee77662[11]),  11,19},
  {&(_ZTV7ee77662[17]),  17,19},
  {&(_tg__ZTV6dd7662__7ee77662[3]),  3,5},
  {&(_tg__ZTV5cc662__6dd7662__7ee77662[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77662[];
extern  VTBL_ENTRY _ZTV7ee77662[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77662[];
static VTBL_ENTRY alt_thunk_names1322[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd76623barEv,_ZTv0_n16_N6dd76623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623barEv,_ZThn8_N6dd76623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd76623fooEv,_ZTv0_n12_N6dd76623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd76623fooEv,_ZThn8_N6dd76623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee776623fooEv,_ZTv0_n12_N7ee776623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee776623fooEv,_ZThn16_N7ee776623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee776623fooEv,_ZTv0_n20_N7ee776623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee776623fooEv,_ZThn8_N7ee776623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee776623barEv,_ZTv0_n16_N7ee776623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee776623barEv,_ZThn16_N7ee776623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee776623barEv,_ZThn8_N7ee776623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77662 = {  "ee77662", // class name
  bases_ee77662, 4,
  &(vtc_ee77662[0]), // expected_vtbl_contents
  &(vtt_ee77662[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI7ee77662),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77662),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77662),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1322,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  cc762  : virtual bb62 {
  int c;
  virtual void  foo(); // _ZN5cc7623fooEv
  virtual void  bar(); // _ZN5cc7623barEv
  ~cc762(); // tgen
  cc762(); // tgen
};
//SIG(-1 cc762) C1{ VBC2{ BC3{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  cc762 ::foo(){vfunc_called(this, "_ZN5cc7623fooEv");}
void  cc762 ::bar(){vfunc_called(this, "_ZN5cc7623barEv");}
cc762 ::~cc762(){ note_dtor("cc762", this);} // tgen
cc762 ::cc762(){ note_ctor("cc762", this);} // tgen

static void Test_cc762()
{
  extern Class_Descriptor cd_cc762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_cc762, buf);
    cc762 *dp, &lv = *(dp=new (buf) cc762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(cc762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(cc762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,8), "cc762");
    check_base_class_offset(lv, (bb62*), ABISELECT(16,8), "cc762");
    check_field_offset(lv, c, ABISELECT(8,4), "cc762.c");
    test_class_info(&lv, &cd_cc762);
    dp->~cc762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vcc762(Test_cc762, "cc762", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN5cc762C1Ev();
extern void _ZN5cc762D1Ev();
Name_Map name_map_cc762[] = {
  NSPAIR(_ZN5cc762C1Ev),
  NSPAIR(_ZN5cc762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
static Base_Class bases_cc762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5cc762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_cc762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV5cc762[];
static  VTT_ENTRY vtt_cc762[] = {
  {&(_ZTV5cc762[3]),  3,11},
  {&(_ZTV5cc762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static VTBL_ENTRY alt_thunk_names1323[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_cc762 = {  "cc762", // class name
  bases_cc762, 2,
  &(vtc_cc762[0]), // expected_vtbl_contents
  &(vtt_cc762[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI5cc762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV5cc762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5cc762),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1323,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd0762  : cc762 {
  int d;
  ~dd0762(); // tgen
  dd0762(); // tgen
};
//SIG(-1 dd0762) C1{ BC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd0762 ::~dd0762(){ note_dtor("dd0762", this);} // tgen
dd0762 ::dd0762(){ note_ctor("dd0762", this);} // tgen

static void Test_dd0762()
{
  extern Class_Descriptor cd_dd0762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd0762, buf);
    dd0762 *dp, &lv = *(dp=new (buf) dd0762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd0762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd0762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd0762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(16,12), "dd0762");
    check_base_class_offset(lv, (cc762*), 0, "dd0762");
    check_field_offset(lv, d, ABISELECT(12,8), "dd0762.d");
    test_class_info(&lv, &cd_dd0762);
    dp->~dd0762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd0762(Test_dd0762, "dd0762", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd0762C1Ev();
extern void _ZN6dd0762D1Ev();
Name_Map name_map_dd0762[] = {
  NSPAIR(_ZN6dd0762C1Ev),
  NSPAIR(_ZN6dd0762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd0762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd0762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd0762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV6dd0762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd0762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd0762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd0762[] = {
  {&(_ZTV6dd0762[3]),  3,11},
  {&(_tg__ZTV5cc762__6dd0762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd0762[4]),  4,6},
  {&(_ZTV6dd0762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static VTBL_ENTRY alt_thunk_names1324[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd0762 = {  "dd0762", // class name
  bases_dd0762, 3,
  &(vtc_dd0762[0]), // expected_vtbl_contents
  &(vtt_dd0762[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd0762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd0762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd0762),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1324,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee00762  : dd0762 {
  int e;
  ~ee00762(); // tgen
  ee00762(); // tgen
};
//SIG(1 ee00762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee00762 ::~ee00762(){ note_dtor("ee00762", this);} // tgen
ee00762 ::ee00762(){ note_ctor("ee00762", this);} // tgen

static void Test_ee00762()
{
  extern Class_Descriptor cd_ee00762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee00762, buf);
    ee00762 *dp, &lv = *(dp=new (buf) ee00762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee00762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee00762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee00762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(24,16), "ee00762");
    check_base_class_offset(lv, (cc762*)(dd0762*), 0, "ee00762");
    check_base_class_offset(lv, (dd0762*), 0, "ee00762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee00762.e");
    test_class_info(&lv, &cd_ee00762);
    dp->~ee00762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee00762(Test_ee00762, "ee00762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee00762C1Ev();
extern void _ZN7ee00762D1Ev();
Name_Map name_map_ee00762[] = {
  NSPAIR(_ZN7ee00762C1Ev),
  NSPAIR(_ZN7ee00762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee00762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee00762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee00762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee00762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee00762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee00762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee00762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee00762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee00762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee00762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee00762[] = {
  {&(_ZTV7ee00762[3]),  3,11},
  {&(_tg__ZTV6dd0762__7ee00762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee00762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee00762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee00762[4]),  4,6},
  {&(_ZTV7ee00762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee00762[];
extern  VTBL_ENTRY _ZTV7ee00762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee00762[];
static VTBL_ENTRY alt_thunk_names1325[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee00762 = {  "ee00762", // class name
  bases_ee00762, 4,
  &(vtc_ee00762[0]), // expected_vtbl_contents
  &(vtt_ee00762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee00762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee00762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee00762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1325,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee10762  : virtual dd0762 {
  int e;
  ~ee10762(); // tgen
  ee10762(); // tgen
};
//SIG(1 ee10762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee10762 ::~ee10762(){ note_dtor("ee10762", this);} // tgen
ee10762 ::ee10762(){ note_ctor("ee10762", this);} // tgen

static void Test_ee10762()
{
  extern Class_Descriptor cd_ee10762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee10762, buf);
    ee10762 *dp, &lv = *(dp=new (buf) ee10762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee10762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee10762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee10762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(32,20), "ee10762");
    check_base_class_offset(lv, (cc762*)(dd0762*), ABISELECT(16,8), "ee10762");
    check_base_class_offset(lv, (dd0762*), ABISELECT(16,8), "ee10762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee10762.e");
    test_class_info(&lv, &cd_ee10762);
    dp->~ee10762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee10762(Test_ee10762, "ee10762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee10762C1Ev();
extern void _ZN7ee10762D1Ev();
Name_Map name_map_ee10762[] = {
  NSPAIR(_ZN7ee10762C1Ev),
  NSPAIR(_ZN7ee10762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee10762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee10762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee10762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee10762[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee10762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee10762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee10762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee10762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee10762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee10762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee10762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee10762[] = {
  {&(_ZTV7ee10762[4]),  4,17},
  {&(_ZTV7ee10762[9]),  9,17},
  {&(_ZTV7ee10762[15]),  15,17},
  {&(_tg__ZTV6dd0762__7ee10762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee10762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee10762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee10762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee10762[];
extern  VTBL_ENTRY _ZTV7ee10762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee10762[];
static VTBL_ENTRY alt_thunk_names1326[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee10762 = {  "ee10762", // class name
  bases_ee10762, 4,
  &(vtc_ee10762[0]), // expected_vtbl_contents
  &(vtt_ee10762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee10762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee10762),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee10762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1326,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee20762  : dd0762 {
  int e;
  virtual void  foo(); // _ZN7ee207623fooEv
  ~ee20762(); // tgen
  ee20762(); // tgen
};
//SIG(1 ee20762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee20762 ::foo(){vfunc_called(this, "_ZN7ee207623fooEv");}
ee20762 ::~ee20762(){ note_dtor("ee20762", this);} // tgen
ee20762 ::ee20762(){ note_ctor("ee20762", this);} // tgen

static void Test_ee20762()
{
  extern Class_Descriptor cd_ee20762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee20762, buf);
    ee20762 *dp, &lv = *(dp=new (buf) ee20762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee20762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee20762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee20762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(24,16), "ee20762");
    check_base_class_offset(lv, (cc762*)(dd0762*), 0, "ee20762");
    check_base_class_offset(lv, (dd0762*), 0, "ee20762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee20762.e");
    test_class_info(&lv, &cd_ee20762);
    dp->~ee20762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee20762(Test_ee20762, "ee20762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee20762C1Ev();
extern void _ZN7ee20762D1Ev();
Name_Map name_map_ee20762[] = {
  NSPAIR(_ZN7ee20762C1Ev),
  NSPAIR(_ZN7ee20762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee20762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee20762[];
extern void _ZN7ee207623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee207623fooEv,_ZTv0_n12_N7ee207623fooEv)();
extern void ABISELECT(_ZThn24_N7ee207623fooEv,_ZThn16_N7ee207623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee20762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee20762[0]),
  (VTBL_ENTRY)&_ZN7ee207623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee20762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee207623fooEv,_ZTv0_n12_N7ee207623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee20762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee20762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee20762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee20762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee20762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee20762[] = {
  {&(_ZTV7ee20762[3]),  3,11},
  {&(_tg__ZTV6dd0762__7ee20762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee20762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee20762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee20762[4]),  4,6},
  {&(_ZTV7ee20762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee20762[];
extern  VTBL_ENTRY _ZTV7ee20762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee20762[];
static VTBL_ENTRY alt_thunk_names1327[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee207623fooEv,_ZTv0_n12_N7ee207623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee207623fooEv,_ZThn16_N7ee207623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee20762 = {  "ee20762", // class name
  bases_ee20762, 4,
  &(vtc_ee20762[0]), // expected_vtbl_contents
  &(vtt_ee20762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee20762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee20762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee20762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1327,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee30762  : virtual dd0762 {
  int e;
  virtual void  foo(); // _ZN7ee307623fooEv
  ~ee30762(); // tgen
  ee30762(); // tgen
};
//SIG(1 ee30762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee30762 ::foo(){vfunc_called(this, "_ZN7ee307623fooEv");}
ee30762 ::~ee30762(){ note_dtor("ee30762", this);} // tgen
ee30762 ::ee30762(){ note_ctor("ee30762", this);} // tgen

static void Test_ee30762()
{
  extern Class_Descriptor cd_ee30762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee30762, buf);
    ee30762 *dp, &lv = *(dp=new (buf) ee30762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee30762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee30762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee30762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(32,20), "ee30762");
    check_base_class_offset(lv, (cc762*)(dd0762*), ABISELECT(16,8), "ee30762");
    check_base_class_offset(lv, (dd0762*), ABISELECT(16,8), "ee30762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee30762.e");
    test_class_info(&lv, &cd_ee30762);
    dp->~ee30762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee30762(Test_ee30762, "ee30762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee30762C1Ev();
extern void _ZN7ee30762D1Ev();
Name_Map name_map_ee30762[] = {
  NSPAIR(_ZN7ee30762C1Ev),
  NSPAIR(_ZN7ee30762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee30762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee30762[];
extern void _ZN7ee307623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee307623fooEv,_ZTv0_n16_N7ee307623fooEv)();
extern void ABISELECT(_ZThn16_N7ee307623fooEv,_ZThn8_N7ee307623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee307623fooEv,_ZTv0_n12_N7ee307623fooEv)();
extern void ABISELECT(_ZThn32_N7ee307623fooEv,_ZThn20_N7ee307623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee30762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee30762[0]),
  (VTBL_ENTRY)&_ZN7ee307623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee30762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee307623fooEv,_ZTv0_n16_N7ee307623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee30762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee307623fooEv,_ZTv0_n12_N7ee307623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee30762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee30762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee30762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee30762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee30762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee30762[] = {
  {&(_ZTV7ee30762[4]),  4,18},
  {&(_ZTV7ee30762[10]),  10,18},
  {&(_ZTV7ee30762[16]),  16,18},
  {&(_tg__ZTV6dd0762__7ee30762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee30762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee30762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee30762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee30762[];
extern  VTBL_ENTRY _ZTV7ee30762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee30762[];
static VTBL_ENTRY alt_thunk_names1328[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee307623fooEv,_ZTv0_n12_N7ee307623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee307623fooEv,_ZThn20_N7ee307623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee307623fooEv,_ZTv0_n16_N7ee307623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee307623fooEv,_ZThn8_N7ee307623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee30762 = {  "ee30762", // class name
  bases_ee30762, 4,
  &(vtc_ee30762[0]), // expected_vtbl_contents
  &(vtt_ee30762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee30762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee30762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee30762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1328,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee40762  : dd0762 {
  int e;
  virtual void  bar(); // _ZN7ee407623barEv
  ~ee40762(); // tgen
  ee40762(); // tgen
};
//SIG(1 ee40762) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee40762 ::bar(){vfunc_called(this, "_ZN7ee407623barEv");}
ee40762 ::~ee40762(){ note_dtor("ee40762", this);} // tgen
ee40762 ::ee40762(){ note_ctor("ee40762", this);} // tgen

static void Test_ee40762()
{
  extern Class_Descriptor cd_ee40762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee40762, buf);
    ee40762 *dp, &lv = *(dp=new (buf) ee40762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee40762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee40762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee40762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(24,16), "ee40762");
    check_base_class_offset(lv, (cc762*)(dd0762*), 0, "ee40762");
    check_base_class_offset(lv, (dd0762*), 0, "ee40762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee40762.e");
    test_class_info(&lv, &cd_ee40762);
    dp->~ee40762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee40762(Test_ee40762, "ee40762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee40762C1Ev();
extern void _ZN7ee40762D1Ev();
Name_Map name_map_ee40762[] = {
  NSPAIR(_ZN7ee40762C1Ev),
  NSPAIR(_ZN7ee40762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee40762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee40762[];
extern void _ZN5cc7623fooEv();
extern void _ZN7ee407623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee407623barEv,_ZTv0_n16_N7ee407623barEv)();
extern void ABISELECT(_ZThn24_N7ee407623barEv,_ZThn16_N7ee407623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee40762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee40762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN7ee407623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee40762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee407623barEv,_ZTv0_n16_N7ee407623barEv),
};
extern VTBL_ENTRY _ZTV7ee40762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee40762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee40762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee40762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee40762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee40762[] = {
  {&(_ZTV7ee40762[3]),  3,11},
  {&(_tg__ZTV6dd0762__7ee40762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee40762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee40762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee40762[4]),  4,6},
  {&(_ZTV7ee40762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee40762[];
extern  VTBL_ENTRY _ZTV7ee40762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee40762[];
static VTBL_ENTRY alt_thunk_names1329[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee407623barEv,_ZTv0_n16_N7ee407623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee407623barEv,_ZThn16_N7ee407623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee40762 = {  "ee40762", // class name
  bases_ee40762, 4,
  &(vtc_ee40762[0]), // expected_vtbl_contents
  &(vtt_ee40762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee40762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee40762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee40762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1329,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee50762  : virtual dd0762 {
  int e;
  virtual void  bar(); // _ZN7ee507623barEv
  ~ee50762(); // tgen
  ee50762(); // tgen
};
//SIG(1 ee50762) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee50762 ::bar(){vfunc_called(this, "_ZN7ee507623barEv");}
ee50762 ::~ee50762(){ note_dtor("ee50762", this);} // tgen
ee50762 ::ee50762(){ note_ctor("ee50762", this);} // tgen

static void Test_ee50762()
{
  extern Class_Descriptor cd_ee50762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee50762, buf);
    ee50762 *dp, &lv = *(dp=new (buf) ee50762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee50762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee50762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee50762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(32,20), "ee50762");
    check_base_class_offset(lv, (cc762*)(dd0762*), ABISELECT(16,8), "ee50762");
    check_base_class_offset(lv, (dd0762*), ABISELECT(16,8), "ee50762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee50762.e");
    test_class_info(&lv, &cd_ee50762);
    dp->~ee50762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee50762(Test_ee50762, "ee50762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee50762C1Ev();
extern void _ZN7ee50762D1Ev();
Name_Map name_map_ee50762[] = {
  NSPAIR(_ZN7ee50762C1Ev),
  NSPAIR(_ZN7ee50762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee50762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee50762[];
extern void _ZN7ee507623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee507623barEv,_ZTv0_n20_N7ee507623barEv)();
extern void ABISELECT(_ZThn16_N7ee507623barEv,_ZThn8_N7ee507623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee507623barEv,_ZTv0_n16_N7ee507623barEv)();
extern void ABISELECT(_ZThn32_N7ee507623barEv,_ZThn20_N7ee507623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee50762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee50762[0]),
  (VTBL_ENTRY)&_ZN7ee507623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee50762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee507623barEv,_ZTv0_n20_N7ee507623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee50762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee507623barEv,_ZTv0_n16_N7ee507623barEv),
};
extern VTBL_ENTRY _ZTV7ee50762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee50762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee50762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee50762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee50762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee50762[] = {
  {&(_ZTV7ee50762[4]),  4,18},
  {&(_ZTV7ee50762[10]),  10,18},
  {&(_ZTV7ee50762[16]),  16,18},
  {&(_tg__ZTV6dd0762__7ee50762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee50762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee50762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee50762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee50762[];
extern  VTBL_ENTRY _ZTV7ee50762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee50762[];
static VTBL_ENTRY alt_thunk_names1330[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee507623barEv,_ZTv0_n16_N7ee507623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee507623barEv,_ZThn20_N7ee507623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee507623barEv,_ZTv0_n20_N7ee507623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee507623barEv,_ZThn8_N7ee507623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee50762 = {  "ee50762", // class name
  bases_ee50762, 4,
  &(vtc_ee50762[0]), // expected_vtbl_contents
  &(vtt_ee50762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee50762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee50762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee50762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1330,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee60762  : dd0762 {
  int e;
  virtual void  foo(); // _ZN7ee607623fooEv
  virtual void  bar(); // _ZN7ee607623barEv
  ~ee60762(); // tgen
  ee60762(); // tgen
};
//SIG(1 ee60762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee60762 ::foo(){vfunc_called(this, "_ZN7ee607623fooEv");}
void  ee60762 ::bar(){vfunc_called(this, "_ZN7ee607623barEv");}
ee60762 ::~ee60762(){ note_dtor("ee60762", this);} // tgen
ee60762 ::ee60762(){ note_ctor("ee60762", this);} // tgen

static void Test_ee60762()
{
  extern Class_Descriptor cd_ee60762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee60762, buf);
    ee60762 *dp, &lv = *(dp=new (buf) ee60762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee60762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee60762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee60762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(24,16), "ee60762");
    check_base_class_offset(lv, (cc762*)(dd0762*), 0, "ee60762");
    check_base_class_offset(lv, (dd0762*), 0, "ee60762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee60762.e");
    test_class_info(&lv, &cd_ee60762);
    dp->~ee60762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee60762(Test_ee60762, "ee60762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee60762C1Ev();
extern void _ZN7ee60762D1Ev();
Name_Map name_map_ee60762[] = {
  NSPAIR(_ZN7ee60762C1Ev),
  NSPAIR(_ZN7ee60762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee60762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee60762[];
extern void _ZN7ee607623fooEv();
extern void _ZN7ee607623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee607623fooEv,_ZTv0_n12_N7ee607623fooEv)();
extern void ABISELECT(_ZThn24_N7ee607623fooEv,_ZThn16_N7ee607623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee607623barEv,_ZTv0_n16_N7ee607623barEv)();
extern void ABISELECT(_ZThn24_N7ee607623barEv,_ZThn16_N7ee607623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee60762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee60762[0]),
  (VTBL_ENTRY)&_ZN7ee607623fooEv,
  (VTBL_ENTRY)&_ZN7ee607623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee60762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee607623fooEv,_ZTv0_n12_N7ee607623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee607623barEv,_ZTv0_n16_N7ee607623barEv),
};
extern VTBL_ENTRY _ZTV7ee60762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee60762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee60762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee60762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee60762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee60762[] = {
  {&(_ZTV7ee60762[3]),  3,11},
  {&(_tg__ZTV6dd0762__7ee60762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee60762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee60762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee60762[4]),  4,6},
  {&(_ZTV7ee60762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee60762[];
extern  VTBL_ENTRY _ZTV7ee60762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee60762[];
static VTBL_ENTRY alt_thunk_names1331[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee607623barEv,_ZTv0_n16_N7ee607623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee607623barEv,_ZThn16_N7ee607623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee607623fooEv,_ZTv0_n12_N7ee607623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee607623fooEv,_ZThn16_N7ee607623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee60762 = {  "ee60762", // class name
  bases_ee60762, 4,
  &(vtc_ee60762[0]), // expected_vtbl_contents
  &(vtt_ee60762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee60762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee60762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee60762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1331,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee70762  : virtual dd0762 {
  int e;
  virtual void  foo(); // _ZN7ee707623fooEv
  virtual void  bar(); // _ZN7ee707623barEv
  ~ee70762(); // tgen
  ee70762(); // tgen
};
//SIG(1 ee70762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee70762 ::foo(){vfunc_called(this, "_ZN7ee707623fooEv");}
void  ee70762 ::bar(){vfunc_called(this, "_ZN7ee707623barEv");}
ee70762 ::~ee70762(){ note_dtor("ee70762", this);} // tgen
ee70762 ::ee70762(){ note_ctor("ee70762", this);} // tgen

static void Test_ee70762()
{
  extern Class_Descriptor cd_ee70762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee70762, buf);
    ee70762 *dp, &lv = *(dp=new (buf) ee70762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee70762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee70762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee70762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd0762*), ABISELECT(32,20), "ee70762");
    check_base_class_offset(lv, (cc762*)(dd0762*), ABISELECT(16,8), "ee70762");
    check_base_class_offset(lv, (dd0762*), ABISELECT(16,8), "ee70762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee70762.e");
    test_class_info(&lv, &cd_ee70762);
    dp->~ee70762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee70762(Test_ee70762, "ee70762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee70762C1Ev();
extern void _ZN7ee70762D1Ev();
Name_Map name_map_ee70762[] = {
  NSPAIR(_ZN7ee70762C1Ev),
  NSPAIR(_ZN7ee70762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd0762;
extern VTBL_ENTRY _ZTI6dd0762[];
extern  VTBL_ENTRY _ZTV6dd0762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd0762[];
static Base_Class bases_ee70762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd0762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee70762[];
extern void _ZN7ee707623fooEv();
extern void _ZN7ee707623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee707623fooEv,_ZTv0_n16_N7ee707623fooEv)();
extern void ABISELECT(_ZThn16_N7ee707623fooEv,_ZThn8_N7ee707623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee707623barEv,_ZTv0_n20_N7ee707623barEv)();
extern void ABISELECT(_ZThn16_N7ee707623barEv,_ZThn8_N7ee707623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee707623fooEv,_ZTv0_n12_N7ee707623fooEv)();
extern void ABISELECT(_ZThn32_N7ee707623fooEv,_ZThn20_N7ee707623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee707623barEv,_ZTv0_n16_N7ee707623barEv)();
extern void ABISELECT(_ZThn32_N7ee707623barEv,_ZThn20_N7ee707623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee70762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee70762[0]),
  (VTBL_ENTRY)&_ZN7ee707623fooEv,
  (VTBL_ENTRY)&_ZN7ee707623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee70762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee707623fooEv,_ZTv0_n16_N7ee707623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee707623barEv,_ZTv0_n20_N7ee707623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee70762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee707623fooEv,_ZTv0_n12_N7ee707623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee707623barEv,_ZTv0_n16_N7ee707623barEv),
};
extern VTBL_ENTRY _ZTV7ee70762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd0762__7ee70762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd0762__7ee70762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd0762__7ee70762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd0762__7ee70762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd0762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee70762[] = {
  {&(_ZTV7ee70762[4]),  4,19},
  {&(_ZTV7ee70762[11]),  11,19},
  {&(_ZTV7ee70762[17]),  17,19},
  {&(_tg__ZTV6dd0762__7ee70762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd0762__7ee70762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd0762__7ee70762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd0762__7ee70762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee70762[];
extern  VTBL_ENTRY _ZTV7ee70762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee70762[];
static VTBL_ENTRY alt_thunk_names1332[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee707623barEv,_ZTv0_n16_N7ee707623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee707623barEv,_ZThn20_N7ee707623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee707623fooEv,_ZTv0_n12_N7ee707623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee707623fooEv,_ZThn20_N7ee707623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee707623barEv,_ZTv0_n20_N7ee707623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee707623barEv,_ZThn8_N7ee707623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee707623fooEv,_ZTv0_n16_N7ee707623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee707623fooEv,_ZThn8_N7ee707623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee70762 = {  "ee70762", // class name
  bases_ee70762, 4,
  &(vtc_ee70762[0]), // expected_vtbl_contents
  &(vtt_ee70762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee70762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee70762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee70762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1332,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd1762  : virtual cc762 {
  int d;
  ~dd1762(); // tgen
  dd1762(); // tgen
};
//SIG(-1 dd1762) C1{ VBC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


dd1762 ::~dd1762(){ note_dtor("dd1762", this);} // tgen
dd1762 ::dd1762(){ note_ctor("dd1762", this);} // tgen

static void Test_dd1762()
{
  extern Class_Descriptor cd_dd1762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd1762, buf);
    dd1762 *dp, &lv = *(dp=new (buf) dd1762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd1762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd1762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd1762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,16), "dd1762");
    check_base_class_offset(lv, (cc762*), ABISELECT(16,8), "dd1762");
    check_field_offset(lv, d, ABISELECT(8,4), "dd1762.d");
    test_class_info(&lv, &cd_dd1762);
    dp->~dd1762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd1762(Test_dd1762, "dd1762", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd1762C1Ev();
extern void _ZN6dd1762D1Ev();
Name_Map name_map_dd1762[] = {
  NSPAIR(_ZN6dd1762C1Ev),
  NSPAIR(_ZN6dd1762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd1762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc762,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd1762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd1762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV6dd1762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd1762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd1762[] = {
  {&(_ZTV6dd1762[4]),  4,17},
  {&(_ZTV6dd1762[9]),  9,17},
  {&(_ZTV6dd1762[15]),  15,17},
  {&(_tg__ZTV5cc762__6dd1762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd1762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static VTBL_ENTRY alt_thunk_names1333[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd1762 = {  "dd1762", // class name
  bases_dd1762, 3,
  &(vtc_dd1762[0]), // expected_vtbl_contents
  &(vtt_dd1762[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd1762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd1762),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd1762),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1333,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee01762  : dd1762 {
  int e;
  ~ee01762(); // tgen
  ee01762(); // tgen
};
//SIG(1 ee01762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee01762 ::~ee01762(){ note_dtor("ee01762", this);} // tgen
ee01762 ::ee01762(){ note_ctor("ee01762", this);} // tgen

static void Test_ee01762()
{
  extern Class_Descriptor cd_ee01762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee01762, buf);
    ee01762 *dp, &lv = *(dp=new (buf) ee01762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee01762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee01762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee01762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee01762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(16,12), "ee01762");
    check_base_class_offset(lv, (dd1762*), 0, "ee01762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee01762.e");
    test_class_info(&lv, &cd_ee01762);
    dp->~ee01762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee01762(Test_ee01762, "ee01762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee01762C1Ev();
extern void _ZN7ee01762D1Ev();
Name_Map name_map_ee01762[] = {
  NSPAIR(_ZN7ee01762C1Ev),
  NSPAIR(_ZN7ee01762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee01762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //bcp->offset
    4, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee01762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee01762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee01762[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee01762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee01762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee01762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee01762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee01762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee01762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee01762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee01762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee01762[] = {
  {&(_ZTV7ee01762[4]),  4,17},
  {&(_tg__ZTV6dd1762__7ee01762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee01762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee01762[4]),  4,6},
  {&(_ZTV7ee01762[9]),  9,17},
  {&(_ZTV7ee01762[15]),  15,17},
  {&(_tg__ZTV5cc762__7ee01762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee01762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee01762[];
extern  VTBL_ENTRY _ZTV7ee01762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee01762[];
static VTBL_ENTRY alt_thunk_names1334[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee01762 = {  "ee01762", // class name
  bases_ee01762, 4,
  &(vtc_ee01762[0]), // expected_vtbl_contents
  &(vtt_ee01762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee01762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee01762),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee01762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1334,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee11762  : virtual dd1762 {
  int e;
  ~ee11762(); // tgen
  ee11762(); // tgen
};
//SIG(1 ee11762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} Fi}


ee11762 ::~ee11762(){ note_dtor("ee11762", this);} // tgen
ee11762 ::ee11762(){ note_ctor("ee11762", this);} // tgen

static void Test_ee11762()
{
  extern Class_Descriptor cd_ee11762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee11762, buf);
    ee11762 *dp, &lv = *(dp=new (buf) ee11762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee11762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee11762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee11762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee11762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(32,16), "ee11762");
    check_base_class_offset(lv, (dd1762*), ABISELECT(16,8), "ee11762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee11762.e");
    test_class_info(&lv, &cd_ee11762);
    dp->~ee11762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee11762(Test_ee11762, "ee11762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee11762C1Ev();
extern void _ZN7ee11762D1Ev();
Name_Map name_map_ee11762[] = {
  NSPAIR(_ZN7ee11762C1Ev),
  NSPAIR(_ZN7ee11762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee11762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    9, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee11762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee11762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee11762[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee11762[0]),
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee11762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee11762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee11762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee11762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee11762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee11762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee11762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee11762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee11762[] = {
  {&(_ZTV7ee11762[5]),  5,22},
  {&(_ZTV7ee11762[9]),  9,22},
  {&(_ZTV7ee11762[14]),  14,22},
  {&(_ZTV7ee11762[20]),  20,22},
  {&(_tg__ZTV6dd1762__7ee11762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee11762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee11762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee11762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee11762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee11762[];
extern  VTBL_ENTRY _ZTV7ee11762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee11762[];
static VTBL_ENTRY alt_thunk_names1335[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee11762 = {  "ee11762", // class name
  bases_ee11762, 4,
  &(vtc_ee11762[0]), // expected_vtbl_contents
  &(vtt_ee11762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee11762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee11762),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee11762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1335,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee21762  : dd1762 {
  int e;
  virtual void  foo(); // _ZN7ee217623fooEv
  ~ee21762(); // tgen
  ee21762(); // tgen
};
//SIG(1 ee21762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee21762 ::foo(){vfunc_called(this, "_ZN7ee217623fooEv");}
ee21762 ::~ee21762(){ note_dtor("ee21762", this);} // tgen
ee21762 ::ee21762(){ note_ctor("ee21762", this);} // tgen

static void Test_ee21762()
{
  extern Class_Descriptor cd_ee21762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee21762, buf);
    ee21762 *dp, &lv = *(dp=new (buf) ee21762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee21762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee21762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee21762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee21762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(16,12), "ee21762");
    check_base_class_offset(lv, (dd1762*), 0, "ee21762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee21762.e");
    test_class_info(&lv, &cd_ee21762);
    dp->~ee21762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee21762(Test_ee21762, "ee21762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee21762C1Ev();
extern void _ZN7ee21762D1Ev();
Name_Map name_map_ee21762[] = {
  NSPAIR(_ZN7ee21762C1Ev),
  NSPAIR(_ZN7ee21762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee21762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee21762[];
extern void _ZN7ee217623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee217623fooEv,_ZTv0_n16_N7ee217623fooEv)();
extern void ABISELECT(_ZThn16_N7ee217623fooEv,_ZThn12_N7ee217623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee217623fooEv,_ZTv0_n12_N7ee217623fooEv)();
extern void ABISELECT(_ZThn32_N7ee217623fooEv,_ZThn20_N7ee217623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee21762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee21762[0]),
  (VTBL_ENTRY)&_ZN7ee217623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee21762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee217623fooEv,_ZTv0_n16_N7ee217623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee21762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee217623fooEv,_ZTv0_n12_N7ee217623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee21762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee21762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee21762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee21762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee21762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee21762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee21762[] = {
  {&(_ZTV7ee21762[4]),  4,18},
  {&(_tg__ZTV6dd1762__7ee21762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee21762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee21762[4]),  4,6},
  {&(_ZTV7ee21762[10]),  10,18},
  {&(_ZTV7ee21762[16]),  16,18},
  {&(_tg__ZTV5cc762__7ee21762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee21762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee21762[];
extern  VTBL_ENTRY _ZTV7ee21762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee21762[];
static VTBL_ENTRY alt_thunk_names1336[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee217623fooEv,_ZTv0_n12_N7ee217623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee217623fooEv,_ZThn20_N7ee217623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee217623fooEv,_ZTv0_n16_N7ee217623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee217623fooEv,_ZThn12_N7ee217623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee21762 = {  "ee21762", // class name
  bases_ee21762, 4,
  &(vtc_ee21762[0]), // expected_vtbl_contents
  &(vtt_ee21762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee21762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee21762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee21762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1336,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee31762  : virtual dd1762 {
  int e;
  virtual void  foo(); // _ZN7ee317623fooEv
  ~ee31762(); // tgen
  ee31762(); // tgen
};
//SIG(1 ee31762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 Fi}


void  ee31762 ::foo(){vfunc_called(this, "_ZN7ee317623fooEv");}
ee31762 ::~ee31762(){ note_dtor("ee31762", this);} // tgen
ee31762 ::ee31762(){ note_ctor("ee31762", this);} // tgen

static void Test_ee31762()
{
  extern Class_Descriptor cd_ee31762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee31762, buf);
    ee31762 *dp, &lv = *(dp=new (buf) ee31762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee31762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee31762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee31762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee31762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(32,16), "ee31762");
    check_base_class_offset(lv, (dd1762*), ABISELECT(16,8), "ee31762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee31762.e");
    test_class_info(&lv, &cd_ee31762);
    dp->~ee31762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee31762(Test_ee31762, "ee31762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee31762C1Ev();
extern void _ZN7ee31762D1Ev();
Name_Map name_map_ee31762[] = {
  NSPAIR(_ZN7ee31762C1Ev),
  NSPAIR(_ZN7ee31762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee31762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    10, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee31762[];
extern void _ZN7ee317623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee317623fooEv,_ZTv0_n16_N7ee317623fooEv)();
extern void ABISELECT(_ZThn32_N7ee317623fooEv,_ZThn16_N7ee317623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee317623fooEv,_ZTv0_n12_N7ee317623fooEv)();
extern void ABISELECT(_ZThn48_N7ee317623fooEv,_ZThn24_N7ee317623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee31762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee31762[0]),
  (VTBL_ENTRY)&_ZN7ee317623fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee31762[0]),
  0,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee31762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee317623fooEv,_ZTv0_n16_N7ee317623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee31762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee317623fooEv,_ZTv0_n12_N7ee317623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee31762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee31762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee31762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee31762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee31762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee31762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee31762[] = {
  {&(_ZTV7ee31762[5]),  5,23},
  {&(_ZTV7ee31762[10]),  10,23},
  {&(_ZTV7ee31762[15]),  15,23},
  {&(_ZTV7ee31762[21]),  21,23},
  {&(_tg__ZTV6dd1762__7ee31762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee31762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee31762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee31762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee31762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee31762[];
extern  VTBL_ENTRY _ZTV7ee31762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee31762[];
static VTBL_ENTRY alt_thunk_names1337[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee317623fooEv,_ZTv0_n12_N7ee317623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee317623fooEv,_ZThn24_N7ee317623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee317623fooEv,_ZTv0_n16_N7ee317623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee317623fooEv,_ZThn16_N7ee317623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee31762 = {  "ee31762", // class name
  bases_ee31762, 4,
  &(vtc_ee31762[0]), // expected_vtbl_contents
  &(vtt_ee31762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee31762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee31762),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee31762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1337,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee41762  : dd1762 {
  int e;
  virtual void  bar(); // _ZN7ee417623barEv
  ~ee41762(); // tgen
  ee41762(); // tgen
};
//SIG(1 ee41762) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee41762 ::bar(){vfunc_called(this, "_ZN7ee417623barEv");}
ee41762 ::~ee41762(){ note_dtor("ee41762", this);} // tgen
ee41762 ::ee41762(){ note_ctor("ee41762", this);} // tgen

static void Test_ee41762()
{
  extern Class_Descriptor cd_ee41762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee41762, buf);
    ee41762 *dp, &lv = *(dp=new (buf) ee41762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee41762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee41762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee41762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee41762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(16,12), "ee41762");
    check_base_class_offset(lv, (dd1762*), 0, "ee41762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee41762.e");
    test_class_info(&lv, &cd_ee41762);
    dp->~ee41762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee41762(Test_ee41762, "ee41762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee41762C1Ev();
extern void _ZN7ee41762D1Ev();
Name_Map name_map_ee41762[] = {
  NSPAIR(_ZN7ee41762C1Ev),
  NSPAIR(_ZN7ee41762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee41762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee41762[];
extern void _ZN7ee417623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee417623barEv,_ZTv0_n20_N7ee417623barEv)();
extern void ABISELECT(_ZThn16_N7ee417623barEv,_ZThn12_N7ee417623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee417623barEv,_ZTv0_n16_N7ee417623barEv)();
extern void ABISELECT(_ZThn32_N7ee417623barEv,_ZThn20_N7ee417623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee41762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee41762[0]),
  (VTBL_ENTRY)&_ZN7ee417623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee41762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee417623barEv,_ZTv0_n20_N7ee417623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee41762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee417623barEv,_ZTv0_n16_N7ee417623barEv),
};
extern VTBL_ENTRY _ZTV7ee41762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee41762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee41762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee41762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee41762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee41762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee41762[] = {
  {&(_ZTV7ee41762[4]),  4,18},
  {&(_tg__ZTV6dd1762__7ee41762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee41762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee41762[4]),  4,6},
  {&(_ZTV7ee41762[10]),  10,18},
  {&(_ZTV7ee41762[16]),  16,18},
  {&(_tg__ZTV5cc762__7ee41762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee41762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee41762[];
extern  VTBL_ENTRY _ZTV7ee41762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee41762[];
static VTBL_ENTRY alt_thunk_names1338[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee417623barEv,_ZTv0_n16_N7ee417623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee417623barEv,_ZThn20_N7ee417623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee417623barEv,_ZTv0_n20_N7ee417623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee417623barEv,_ZThn12_N7ee417623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee41762 = {  "ee41762", // class name
  bases_ee41762, 4,
  &(vtc_ee41762[0]), // expected_vtbl_contents
  &(vtt_ee41762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee41762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee41762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee41762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1338,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee51762  : virtual dd1762 {
  int e;
  virtual void  bar(); // _ZN7ee517623barEv
  ~ee51762(); // tgen
  ee51762(); // tgen
};
//SIG(1 ee51762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} Fi} v1 Fi}


void  ee51762 ::bar(){vfunc_called(this, "_ZN7ee517623barEv");}
ee51762 ::~ee51762(){ note_dtor("ee51762", this);} // tgen
ee51762 ::ee51762(){ note_ctor("ee51762", this);} // tgen

static void Test_ee51762()
{
  extern Class_Descriptor cd_ee51762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee51762, buf);
    ee51762 *dp, &lv = *(dp=new (buf) ee51762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee51762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee51762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee51762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee51762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(32,16), "ee51762");
    check_base_class_offset(lv, (dd1762*), ABISELECT(16,8), "ee51762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee51762.e");
    test_class_info(&lv, &cd_ee51762);
    dp->~ee51762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee51762(Test_ee51762, "ee51762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee51762C1Ev();
extern void _ZN7ee51762D1Ev();
Name_Map name_map_ee51762[] = {
  NSPAIR(_ZN7ee51762C1Ev),
  NSPAIR(_ZN7ee51762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee51762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    17, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    10, //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee51762[];
extern void _ZN7ee517623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee517623barEv,_ZTv0_n20_N7ee517623barEv)();
extern void ABISELECT(_ZThn32_N7ee517623barEv,_ZThn16_N7ee517623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee517623barEv,_ZTv0_n16_N7ee517623barEv)();
extern void ABISELECT(_ZThn48_N7ee517623barEv,_ZThn24_N7ee517623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee51762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee51762[0]),
  (VTBL_ENTRY)&_ZN7ee517623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee51762[0]),
  ABISELECT(-32,-16),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee51762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee517623barEv,_ZTv0_n20_N7ee517623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee51762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee517623barEv,_ZTv0_n16_N7ee517623barEv),
};
extern VTBL_ENTRY _ZTV7ee51762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee51762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee51762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee51762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee51762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee51762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee51762[] = {
  {&(_ZTV7ee51762[5]),  5,23},
  {&(_ZTV7ee51762[10]),  10,23},
  {&(_ZTV7ee51762[15]),  15,23},
  {&(_ZTV7ee51762[21]),  21,23},
  {&(_tg__ZTV6dd1762__7ee51762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee51762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee51762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee51762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee51762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee51762[];
extern  VTBL_ENTRY _ZTV7ee51762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee51762[];
static VTBL_ENTRY alt_thunk_names1339[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee517623barEv,_ZTv0_n16_N7ee517623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee517623barEv,_ZThn24_N7ee517623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee517623barEv,_ZTv0_n20_N7ee517623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee517623barEv,_ZThn16_N7ee517623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee51762 = {  "ee51762", // class name
  bases_ee51762, 4,
  &(vtc_ee51762[0]), // expected_vtbl_contents
  &(vtt_ee51762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee51762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee51762),23, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee51762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1339,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee61762  : dd1762 {
  int e;
  virtual void  foo(); // _ZN7ee617623fooEv
  virtual void  bar(); // _ZN7ee617623barEv
  ~ee61762(); // tgen
  ee61762(); // tgen
};
//SIG(1 ee61762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee61762 ::foo(){vfunc_called(this, "_ZN7ee617623fooEv");}
void  ee61762 ::bar(){vfunc_called(this, "_ZN7ee617623barEv");}
ee61762 ::~ee61762(){ note_dtor("ee61762", this);} // tgen
ee61762 ::ee61762(){ note_ctor("ee61762", this);} // tgen

static void Test_ee61762()
{
  extern Class_Descriptor cd_ee61762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee61762, buf);
    ee61762 *dp, &lv = *(dp=new (buf) ee61762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee61762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee61762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee61762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee61762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(16,12), "ee61762");
    check_base_class_offset(lv, (dd1762*), 0, "ee61762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee61762.e");
    test_class_info(&lv, &cd_ee61762);
    dp->~ee61762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee61762(Test_ee61762, "ee61762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee61762C1Ev();
extern void _ZN7ee61762D1Ev();
Name_Map name_map_ee61762[] = {
  NSPAIR(_ZN7ee61762C1Ev),
  NSPAIR(_ZN7ee61762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee61762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee61762[];
extern void _ZN7ee617623fooEv();
extern void _ZN7ee617623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee617623fooEv,_ZTv0_n16_N7ee617623fooEv)();
extern void ABISELECT(_ZThn16_N7ee617623fooEv,_ZThn12_N7ee617623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee617623barEv,_ZTv0_n20_N7ee617623barEv)();
extern void ABISELECT(_ZThn16_N7ee617623barEv,_ZThn12_N7ee617623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee617623fooEv,_ZTv0_n12_N7ee617623fooEv)();
extern void ABISELECT(_ZThn32_N7ee617623fooEv,_ZThn20_N7ee617623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee617623barEv,_ZTv0_n16_N7ee617623barEv)();
extern void ABISELECT(_ZThn32_N7ee617623barEv,_ZThn20_N7ee617623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee61762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee61762[0]),
  (VTBL_ENTRY)&_ZN7ee617623fooEv,
  (VTBL_ENTRY)&_ZN7ee617623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee61762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee617623fooEv,_ZTv0_n16_N7ee617623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee617623barEv,_ZTv0_n20_N7ee617623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee61762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee617623fooEv,_ZTv0_n12_N7ee617623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee617623barEv,_ZTv0_n16_N7ee617623barEv),
};
extern VTBL_ENTRY _ZTV7ee61762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee61762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee61762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee61762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee61762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee61762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee61762[] = {
  {&(_ZTV7ee61762[4]),  4,19},
  {&(_tg__ZTV6dd1762__7ee61762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee61762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee61762[4]),  4,6},
  {&(_ZTV7ee61762[11]),  11,19},
  {&(_ZTV7ee61762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee61762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee61762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee61762[];
extern  VTBL_ENTRY _ZTV7ee61762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee61762[];
static VTBL_ENTRY alt_thunk_names1340[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee617623barEv,_ZTv0_n16_N7ee617623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee617623barEv,_ZThn20_N7ee617623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee617623fooEv,_ZTv0_n12_N7ee617623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee617623fooEv,_ZThn20_N7ee617623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee617623barEv,_ZTv0_n20_N7ee617623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee617623barEv,_ZThn12_N7ee617623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee617623fooEv,_ZTv0_n16_N7ee617623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee617623fooEv,_ZThn12_N7ee617623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee61762 = {  "ee61762", // class name
  bases_ee61762, 4,
  &(vtc_ee61762[0]), // expected_vtbl_contents
  &(vtt_ee61762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee61762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee61762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee61762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1340,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee71762  : virtual dd1762 {
  int e;
  virtual void  foo(); // _ZN7ee717623fooEv
  virtual void  bar(); // _ZN7ee717623barEv
  ~ee71762(); // tgen
  ee71762(); // tgen
};
//SIG(1 ee71762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi} v1 v2 Fi}


void  ee71762 ::foo(){vfunc_called(this, "_ZN7ee717623fooEv");}
void  ee71762 ::bar(){vfunc_called(this, "_ZN7ee717623barEv");}
ee71762 ::~ee71762(){ note_dtor("ee71762", this);} // tgen
ee71762 ::ee71762(){ note_ctor("ee71762", this);} // tgen

static void Test_ee71762()
{
  extern Class_Descriptor cd_ee71762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee71762, buf);
    ee71762 *dp, &lv = *(dp=new (buf) ee71762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee71762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee71762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee71762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee71762");
    check_base_class_offset(lv, (cc762*)(dd1762*), ABISELECT(32,16), "ee71762");
    check_base_class_offset(lv, (dd1762*), ABISELECT(16,8), "ee71762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee71762.e");
    test_class_info(&lv, &cd_ee71762);
    dp->~ee71762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee71762(Test_ee71762, "ee71762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee71762C1Ev();
extern void _ZN7ee71762D1Ev();
Name_Map name_map_ee71762[] = {
  NSPAIR(_ZN7ee71762C1Ev),
  NSPAIR(_ZN7ee71762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd1762;
extern VTBL_ENTRY _ZTI6dd1762[];
extern  VTBL_ENTRY _ZTV6dd1762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd1762[];
static Base_Class bases_ee71762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd1762,    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
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee71762[];
extern void _ZN7ee717623fooEv();
extern void _ZN7ee717623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee717623fooEv,_ZTv0_n16_N7ee717623fooEv)();
extern void ABISELECT(_ZThn32_N7ee717623fooEv,_ZThn16_N7ee717623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee717623barEv,_ZTv0_n20_N7ee717623barEv)();
extern void ABISELECT(_ZThn32_N7ee717623barEv,_ZThn16_N7ee717623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee717623fooEv,_ZTv0_n12_N7ee717623fooEv)();
extern void ABISELECT(_ZThn48_N7ee717623fooEv,_ZThn24_N7ee717623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee717623barEv,_ZTv0_n16_N7ee717623barEv)();
extern void ABISELECT(_ZThn48_N7ee717623barEv,_ZThn24_N7ee717623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee71762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee71762[0]),
  (VTBL_ENTRY)&_ZN7ee717623fooEv,
  (VTBL_ENTRY)&_ZN7ee717623barEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee71762[0]),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee71762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee717623fooEv,_ZTv0_n16_N7ee717623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee717623barEv,_ZTv0_n20_N7ee717623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee71762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee717623fooEv,_ZTv0_n12_N7ee717623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee717623barEv,_ZTv0_n16_N7ee717623barEv),
};
extern VTBL_ENTRY _ZTV7ee71762[];
static  VTBL_ENTRY _tg__ZTV6dd1762__7ee71762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd1762__7ee71762[] = {
  0,
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd1762__7ee71762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd1762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee71762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee71762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee71762[] = {
  {&(_ZTV7ee71762[5]),  5,24},
  {&(_ZTV7ee71762[11]),  11,24},
  {&(_ZTV7ee71762[16]),  16,24},
  {&(_ZTV7ee71762[22]),  22,24},
  {&(_tg__ZTV6dd1762__7ee71762[4]),  4,4},
  {&(_tg__ZTV5cc762__6dd1762__7ee71762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd1762__7ee71762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee71762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee71762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee71762[];
extern  VTBL_ENTRY _ZTV7ee71762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee71762[];
static VTBL_ENTRY alt_thunk_names1341[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee717623barEv,_ZTv0_n16_N7ee717623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee717623barEv,_ZThn24_N7ee717623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee717623fooEv,_ZTv0_n12_N7ee717623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee717623fooEv,_ZThn24_N7ee717623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee717623barEv,_ZTv0_n20_N7ee717623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee717623barEv,_ZThn16_N7ee717623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee717623fooEv,_ZTv0_n16_N7ee717623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee717623fooEv,_ZThn16_N7ee717623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee71762 = {  "ee71762", // class name
  bases_ee71762, 4,
  &(vtc_ee71762[0]), // expected_vtbl_contents
  &(vtt_ee71762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee71762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee71762),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee71762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1341,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd2762  : cc762 {
  int d;
  virtual void  foo(); // _ZN6dd27623fooEv
  ~dd2762(); // tgen
  dd2762(); // tgen
};
//SIG(-1 dd2762) C1{ BC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd2762 ::foo(){vfunc_called(this, "_ZN6dd27623fooEv");}
dd2762 ::~dd2762(){ note_dtor("dd2762", this);} // tgen
dd2762 ::dd2762(){ note_ctor("dd2762", this);} // tgen

static void Test_dd2762()
{
  extern Class_Descriptor cd_dd2762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd2762, buf);
    dd2762 *dp, &lv = *(dp=new (buf) dd2762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd2762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd2762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd2762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(16,12), "dd2762");
    check_base_class_offset(lv, (cc762*), 0, "dd2762");
    check_field_offset(lv, d, ABISELECT(12,8), "dd2762.d");
    test_class_info(&lv, &cd_dd2762);
    dp->~dd2762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd2762(Test_dd2762, "dd2762", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd2762C1Ev();
extern void _ZN6dd2762D1Ev();
Name_Map name_map_dd2762[] = {
  NSPAIR(_ZN6dd2762C1Ev),
  NSPAIR(_ZN6dd2762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd2762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd2762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd2762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV6dd2762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd2762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd2762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd2762[] = {
  {&(_ZTV6dd2762[3]),  3,11},
  {&(_tg__ZTV5cc762__6dd2762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd2762[4]),  4,6},
  {&(_ZTV6dd2762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static VTBL_ENTRY alt_thunk_names1342[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd2762 = {  "dd2762", // class name
  bases_dd2762, 3,
  &(vtc_dd2762[0]), // expected_vtbl_contents
  &(vtt_dd2762[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd2762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd2762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd2762),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1342,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee02762  : dd2762 {
  int e;
  ~ee02762(); // tgen
  ee02762(); // tgen
};
//SIG(1 ee02762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee02762 ::~ee02762(){ note_dtor("ee02762", this);} // tgen
ee02762 ::ee02762(){ note_ctor("ee02762", this);} // tgen

static void Test_ee02762()
{
  extern Class_Descriptor cd_ee02762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee02762, buf);
    ee02762 *dp, &lv = *(dp=new (buf) ee02762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee02762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee02762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee02762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(24,16), "ee02762");
    check_base_class_offset(lv, (cc762*)(dd2762*), 0, "ee02762");
    check_base_class_offset(lv, (dd2762*), 0, "ee02762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee02762.e");
    test_class_info(&lv, &cd_ee02762);
    dp->~ee02762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee02762(Test_ee02762, "ee02762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee02762C1Ev();
extern void _ZN7ee02762D1Ev();
Name_Map name_map_ee02762[] = {
  NSPAIR(_ZN7ee02762C1Ev),
  NSPAIR(_ZN7ee02762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee02762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee02762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee02762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee02762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee02762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee02762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee02762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee02762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee02762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee02762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee02762[] = {
  {&(_ZTV7ee02762[3]),  3,11},
  {&(_tg__ZTV6dd2762__7ee02762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee02762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee02762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee02762[4]),  4,6},
  {&(_ZTV7ee02762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee02762[];
extern  VTBL_ENTRY _ZTV7ee02762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee02762[];
static VTBL_ENTRY alt_thunk_names1343[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee02762 = {  "ee02762", // class name
  bases_ee02762, 4,
  &(vtc_ee02762[0]), // expected_vtbl_contents
  &(vtt_ee02762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee02762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee02762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee02762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1343,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee12762  : virtual dd2762 {
  int e;
  ~ee12762(); // tgen
  ee12762(); // tgen
};
//SIG(1 ee12762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee12762 ::~ee12762(){ note_dtor("ee12762", this);} // tgen
ee12762 ::ee12762(){ note_ctor("ee12762", this);} // tgen

static void Test_ee12762()
{
  extern Class_Descriptor cd_ee12762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee12762, buf);
    ee12762 *dp, &lv = *(dp=new (buf) ee12762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee12762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee12762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee12762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(32,20), "ee12762");
    check_base_class_offset(lv, (cc762*)(dd2762*), ABISELECT(16,8), "ee12762");
    check_base_class_offset(lv, (dd2762*), ABISELECT(16,8), "ee12762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee12762.e");
    test_class_info(&lv, &cd_ee12762);
    dp->~ee12762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee12762(Test_ee12762, "ee12762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee12762C1Ev();
extern void _ZN7ee12762D1Ev();
Name_Map name_map_ee12762[] = {
  NSPAIR(_ZN7ee12762C1Ev),
  NSPAIR(_ZN7ee12762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee12762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee12762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee12762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee12762[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee12762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee12762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee12762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee12762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee12762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee12762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee12762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee12762[] = {
  {&(_ZTV7ee12762[4]),  4,17},
  {&(_ZTV7ee12762[9]),  9,17},
  {&(_ZTV7ee12762[15]),  15,17},
  {&(_tg__ZTV6dd2762__7ee12762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee12762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee12762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee12762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee12762[];
extern  VTBL_ENTRY _ZTV7ee12762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee12762[];
static VTBL_ENTRY alt_thunk_names1344[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee12762 = {  "ee12762", // class name
  bases_ee12762, 4,
  &(vtc_ee12762[0]), // expected_vtbl_contents
  &(vtt_ee12762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee12762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee12762),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee12762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1344,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee22762  : dd2762 {
  int e;
  virtual void  foo(); // _ZN7ee227623fooEv
  ~ee22762(); // tgen
  ee22762(); // tgen
};
//SIG(1 ee22762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee22762 ::foo(){vfunc_called(this, "_ZN7ee227623fooEv");}
ee22762 ::~ee22762(){ note_dtor("ee22762", this);} // tgen
ee22762 ::ee22762(){ note_ctor("ee22762", this);} // tgen

static void Test_ee22762()
{
  extern Class_Descriptor cd_ee22762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee22762, buf);
    ee22762 *dp, &lv = *(dp=new (buf) ee22762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee22762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee22762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee22762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(24,16), "ee22762");
    check_base_class_offset(lv, (cc762*)(dd2762*), 0, "ee22762");
    check_base_class_offset(lv, (dd2762*), 0, "ee22762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee22762.e");
    test_class_info(&lv, &cd_ee22762);
    dp->~ee22762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee22762(Test_ee22762, "ee22762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee22762C1Ev();
extern void _ZN7ee22762D1Ev();
Name_Map name_map_ee22762[] = {
  NSPAIR(_ZN7ee22762C1Ev),
  NSPAIR(_ZN7ee22762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee22762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee22762[];
extern void _ZN7ee227623fooEv();
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee227623fooEv,_ZTv0_n12_N7ee227623fooEv)();
extern void ABISELECT(_ZThn24_N7ee227623fooEv,_ZThn16_N7ee227623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee22762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee22762[0]),
  (VTBL_ENTRY)&_ZN7ee227623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee22762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee227623fooEv,_ZTv0_n12_N7ee227623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee22762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee22762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee22762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee22762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee22762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee22762[] = {
  {&(_ZTV7ee22762[3]),  3,11},
  {&(_tg__ZTV6dd2762__7ee22762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee22762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee22762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee22762[4]),  4,6},
  {&(_ZTV7ee22762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee22762[];
extern  VTBL_ENTRY _ZTV7ee22762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee22762[];
static VTBL_ENTRY alt_thunk_names1345[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee227623fooEv,_ZTv0_n12_N7ee227623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee227623fooEv,_ZThn16_N7ee227623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee22762 = {  "ee22762", // class name
  bases_ee22762, 4,
  &(vtc_ee22762[0]), // expected_vtbl_contents
  &(vtt_ee22762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee22762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee22762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee22762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1345,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee32762  : virtual dd2762 {
  int e;
  virtual void  foo(); // _ZN7ee327623fooEv
  ~ee32762(); // tgen
  ee32762(); // tgen
};
//SIG(1 ee32762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee32762 ::foo(){vfunc_called(this, "_ZN7ee327623fooEv");}
ee32762 ::~ee32762(){ note_dtor("ee32762", this);} // tgen
ee32762 ::ee32762(){ note_ctor("ee32762", this);} // tgen

static void Test_ee32762()
{
  extern Class_Descriptor cd_ee32762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee32762, buf);
    ee32762 *dp, &lv = *(dp=new (buf) ee32762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee32762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee32762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee32762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(32,20), "ee32762");
    check_base_class_offset(lv, (cc762*)(dd2762*), ABISELECT(16,8), "ee32762");
    check_base_class_offset(lv, (dd2762*), ABISELECT(16,8), "ee32762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee32762.e");
    test_class_info(&lv, &cd_ee32762);
    dp->~ee32762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee32762(Test_ee32762, "ee32762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee32762C1Ev();
extern void _ZN7ee32762D1Ev();
Name_Map name_map_ee32762[] = {
  NSPAIR(_ZN7ee32762C1Ev),
  NSPAIR(_ZN7ee32762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee32762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee32762[];
extern void _ZN7ee327623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee327623fooEv,_ZTv0_n16_N7ee327623fooEv)();
extern void ABISELECT(_ZThn16_N7ee327623fooEv,_ZThn8_N7ee327623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee327623fooEv,_ZTv0_n12_N7ee327623fooEv)();
extern void ABISELECT(_ZThn32_N7ee327623fooEv,_ZThn20_N7ee327623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee32762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee32762[0]),
  (VTBL_ENTRY)&_ZN7ee327623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee32762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee327623fooEv,_ZTv0_n16_N7ee327623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee32762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee327623fooEv,_ZTv0_n12_N7ee327623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee32762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee32762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee32762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee32762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee32762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee32762[] = {
  {&(_ZTV7ee32762[4]),  4,18},
  {&(_ZTV7ee32762[10]),  10,18},
  {&(_ZTV7ee32762[16]),  16,18},
  {&(_tg__ZTV6dd2762__7ee32762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee32762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee32762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee32762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee32762[];
extern  VTBL_ENTRY _ZTV7ee32762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee32762[];
static VTBL_ENTRY alt_thunk_names1346[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee327623fooEv,_ZTv0_n12_N7ee327623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee327623fooEv,_ZThn20_N7ee327623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee327623fooEv,_ZTv0_n16_N7ee327623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee327623fooEv,_ZThn8_N7ee327623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee32762 = {  "ee32762", // class name
  bases_ee32762, 4,
  &(vtc_ee32762[0]), // expected_vtbl_contents
  &(vtt_ee32762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee32762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee32762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee32762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1346,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee42762  : dd2762 {
  int e;
  virtual void  bar(); // _ZN7ee427623barEv
  ~ee42762(); // tgen
  ee42762(); // tgen
};
//SIG(1 ee42762) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee42762 ::bar(){vfunc_called(this, "_ZN7ee427623barEv");}
ee42762 ::~ee42762(){ note_dtor("ee42762", this);} // tgen
ee42762 ::ee42762(){ note_ctor("ee42762", this);} // tgen

static void Test_ee42762()
{
  extern Class_Descriptor cd_ee42762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee42762, buf);
    ee42762 *dp, &lv = *(dp=new (buf) ee42762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee42762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee42762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee42762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(24,16), "ee42762");
    check_base_class_offset(lv, (cc762*)(dd2762*), 0, "ee42762");
    check_base_class_offset(lv, (dd2762*), 0, "ee42762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee42762.e");
    test_class_info(&lv, &cd_ee42762);
    dp->~ee42762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee42762(Test_ee42762, "ee42762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee42762C1Ev();
extern void _ZN7ee42762D1Ev();
Name_Map name_map_ee42762[] = {
  NSPAIR(_ZN7ee42762C1Ev),
  NSPAIR(_ZN7ee42762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee42762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee42762[];
extern void _ZN6dd27623fooEv();
extern void _ZN7ee427623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee427623barEv,_ZTv0_n16_N7ee427623barEv)();
extern void ABISELECT(_ZThn24_N7ee427623barEv,_ZThn16_N7ee427623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee42762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee42762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN7ee427623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee42762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee427623barEv,_ZTv0_n16_N7ee427623barEv),
};
extern VTBL_ENTRY _ZTV7ee42762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee42762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee42762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee42762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee42762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee42762[] = {
  {&(_ZTV7ee42762[3]),  3,11},
  {&(_tg__ZTV6dd2762__7ee42762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee42762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee42762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee42762[4]),  4,6},
  {&(_ZTV7ee42762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee42762[];
extern  VTBL_ENTRY _ZTV7ee42762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee42762[];
static VTBL_ENTRY alt_thunk_names1347[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee427623barEv,_ZTv0_n16_N7ee427623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee427623barEv,_ZThn16_N7ee427623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee42762 = {  "ee42762", // class name
  bases_ee42762, 4,
  &(vtc_ee42762[0]), // expected_vtbl_contents
  &(vtt_ee42762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee42762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee42762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee42762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1347,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee52762  : virtual dd2762 {
  int e;
  virtual void  bar(); // _ZN7ee527623barEv
  ~ee52762(); // tgen
  ee52762(); // tgen
};
//SIG(1 ee52762) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee52762 ::bar(){vfunc_called(this, "_ZN7ee527623barEv");}
ee52762 ::~ee52762(){ note_dtor("ee52762", this);} // tgen
ee52762 ::ee52762(){ note_ctor("ee52762", this);} // tgen

static void Test_ee52762()
{
  extern Class_Descriptor cd_ee52762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee52762, buf);
    ee52762 *dp, &lv = *(dp=new (buf) ee52762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee52762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee52762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee52762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(32,20), "ee52762");
    check_base_class_offset(lv, (cc762*)(dd2762*), ABISELECT(16,8), "ee52762");
    check_base_class_offset(lv, (dd2762*), ABISELECT(16,8), "ee52762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee52762.e");
    test_class_info(&lv, &cd_ee52762);
    dp->~ee52762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee52762(Test_ee52762, "ee52762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee52762C1Ev();
extern void _ZN7ee52762D1Ev();
Name_Map name_map_ee52762[] = {
  NSPAIR(_ZN7ee52762C1Ev),
  NSPAIR(_ZN7ee52762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee52762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee52762[];
extern void _ZN7ee527623barEv();
extern void _ZN6dd27623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee527623barEv,_ZTv0_n20_N7ee527623barEv)();
extern void ABISELECT(_ZThn16_N7ee527623barEv,_ZThn8_N7ee527623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee527623barEv,_ZTv0_n16_N7ee527623barEv)();
extern void ABISELECT(_ZThn32_N7ee527623barEv,_ZThn20_N7ee527623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee52762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee52762[0]),
  (VTBL_ENTRY)&_ZN7ee527623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee52762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee527623barEv,_ZTv0_n20_N7ee527623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee52762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee527623barEv,_ZTv0_n16_N7ee527623barEv),
};
extern VTBL_ENTRY _ZTV7ee52762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee52762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee52762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee52762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee52762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee52762[] = {
  {&(_ZTV7ee52762[4]),  4,18},
  {&(_ZTV7ee52762[10]),  10,18},
  {&(_ZTV7ee52762[16]),  16,18},
  {&(_tg__ZTV6dd2762__7ee52762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee52762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee52762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee52762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee52762[];
extern  VTBL_ENTRY _ZTV7ee52762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee52762[];
static VTBL_ENTRY alt_thunk_names1348[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee527623barEv,_ZTv0_n16_N7ee527623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee527623barEv,_ZThn20_N7ee527623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee527623barEv,_ZTv0_n20_N7ee527623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee527623barEv,_ZThn8_N7ee527623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee52762 = {  "ee52762", // class name
  bases_ee52762, 4,
  &(vtc_ee52762[0]), // expected_vtbl_contents
  &(vtt_ee52762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee52762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee52762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee52762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1348,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee62762  : dd2762 {
  int e;
  virtual void  foo(); // _ZN7ee627623fooEv
  virtual void  bar(); // _ZN7ee627623barEv
  ~ee62762(); // tgen
  ee62762(); // tgen
};
//SIG(1 ee62762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee62762 ::foo(){vfunc_called(this, "_ZN7ee627623fooEv");}
void  ee62762 ::bar(){vfunc_called(this, "_ZN7ee627623barEv");}
ee62762 ::~ee62762(){ note_dtor("ee62762", this);} // tgen
ee62762 ::ee62762(){ note_ctor("ee62762", this);} // tgen

static void Test_ee62762()
{
  extern Class_Descriptor cd_ee62762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee62762, buf);
    ee62762 *dp, &lv = *(dp=new (buf) ee62762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee62762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee62762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee62762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(24,16), "ee62762");
    check_base_class_offset(lv, (cc762*)(dd2762*), 0, "ee62762");
    check_base_class_offset(lv, (dd2762*), 0, "ee62762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee62762.e");
    test_class_info(&lv, &cd_ee62762);
    dp->~ee62762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee62762(Test_ee62762, "ee62762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee62762C1Ev();
extern void _ZN7ee62762D1Ev();
Name_Map name_map_ee62762[] = {
  NSPAIR(_ZN7ee62762C1Ev),
  NSPAIR(_ZN7ee62762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee62762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee62762[];
extern void _ZN7ee627623fooEv();
extern void _ZN7ee627623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee627623fooEv,_ZTv0_n12_N7ee627623fooEv)();
extern void ABISELECT(_ZThn24_N7ee627623fooEv,_ZThn16_N7ee627623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee627623barEv,_ZTv0_n16_N7ee627623barEv)();
extern void ABISELECT(_ZThn24_N7ee627623barEv,_ZThn16_N7ee627623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee62762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee62762[0]),
  (VTBL_ENTRY)&_ZN7ee627623fooEv,
  (VTBL_ENTRY)&_ZN7ee627623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee62762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee627623fooEv,_ZTv0_n12_N7ee627623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee627623barEv,_ZTv0_n16_N7ee627623barEv),
};
extern VTBL_ENTRY _ZTV7ee62762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee62762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee62762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee62762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee62762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee62762[] = {
  {&(_ZTV7ee62762[3]),  3,11},
  {&(_tg__ZTV6dd2762__7ee62762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee62762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee62762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee62762[4]),  4,6},
  {&(_ZTV7ee62762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee62762[];
extern  VTBL_ENTRY _ZTV7ee62762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee62762[];
static VTBL_ENTRY alt_thunk_names1349[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd27623fooEv,_ZThn16_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee627623barEv,_ZTv0_n16_N7ee627623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee627623barEv,_ZThn16_N7ee627623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee627623fooEv,_ZTv0_n12_N7ee627623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee627623fooEv,_ZThn16_N7ee627623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee62762 = {  "ee62762", // class name
  bases_ee62762, 4,
  &(vtc_ee62762[0]), // expected_vtbl_contents
  &(vtt_ee62762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee62762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee62762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee62762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1349,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee72762  : virtual dd2762 {
  int e;
  virtual void  foo(); // _ZN7ee727623fooEv
  virtual void  bar(); // _ZN7ee727623barEv
  ~ee72762(); // tgen
  ee72762(); // tgen
};
//SIG(1 ee72762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee72762 ::foo(){vfunc_called(this, "_ZN7ee727623fooEv");}
void  ee72762 ::bar(){vfunc_called(this, "_ZN7ee727623barEv");}
ee72762 ::~ee72762(){ note_dtor("ee72762", this);} // tgen
ee72762 ::ee72762(){ note_ctor("ee72762", this);} // tgen

static void Test_ee72762()
{
  extern Class_Descriptor cd_ee72762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee72762, buf);
    ee72762 *dp, &lv = *(dp=new (buf) ee72762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee72762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee72762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee72762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd2762*), ABISELECT(32,20), "ee72762");
    check_base_class_offset(lv, (cc762*)(dd2762*), ABISELECT(16,8), "ee72762");
    check_base_class_offset(lv, (dd2762*), ABISELECT(16,8), "ee72762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee72762.e");
    test_class_info(&lv, &cd_ee72762);
    dp->~ee72762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee72762(Test_ee72762, "ee72762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee72762C1Ev();
extern void _ZN7ee72762D1Ev();
Name_Map name_map_ee72762[] = {
  NSPAIR(_ZN7ee72762C1Ev),
  NSPAIR(_ZN7ee72762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd2762;
extern VTBL_ENTRY _ZTI6dd2762[];
extern  VTBL_ENTRY _ZTV6dd2762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd2762[];
static Base_Class bases_ee72762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd2762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee72762[];
extern void _ZN7ee727623fooEv();
extern void _ZN7ee727623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee727623fooEv,_ZTv0_n16_N7ee727623fooEv)();
extern void ABISELECT(_ZThn16_N7ee727623fooEv,_ZThn8_N7ee727623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee727623barEv,_ZTv0_n20_N7ee727623barEv)();
extern void ABISELECT(_ZThn16_N7ee727623barEv,_ZThn8_N7ee727623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee727623fooEv,_ZTv0_n12_N7ee727623fooEv)();
extern void ABISELECT(_ZThn32_N7ee727623fooEv,_ZThn20_N7ee727623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee727623barEv,_ZTv0_n16_N7ee727623barEv)();
extern void ABISELECT(_ZThn32_N7ee727623barEv,_ZThn20_N7ee727623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee72762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee72762[0]),
  (VTBL_ENTRY)&_ZN7ee727623fooEv,
  (VTBL_ENTRY)&_ZN7ee727623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee72762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee727623fooEv,_ZTv0_n16_N7ee727623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee727623barEv,_ZTv0_n20_N7ee727623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee72762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee727623fooEv,_ZTv0_n12_N7ee727623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee727623barEv,_ZTv0_n16_N7ee727623barEv),
};
extern VTBL_ENTRY _ZTV7ee72762[];
extern void _ZN6dd27623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV6dd2762__7ee72762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&_ZN6dd27623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd2762__7ee72762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd2762__7ee72762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv)();
extern void ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd2762__7ee72762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd2762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee72762[] = {
  {&(_ZTV7ee72762[4]),  4,19},
  {&(_ZTV7ee72762[11]),  11,19},
  {&(_ZTV7ee72762[17]),  17,19},
  {&(_tg__ZTV6dd2762__7ee72762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd2762__7ee72762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd2762__7ee72762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd2762__7ee72762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee72762[];
extern  VTBL_ENTRY _ZTV7ee72762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee72762[];
static VTBL_ENTRY alt_thunk_names1350[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd27623fooEv,_ZTv0_n12_N6dd27623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd27623fooEv,_ZThn12_N6dd27623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee727623barEv,_ZTv0_n16_N7ee727623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee727623barEv,_ZThn20_N7ee727623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee727623fooEv,_ZTv0_n12_N7ee727623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee727623fooEv,_ZThn20_N7ee727623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee727623barEv,_ZTv0_n20_N7ee727623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee727623barEv,_ZThn8_N7ee727623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee727623fooEv,_ZTv0_n16_N7ee727623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee727623fooEv,_ZThn8_N7ee727623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee72762 = {  "ee72762", // class name
  bases_ee72762, 4,
  &(vtc_ee72762[0]), // expected_vtbl_contents
  &(vtt_ee72762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee72762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee72762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee72762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1350,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd3762  : virtual cc762 {
  int d;
  virtual void  foo(); // _ZN6dd37623fooEv
  ~dd3762(); // tgen
  dd3762(); // tgen
};
//SIG(-1 dd3762) C1{ VBC2{ VBC3{ BC4{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  dd3762 ::foo(){vfunc_called(this, "_ZN6dd37623fooEv");}
dd3762 ::~dd3762(){ note_dtor("dd3762", this);} // tgen
dd3762 ::dd3762(){ note_ctor("dd3762", this);} // tgen

static void Test_dd3762()
{
  extern Class_Descriptor cd_dd3762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd3762, buf);
    dd3762 *dp, &lv = *(dp=new (buf) dd3762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd3762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd3762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd3762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,16), "dd3762");
    check_base_class_offset(lv, (cc762*), ABISELECT(16,8), "dd3762");
    check_field_offset(lv, d, ABISELECT(8,4), "dd3762.d");
    test_class_info(&lv, &cd_dd3762);
    dp->~dd3762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd3762(Test_dd3762, "dd3762", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd3762C1Ev();
extern void _ZN6dd3762D1Ev();
Name_Map name_map_dd3762[] = {
  NSPAIR(_ZN6dd3762C1Ev),
  NSPAIR(_ZN6dd3762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd3762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd3762[];
extern void _ZN6dd37623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd3762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV6dd3762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd3762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd3762[] = {
  {&(_ZTV6dd3762[4]),  4,18},
  {&(_ZTV6dd3762[10]),  10,18},
  {&(_ZTV6dd3762[16]),  16,18},
  {&(_tg__ZTV5cc762__6dd3762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd3762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static VTBL_ENTRY alt_thunk_names1351[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd3762 = {  "dd3762", // class name
  bases_dd3762, 3,
  &(vtc_dd3762[0]), // expected_vtbl_contents
  &(vtt_dd3762[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd3762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd3762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd3762),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1351,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee03762  : dd3762 {
  int e;
  ~ee03762(); // tgen
  ee03762(); // tgen
};
//SIG(1 ee03762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee03762 ::~ee03762(){ note_dtor("ee03762", this);} // tgen
ee03762 ::ee03762(){ note_ctor("ee03762", this);} // tgen

static void Test_ee03762()
{
  extern Class_Descriptor cd_ee03762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee03762, buf);
    ee03762 *dp, &lv = *(dp=new (buf) ee03762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee03762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee03762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee03762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee03762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(16,12), "ee03762");
    check_base_class_offset(lv, (dd3762*), 0, "ee03762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee03762.e");
    test_class_info(&lv, &cd_ee03762);
    dp->~ee03762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee03762(Test_ee03762, "ee03762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee03762C1Ev();
extern void _ZN7ee03762D1Ev();
Name_Map name_map_ee03762[] = {
  NSPAIR(_ZN7ee03762C1Ev),
  NSPAIR(_ZN7ee03762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee03762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee03762[];
extern void _ZN6dd37623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee03762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee03762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee03762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee03762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee03762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee03762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee03762[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee03762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee03762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee03762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee03762[] = {
  {&(_ZTV7ee03762[4]),  4,18},
  {&(_tg__ZTV6dd3762__7ee03762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee03762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee03762[4]),  4,6},
  {&(_ZTV7ee03762[10]),  10,18},
  {&(_ZTV7ee03762[16]),  16,18},
  {&(_tg__ZTV5cc762__7ee03762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee03762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee03762[];
extern  VTBL_ENTRY _ZTV7ee03762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee03762[];
static VTBL_ENTRY alt_thunk_names1352[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee03762 = {  "ee03762", // class name
  bases_ee03762, 4,
  &(vtc_ee03762[0]), // expected_vtbl_contents
  &(vtt_ee03762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee03762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee03762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee03762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1352,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee13762  : virtual dd3762 {
  int e;
  ~ee13762(); // tgen
  ee13762(); // tgen
};
//SIG(1 ee13762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} Fi}


ee13762 ::~ee13762(){ note_dtor("ee13762", this);} // tgen
ee13762 ::ee13762(){ note_ctor("ee13762", this);} // tgen

static void Test_ee13762()
{
  extern Class_Descriptor cd_ee13762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee13762, buf);
    ee13762 *dp, &lv = *(dp=new (buf) ee13762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee13762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee13762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee13762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee13762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(32,16), "ee13762");
    check_base_class_offset(lv, (dd3762*), ABISELECT(16,8), "ee13762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee13762.e");
    test_class_info(&lv, &cd_ee13762);
    dp->~ee13762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee13762(Test_ee13762, "ee13762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee13762C1Ev();
extern void _ZN7ee13762D1Ev();
Name_Map name_map_ee13762[] = {
  NSPAIR(_ZN7ee13762C1Ev),
  NSPAIR(_ZN7ee13762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee13762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee13762[];
extern void _ZN6dd37623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee13762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee13762[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee13762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee13762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee13762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee13762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee13762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee13762[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee13762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee13762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee13762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee13762[] = {
  {&(_ZTV7ee13762[5]),  5,24},
  {&(_ZTV7ee13762[10]),  10,24},
  {&(_ZTV7ee13762[16]),  16,24},
  {&(_ZTV7ee13762[22]),  22,24},
  {&(_tg__ZTV6dd3762__7ee13762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee13762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee13762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee13762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee13762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee13762[];
extern  VTBL_ENTRY _ZTV7ee13762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee13762[];
static VTBL_ENTRY alt_thunk_names1353[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee13762 = {  "ee13762", // class name
  bases_ee13762, 4,
  &(vtc_ee13762[0]), // expected_vtbl_contents
  &(vtt_ee13762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee13762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee13762),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee13762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1353,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee23762  : dd3762 {
  int e;
  virtual void  foo(); // _ZN7ee237623fooEv
  ~ee23762(); // tgen
  ee23762(); // tgen
};
//SIG(1 ee23762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee23762 ::foo(){vfunc_called(this, "_ZN7ee237623fooEv");}
ee23762 ::~ee23762(){ note_dtor("ee23762", this);} // tgen
ee23762 ::ee23762(){ note_ctor("ee23762", this);} // tgen

static void Test_ee23762()
{
  extern Class_Descriptor cd_ee23762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee23762, buf);
    ee23762 *dp, &lv = *(dp=new (buf) ee23762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee23762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee23762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee23762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee23762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(16,12), "ee23762");
    check_base_class_offset(lv, (dd3762*), 0, "ee23762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee23762.e");
    test_class_info(&lv, &cd_ee23762);
    dp->~ee23762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee23762(Test_ee23762, "ee23762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee23762C1Ev();
extern void _ZN7ee23762D1Ev();
Name_Map name_map_ee23762[] = {
  NSPAIR(_ZN7ee23762C1Ev),
  NSPAIR(_ZN7ee23762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee23762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee23762[];
extern void _ZN7ee237623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee237623fooEv,_ZTv0_n16_N7ee237623fooEv)();
extern void ABISELECT(_ZThn16_N7ee237623fooEv,_ZThn12_N7ee237623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee237623fooEv,_ZTv0_n12_N7ee237623fooEv)();
extern void ABISELECT(_ZThn32_N7ee237623fooEv,_ZThn20_N7ee237623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee23762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee23762[0]),
  (VTBL_ENTRY)&_ZN7ee237623fooEv,
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee23762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee237623fooEv,_ZTv0_n16_N7ee237623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee23762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee237623fooEv,_ZTv0_n12_N7ee237623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee23762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee23762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee23762[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee23762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee23762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee23762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee23762[] = {
  {&(_ZTV7ee23762[4]),  4,18},
  {&(_tg__ZTV6dd3762__7ee23762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee23762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee23762[4]),  4,6},
  {&(_ZTV7ee23762[10]),  10,18},
  {&(_ZTV7ee23762[16]),  16,18},
  {&(_tg__ZTV5cc762__7ee23762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee23762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee23762[];
extern  VTBL_ENTRY _ZTV7ee23762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee23762[];
static VTBL_ENTRY alt_thunk_names1354[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee237623fooEv,_ZTv0_n12_N7ee237623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee237623fooEv,_ZThn20_N7ee237623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee237623fooEv,_ZTv0_n16_N7ee237623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee237623fooEv,_ZThn12_N7ee237623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee23762 = {  "ee23762", // class name
  bases_ee23762, 4,
  &(vtc_ee23762[0]), // expected_vtbl_contents
  &(vtt_ee23762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee23762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee23762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee23762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1354,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee33762  : virtual dd3762 {
  int e;
  virtual void  foo(); // _ZN7ee337623fooEv
  ~ee33762(); // tgen
  ee33762(); // tgen
};
//SIG(1 ee33762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 Fi}


void  ee33762 ::foo(){vfunc_called(this, "_ZN7ee337623fooEv");}
ee33762 ::~ee33762(){ note_dtor("ee33762", this);} // tgen
ee33762 ::ee33762(){ note_ctor("ee33762", this);} // tgen

static void Test_ee33762()
{
  extern Class_Descriptor cd_ee33762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee33762, buf);
    ee33762 *dp, &lv = *(dp=new (buf) ee33762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee33762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee33762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee33762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee33762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(32,16), "ee33762");
    check_base_class_offset(lv, (dd3762*), ABISELECT(16,8), "ee33762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee33762.e");
    test_class_info(&lv, &cd_ee33762);
    dp->~ee33762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee33762(Test_ee33762, "ee33762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee33762C1Ev();
extern void _ZN7ee33762D1Ev();
Name_Map name_map_ee33762[] = {
  NSPAIR(_ZN7ee33762C1Ev),
  NSPAIR(_ZN7ee33762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee33762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee33762[];
extern void _ZN7ee337623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee337623fooEv,_ZTv0_n20_N7ee337623fooEv)();
extern void ABISELECT(_ZThn16_N7ee337623fooEv,_ZThn8_N7ee337623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee337623fooEv,_ZTv0_n16_N7ee337623fooEv)();
extern void ABISELECT(_ZThn32_N7ee337623fooEv,_ZThn16_N7ee337623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee337623fooEv,_ZTv0_n12_N7ee337623fooEv)();
extern void ABISELECT(_ZThn48_N7ee337623fooEv,_ZThn24_N7ee337623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee33762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee33762[0]),
  (VTBL_ENTRY)&_ZN7ee337623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee33762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee337623fooEv,_ZTv0_n20_N7ee337623fooEv),
  0,
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee33762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee337623fooEv,_ZTv0_n16_N7ee337623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee33762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee337623fooEv,_ZTv0_n12_N7ee337623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern VTBL_ENTRY _ZTV7ee33762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee33762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee33762[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee33762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee33762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee33762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee33762[] = {
  {&(_ZTV7ee33762[5]),  5,25},
  {&(_ZTV7ee33762[11]),  11,25},
  {&(_ZTV7ee33762[17]),  17,25},
  {&(_ZTV7ee33762[23]),  23,25},
  {&(_tg__ZTV6dd3762__7ee33762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee33762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee33762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee33762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee33762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee33762[];
extern  VTBL_ENTRY _ZTV7ee33762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee33762[];
static VTBL_ENTRY alt_thunk_names1355[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee337623fooEv,_ZTv0_n12_N7ee337623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee337623fooEv,_ZThn24_N7ee337623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee337623fooEv,_ZTv0_n16_N7ee337623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee337623fooEv,_ZThn16_N7ee337623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee337623fooEv,_ZTv0_n20_N7ee337623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee337623fooEv,_ZThn8_N7ee337623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee33762 = {  "ee33762", // class name
  bases_ee33762, 4,
  &(vtc_ee33762[0]), // expected_vtbl_contents
  &(vtt_ee33762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee33762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee33762),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee33762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1355,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee43762  : dd3762 {
  int e;
  virtual void  bar(); // _ZN7ee437623barEv
  ~ee43762(); // tgen
  ee43762(); // tgen
};
//SIG(1 ee43762) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee43762 ::bar(){vfunc_called(this, "_ZN7ee437623barEv");}
ee43762 ::~ee43762(){ note_dtor("ee43762", this);} // tgen
ee43762 ::ee43762(){ note_ctor("ee43762", this);} // tgen

static void Test_ee43762()
{
  extern Class_Descriptor cd_ee43762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee43762, buf);
    ee43762 *dp, &lv = *(dp=new (buf) ee43762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee43762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee43762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee43762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee43762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(16,12), "ee43762");
    check_base_class_offset(lv, (dd3762*), 0, "ee43762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee43762.e");
    test_class_info(&lv, &cd_ee43762);
    dp->~ee43762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee43762(Test_ee43762, "ee43762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee43762C1Ev();
extern void _ZN7ee43762D1Ev();
Name_Map name_map_ee43762[] = {
  NSPAIR(_ZN7ee43762C1Ev),
  NSPAIR(_ZN7ee43762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee43762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee43762[];
extern void _ZN6dd37623fooEv();
extern void _ZN7ee437623barEv();
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee437623barEv,_ZTv0_n20_N7ee437623barEv)();
extern void ABISELECT(_ZThn16_N7ee437623barEv,_ZThn12_N7ee437623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee437623barEv,_ZTv0_n16_N7ee437623barEv)();
extern void ABISELECT(_ZThn32_N7ee437623barEv,_ZThn20_N7ee437623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee43762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee43762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
  (VTBL_ENTRY)&_ZN7ee437623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee43762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee437623barEv,_ZTv0_n20_N7ee437623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee43762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee437623barEv,_ZTv0_n16_N7ee437623barEv),
};
extern VTBL_ENTRY _ZTV7ee43762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee43762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee43762[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee43762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee43762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee43762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee43762[] = {
  {&(_ZTV7ee43762[4]),  4,19},
  {&(_tg__ZTV6dd3762__7ee43762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee43762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee43762[4]),  4,6},
  {&(_ZTV7ee43762[11]),  11,19},
  {&(_ZTV7ee43762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee43762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee43762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee43762[];
extern  VTBL_ENTRY _ZTV7ee43762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee43762[];
static VTBL_ENTRY alt_thunk_names1356[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee437623barEv,_ZTv0_n16_N7ee437623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee437623barEv,_ZThn20_N7ee437623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee437623barEv,_ZTv0_n20_N7ee437623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee437623barEv,_ZThn12_N7ee437623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee43762 = {  "ee43762", // class name
  bases_ee43762, 4,
  &(vtc_ee43762[0]), // expected_vtbl_contents
  &(vtt_ee43762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee43762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee43762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee43762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1356,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee53762  : virtual dd3762 {
  int e;
  virtual void  bar(); // _ZN7ee537623barEv
  ~ee53762(); // tgen
  ee53762(); // tgen
};
//SIG(1 ee53762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v2 Fi} v1 Fi}


void  ee53762 ::bar(){vfunc_called(this, "_ZN7ee537623barEv");}
ee53762 ::~ee53762(){ note_dtor("ee53762", this);} // tgen
ee53762 ::ee53762(){ note_ctor("ee53762", this);} // tgen

static void Test_ee53762()
{
  extern Class_Descriptor cd_ee53762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee53762, buf);
    ee53762 *dp, &lv = *(dp=new (buf) ee53762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee53762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee53762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee53762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee53762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(32,16), "ee53762");
    check_base_class_offset(lv, (dd3762*), ABISELECT(16,8), "ee53762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee53762.e");
    test_class_info(&lv, &cd_ee53762);
    dp->~ee53762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee53762(Test_ee53762, "ee53762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee53762C1Ev();
extern void _ZN7ee53762D1Ev();
Name_Map name_map_ee53762[] = {
  NSPAIR(_ZN7ee53762C1Ev),
  NSPAIR(_ZN7ee53762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee53762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee53762[];
extern void _ZN7ee537623barEv();
extern void _ZN6dd37623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee537623barEv,_ZTv0_n20_N7ee537623barEv)();
extern void ABISELECT(_ZThn32_N7ee537623barEv,_ZThn16_N7ee537623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee537623barEv,_ZTv0_n16_N7ee537623barEv)();
extern void ABISELECT(_ZThn48_N7ee537623barEv,_ZThn24_N7ee537623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee53762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee53762[0]),
  (VTBL_ENTRY)&_ZN7ee537623barEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee53762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee53762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee537623barEv,_ZTv0_n20_N7ee537623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee53762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee537623barEv,_ZTv0_n16_N7ee537623barEv),
};
extern VTBL_ENTRY _ZTV7ee53762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee53762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee53762[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee53762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee53762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee53762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee53762[] = {
  {&(_ZTV7ee53762[5]),  5,25},
  {&(_ZTV7ee53762[11]),  11,25},
  {&(_ZTV7ee53762[17]),  17,25},
  {&(_ZTV7ee53762[23]),  23,25},
  {&(_tg__ZTV6dd3762__7ee53762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee53762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee53762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee53762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee53762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee53762[];
extern  VTBL_ENTRY _ZTV7ee53762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee53762[];
static VTBL_ENTRY alt_thunk_names1357[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee537623barEv,_ZTv0_n16_N7ee537623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee537623barEv,_ZThn24_N7ee537623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee537623barEv,_ZTv0_n20_N7ee537623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee537623barEv,_ZThn16_N7ee537623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee53762 = {  "ee53762", // class name
  bases_ee53762, 4,
  &(vtc_ee53762[0]), // expected_vtbl_contents
  &(vtt_ee53762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee53762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee53762),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee53762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1357,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee63762  : dd3762 {
  int e;
  virtual void  foo(); // _ZN7ee637623fooEv
  virtual void  bar(); // _ZN7ee637623barEv
  ~ee63762(); // tgen
  ee63762(); // tgen
};
//SIG(1 ee63762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee63762 ::foo(){vfunc_called(this, "_ZN7ee637623fooEv");}
void  ee63762 ::bar(){vfunc_called(this, "_ZN7ee637623barEv");}
ee63762 ::~ee63762(){ note_dtor("ee63762", this);} // tgen
ee63762 ::ee63762(){ note_ctor("ee63762", this);} // tgen

static void Test_ee63762()
{
  extern Class_Descriptor cd_ee63762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee63762, buf);
    ee63762 *dp, &lv = *(dp=new (buf) ee63762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee63762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee63762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee63762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee63762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(16,12), "ee63762");
    check_base_class_offset(lv, (dd3762*), 0, "ee63762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee63762.e");
    test_class_info(&lv, &cd_ee63762);
    dp->~ee63762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee63762(Test_ee63762, "ee63762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee63762C1Ev();
extern void _ZN7ee63762D1Ev();
Name_Map name_map_ee63762[] = {
  NSPAIR(_ZN7ee63762C1Ev),
  NSPAIR(_ZN7ee63762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee63762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee63762[];
extern void _ZN7ee637623fooEv();
extern void _ZN7ee637623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee637623fooEv,_ZTv0_n16_N7ee637623fooEv)();
extern void ABISELECT(_ZThn16_N7ee637623fooEv,_ZThn12_N7ee637623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee637623barEv,_ZTv0_n20_N7ee637623barEv)();
extern void ABISELECT(_ZThn16_N7ee637623barEv,_ZThn12_N7ee637623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee637623fooEv,_ZTv0_n12_N7ee637623fooEv)();
extern void ABISELECT(_ZThn32_N7ee637623fooEv,_ZThn20_N7ee637623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee637623barEv,_ZTv0_n16_N7ee637623barEv)();
extern void ABISELECT(_ZThn32_N7ee637623barEv,_ZThn20_N7ee637623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee63762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee63762[0]),
  (VTBL_ENTRY)&_ZN7ee637623fooEv,
  (VTBL_ENTRY)&_ZN7ee637623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee63762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee637623fooEv,_ZTv0_n16_N7ee637623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee637623barEv,_ZTv0_n20_N7ee637623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee63762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee637623fooEv,_ZTv0_n12_N7ee637623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee637623barEv,_ZTv0_n16_N7ee637623barEv),
};
extern VTBL_ENTRY _ZTV7ee63762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee63762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee63762[] = {
  0,
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee63762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee63762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee63762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee63762[] = {
  {&(_ZTV7ee63762[4]),  4,19},
  {&(_tg__ZTV6dd3762__7ee63762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee63762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee63762[4]),  4,6},
  {&(_ZTV7ee63762[11]),  11,19},
  {&(_ZTV7ee63762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee63762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee63762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee63762[];
extern  VTBL_ENTRY _ZTV7ee63762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee63762[];
static VTBL_ENTRY alt_thunk_names1358[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn20_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn12_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee637623barEv,_ZTv0_n16_N7ee637623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee637623barEv,_ZThn20_N7ee637623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee637623fooEv,_ZTv0_n12_N7ee637623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee637623fooEv,_ZThn20_N7ee637623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee637623barEv,_ZTv0_n20_N7ee637623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee637623barEv,_ZThn12_N7ee637623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee637623fooEv,_ZTv0_n16_N7ee637623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee637623fooEv,_ZThn12_N7ee637623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee63762 = {  "ee63762", // class name
  bases_ee63762, 4,
  &(vtc_ee63762[0]), // expected_vtbl_contents
  &(vtt_ee63762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee63762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee63762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee63762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1358,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee73762  : virtual dd3762 {
  int e;
  virtual void  foo(); // _ZN7ee737623fooEv
  virtual void  bar(); // _ZN7ee737623barEv
  ~ee73762(); // tgen
  ee73762(); // tgen
};
//SIG(1 ee73762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi} v1 v2 Fi}


void  ee73762 ::foo(){vfunc_called(this, "_ZN7ee737623fooEv");}
void  ee73762 ::bar(){vfunc_called(this, "_ZN7ee737623barEv");}
ee73762 ::~ee73762(){ note_dtor("ee73762", this);} // tgen
ee73762 ::ee73762(){ note_ctor("ee73762", this);} // tgen

static void Test_ee73762()
{
  extern Class_Descriptor cd_ee73762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee73762, buf);
    ee73762 *dp, &lv = *(dp=new (buf) ee73762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee73762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee73762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee73762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee73762");
    check_base_class_offset(lv, (cc762*)(dd3762*), ABISELECT(32,16), "ee73762");
    check_base_class_offset(lv, (dd3762*), ABISELECT(16,8), "ee73762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee73762.e");
    test_class_info(&lv, &cd_ee73762);
    dp->~ee73762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee73762(Test_ee73762, "ee73762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee73762C1Ev();
extern void _ZN7ee73762D1Ev();
Name_Map name_map_ee73762[] = {
  NSPAIR(_ZN7ee73762C1Ev),
  NSPAIR(_ZN7ee73762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd3762;
extern VTBL_ENTRY _ZTI6dd3762[];
extern  VTBL_ENTRY _ZTV6dd3762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd3762[];
static Base_Class bases_ee73762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd3762,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee73762[];
extern void _ZN7ee737623fooEv();
extern void _ZN7ee737623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee737623fooEv,_ZTv0_n20_N7ee737623fooEv)();
extern void ABISELECT(_ZThn16_N7ee737623fooEv,_ZThn8_N7ee737623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee737623fooEv,_ZTv0_n16_N7ee737623fooEv)();
extern void ABISELECT(_ZThn32_N7ee737623fooEv,_ZThn16_N7ee737623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee737623barEv,_ZTv0_n20_N7ee737623barEv)();
extern void ABISELECT(_ZThn32_N7ee737623barEv,_ZThn16_N7ee737623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee737623fooEv,_ZTv0_n12_N7ee737623fooEv)();
extern void ABISELECT(_ZThn48_N7ee737623fooEv,_ZThn24_N7ee737623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee737623barEv,_ZTv0_n16_N7ee737623barEv)();
extern void ABISELECT(_ZThn48_N7ee737623barEv,_ZThn24_N7ee737623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee73762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee73762[0]),
  (VTBL_ENTRY)&_ZN7ee737623fooEv,
  (VTBL_ENTRY)&_ZN7ee737623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee73762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee737623fooEv,_ZTv0_n20_N7ee737623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee73762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee737623fooEv,_ZTv0_n16_N7ee737623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee737623barEv,_ZTv0_n20_N7ee737623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee73762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee737623fooEv,_ZTv0_n12_N7ee737623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee737623barEv,_ZTv0_n16_N7ee737623barEv),
};
extern VTBL_ENTRY _ZTV7ee73762[];
extern void _ZN6dd37623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd3762__7ee73762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&_ZN6dd37623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv)();
extern void ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv)() __attribute__((weak));
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd3762__7ee73762[] = {
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv),
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv)();
extern void ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd3762__7ee73762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd3762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee73762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee73762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee73762[] = {
  {&(_ZTV7ee73762[5]),  5,26},
  {&(_ZTV7ee73762[12]),  12,26},
  {&(_ZTV7ee73762[18]),  18,26},
  {&(_ZTV7ee73762[24]),  24,26},
  {&(_tg__ZTV6dd3762__7ee73762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd3762__7ee73762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd3762__7ee73762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee73762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee73762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee73762[];
extern  VTBL_ENTRY _ZTV7ee73762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee73762[];
static VTBL_ENTRY alt_thunk_names1359[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd37623fooEv,_ZTv0_n12_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd37623fooEv,_ZThn16_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd37623fooEv,_ZTv0_n16_N6dd37623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd37623fooEv,_ZThn8_N6dd37623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee737623barEv,_ZTv0_n16_N7ee737623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee737623barEv,_ZThn24_N7ee737623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee737623fooEv,_ZTv0_n12_N7ee737623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee737623fooEv,_ZThn24_N7ee737623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee737623barEv,_ZTv0_n20_N7ee737623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee737623barEv,_ZThn16_N7ee737623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee737623fooEv,_ZTv0_n16_N7ee737623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee737623fooEv,_ZThn16_N7ee737623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee737623fooEv,_ZTv0_n20_N7ee737623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee737623fooEv,_ZThn8_N7ee737623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee73762 = {  "ee73762", // class name
  bases_ee73762, 4,
  &(vtc_ee73762[0]), // expected_vtbl_contents
  &(vtt_ee73762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee73762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee73762),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee73762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1359,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd4762  : cc762 {
  int d;
  virtual void  bar(); // _ZN6dd47623barEv
  ~dd4762(); // tgen
  dd4762(); // tgen
};
//SIG(-1 dd4762) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd4762 ::bar(){vfunc_called(this, "_ZN6dd47623barEv");}
dd4762 ::~dd4762(){ note_dtor("dd4762", this);} // tgen
dd4762 ::dd4762(){ note_ctor("dd4762", this);} // tgen

static void Test_dd4762()
{
  extern Class_Descriptor cd_dd4762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd4762, buf);
    dd4762 *dp, &lv = *(dp=new (buf) dd4762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd4762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd4762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd4762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(16,12), "dd4762");
    check_base_class_offset(lv, (cc762*), 0, "dd4762");
    check_field_offset(lv, d, ABISELECT(12,8), "dd4762.d");
    test_class_info(&lv, &cd_dd4762);
    dp->~dd4762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd4762(Test_dd4762, "dd4762", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd4762C1Ev();
extern void _ZN6dd4762D1Ev();
Name_Map name_map_dd4762[] = {
  NSPAIR(_ZN6dd4762C1Ev),
  NSPAIR(_ZN6dd4762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd4762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd4762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd4762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
extern VTBL_ENTRY _ZTV6dd4762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd4762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd4762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd4762[] = {
  {&(_ZTV6dd4762[3]),  3,11},
  {&(_tg__ZTV5cc762__6dd4762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd4762[4]),  4,6},
  {&(_ZTV6dd4762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static VTBL_ENTRY alt_thunk_names1360[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd4762 = {  "dd4762", // class name
  bases_dd4762, 3,
  &(vtc_dd4762[0]), // expected_vtbl_contents
  &(vtt_dd4762[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd4762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd4762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd4762),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1360,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee04762  : dd4762 {
  int e;
  ~ee04762(); // tgen
  ee04762(); // tgen
};
//SIG(1 ee04762) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee04762 ::~ee04762(){ note_dtor("ee04762", this);} // tgen
ee04762 ::ee04762(){ note_ctor("ee04762", this);} // tgen

static void Test_ee04762()
{
  extern Class_Descriptor cd_ee04762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee04762, buf);
    ee04762 *dp, &lv = *(dp=new (buf) ee04762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee04762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee04762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee04762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(24,16), "ee04762");
    check_base_class_offset(lv, (cc762*)(dd4762*), 0, "ee04762");
    check_base_class_offset(lv, (dd4762*), 0, "ee04762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee04762.e");
    test_class_info(&lv, &cd_ee04762);
    dp->~ee04762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee04762(Test_ee04762, "ee04762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee04762C1Ev();
extern void _ZN7ee04762D1Ev();
Name_Map name_map_ee04762[] = {
  NSPAIR(_ZN7ee04762C1Ev),
  NSPAIR(_ZN7ee04762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee04762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee04762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee04762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee04762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee04762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
extern VTBL_ENTRY _ZTV7ee04762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee04762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee04762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee04762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee04762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee04762[] = {
  {&(_ZTV7ee04762[3]),  3,11},
  {&(_tg__ZTV6dd4762__7ee04762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee04762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee04762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee04762[4]),  4,6},
  {&(_ZTV7ee04762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee04762[];
extern  VTBL_ENTRY _ZTV7ee04762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee04762[];
static VTBL_ENTRY alt_thunk_names1361[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee04762 = {  "ee04762", // class name
  bases_ee04762, 4,
  &(vtc_ee04762[0]), // expected_vtbl_contents
  &(vtt_ee04762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee04762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee04762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee04762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1361,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee14762  : virtual dd4762 {
  int e;
  ~ee14762(); // tgen
  ee14762(); // tgen
};
//SIG(1 ee14762) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee14762 ::~ee14762(){ note_dtor("ee14762", this);} // tgen
ee14762 ::ee14762(){ note_ctor("ee14762", this);} // tgen

static void Test_ee14762()
{
  extern Class_Descriptor cd_ee14762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee14762, buf);
    ee14762 *dp, &lv = *(dp=new (buf) ee14762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee14762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee14762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee14762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(32,20), "ee14762");
    check_base_class_offset(lv, (cc762*)(dd4762*), ABISELECT(16,8), "ee14762");
    check_base_class_offset(lv, (dd4762*), ABISELECT(16,8), "ee14762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee14762.e");
    test_class_info(&lv, &cd_ee14762);
    dp->~ee14762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee14762(Test_ee14762, "ee14762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee14762C1Ev();
extern void _ZN7ee14762D1Ev();
Name_Map name_map_ee14762[] = {
  NSPAIR(_ZN7ee14762C1Ev),
  NSPAIR(_ZN7ee14762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee14762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee14762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee14762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee14762[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee14762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee14762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
extern VTBL_ENTRY _ZTV7ee14762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee14762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee14762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee14762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee14762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee14762[] = {
  {&(_ZTV7ee14762[4]),  4,17},
  {&(_ZTV7ee14762[9]),  9,17},
  {&(_ZTV7ee14762[15]),  15,17},
  {&(_tg__ZTV6dd4762__7ee14762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee14762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee14762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee14762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee14762[];
extern  VTBL_ENTRY _ZTV7ee14762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee14762[];
static VTBL_ENTRY alt_thunk_names1362[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee14762 = {  "ee14762", // class name
  bases_ee14762, 4,
  &(vtc_ee14762[0]), // expected_vtbl_contents
  &(vtt_ee14762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee14762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee14762),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee14762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1362,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee24762  : dd4762 {
  int e;
  virtual void  foo(); // _ZN7ee247623fooEv
  ~ee24762(); // tgen
  ee24762(); // tgen
};
//SIG(1 ee24762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee24762 ::foo(){vfunc_called(this, "_ZN7ee247623fooEv");}
ee24762 ::~ee24762(){ note_dtor("ee24762", this);} // tgen
ee24762 ::ee24762(){ note_ctor("ee24762", this);} // tgen

static void Test_ee24762()
{
  extern Class_Descriptor cd_ee24762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee24762, buf);
    ee24762 *dp, &lv = *(dp=new (buf) ee24762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee24762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee24762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee24762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(24,16), "ee24762");
    check_base_class_offset(lv, (cc762*)(dd4762*), 0, "ee24762");
    check_base_class_offset(lv, (dd4762*), 0, "ee24762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee24762.e");
    test_class_info(&lv, &cd_ee24762);
    dp->~ee24762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee24762(Test_ee24762, "ee24762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee24762C1Ev();
extern void _ZN7ee24762D1Ev();
Name_Map name_map_ee24762[] = {
  NSPAIR(_ZN7ee24762C1Ev),
  NSPAIR(_ZN7ee24762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee24762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee24762[];
extern void _ZN7ee247623fooEv();
extern void _ZN6dd47623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee247623fooEv,_ZTv0_n12_N7ee247623fooEv)();
extern void ABISELECT(_ZThn24_N7ee247623fooEv,_ZThn16_N7ee247623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee24762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee24762[0]),
  (VTBL_ENTRY)&_ZN7ee247623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee24762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee247623fooEv,_ZTv0_n12_N7ee247623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
extern VTBL_ENTRY _ZTV7ee24762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee24762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee24762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee24762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee24762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee24762[] = {
  {&(_ZTV7ee24762[3]),  3,11},
  {&(_tg__ZTV6dd4762__7ee24762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee24762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee24762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee24762[4]),  4,6},
  {&(_ZTV7ee24762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee24762[];
extern  VTBL_ENTRY _ZTV7ee24762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee24762[];
static VTBL_ENTRY alt_thunk_names1363[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee247623fooEv,_ZTv0_n12_N7ee247623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee247623fooEv,_ZThn16_N7ee247623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee24762 = {  "ee24762", // class name
  bases_ee24762, 4,
  &(vtc_ee24762[0]), // expected_vtbl_contents
  &(vtt_ee24762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee24762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee24762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee24762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1363,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee34762  : virtual dd4762 {
  int e;
  virtual void  foo(); // _ZN7ee347623fooEv
  ~ee34762(); // tgen
  ee34762(); // tgen
};
//SIG(1 ee34762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee34762 ::foo(){vfunc_called(this, "_ZN7ee347623fooEv");}
ee34762 ::~ee34762(){ note_dtor("ee34762", this);} // tgen
ee34762 ::ee34762(){ note_ctor("ee34762", this);} // tgen

static void Test_ee34762()
{
  extern Class_Descriptor cd_ee34762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee34762, buf);
    ee34762 *dp, &lv = *(dp=new (buf) ee34762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee34762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee34762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee34762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(32,20), "ee34762");
    check_base_class_offset(lv, (cc762*)(dd4762*), ABISELECT(16,8), "ee34762");
    check_base_class_offset(lv, (dd4762*), ABISELECT(16,8), "ee34762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee34762.e");
    test_class_info(&lv, &cd_ee34762);
    dp->~ee34762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee34762(Test_ee34762, "ee34762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee34762C1Ev();
extern void _ZN7ee34762D1Ev();
Name_Map name_map_ee34762[] = {
  NSPAIR(_ZN7ee34762C1Ev),
  NSPAIR(_ZN7ee34762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee34762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee34762[];
extern void _ZN7ee347623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee347623fooEv,_ZTv0_n16_N7ee347623fooEv)();
extern void ABISELECT(_ZThn16_N7ee347623fooEv,_ZThn8_N7ee347623fooEv)() __attribute__((weak));
extern void _ZN6dd47623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee347623fooEv,_ZTv0_n12_N7ee347623fooEv)();
extern void ABISELECT(_ZThn32_N7ee347623fooEv,_ZThn20_N7ee347623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee34762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee34762[0]),
  (VTBL_ENTRY)&_ZN7ee347623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee34762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee347623fooEv,_ZTv0_n16_N7ee347623fooEv),
  (VTBL_ENTRY)&_ZN6dd47623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee34762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee347623fooEv,_ZTv0_n12_N7ee347623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
extern VTBL_ENTRY _ZTV7ee34762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee34762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee34762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee34762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee34762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee34762[] = {
  {&(_ZTV7ee34762[4]),  4,18},
  {&(_ZTV7ee34762[10]),  10,18},
  {&(_ZTV7ee34762[16]),  16,18},
  {&(_tg__ZTV6dd4762__7ee34762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee34762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee34762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee34762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee34762[];
extern  VTBL_ENTRY _ZTV7ee34762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee34762[];
static VTBL_ENTRY alt_thunk_names1364[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee347623fooEv,_ZTv0_n12_N7ee347623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee347623fooEv,_ZThn20_N7ee347623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee347623fooEv,_ZTv0_n16_N7ee347623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee347623fooEv,_ZThn8_N7ee347623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee34762 = {  "ee34762", // class name
  bases_ee34762, 4,
  &(vtc_ee34762[0]), // expected_vtbl_contents
  &(vtt_ee34762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee34762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee34762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee34762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1364,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee44762  : dd4762 {
  int e;
  virtual void  bar(); // _ZN7ee447623barEv
  ~ee44762(); // tgen
  ee44762(); // tgen
};
//SIG(1 ee44762) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee44762 ::bar(){vfunc_called(this, "_ZN7ee447623barEv");}
ee44762 ::~ee44762(){ note_dtor("ee44762", this);} // tgen
ee44762 ::ee44762(){ note_ctor("ee44762", this);} // tgen

static void Test_ee44762()
{
  extern Class_Descriptor cd_ee44762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee44762, buf);
    ee44762 *dp, &lv = *(dp=new (buf) ee44762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee44762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee44762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee44762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(24,16), "ee44762");
    check_base_class_offset(lv, (cc762*)(dd4762*), 0, "ee44762");
    check_base_class_offset(lv, (dd4762*), 0, "ee44762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee44762.e");
    test_class_info(&lv, &cd_ee44762);
    dp->~ee44762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee44762(Test_ee44762, "ee44762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee44762C1Ev();
extern void _ZN7ee44762D1Ev();
Name_Map name_map_ee44762[] = {
  NSPAIR(_ZN7ee44762C1Ev),
  NSPAIR(_ZN7ee44762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee44762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee44762[];
extern void _ZN5cc7623fooEv();
extern void _ZN7ee447623barEv();
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee447623barEv,_ZTv0_n16_N7ee447623barEv)();
extern void ABISELECT(_ZThn24_N7ee447623barEv,_ZThn16_N7ee447623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee44762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee44762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN7ee447623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee44762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee447623barEv,_ZTv0_n16_N7ee447623barEv),
};
extern VTBL_ENTRY _ZTV7ee44762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee44762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee44762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee44762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee44762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee44762[] = {
  {&(_ZTV7ee44762[3]),  3,11},
  {&(_tg__ZTV6dd4762__7ee44762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee44762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee44762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee44762[4]),  4,6},
  {&(_ZTV7ee44762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee44762[];
extern  VTBL_ENTRY _ZTV7ee44762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee44762[];
static VTBL_ENTRY alt_thunk_names1365[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee447623barEv,_ZTv0_n16_N7ee447623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee447623barEv,_ZThn16_N7ee447623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee44762 = {  "ee44762", // class name
  bases_ee44762, 4,
  &(vtc_ee44762[0]), // expected_vtbl_contents
  &(vtt_ee44762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee44762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee44762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee44762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1365,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee54762  : virtual dd4762 {
  int e;
  virtual void  bar(); // _ZN7ee547623barEv
  ~ee54762(); // tgen
  ee54762(); // tgen
};
//SIG(1 ee54762) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee54762 ::bar(){vfunc_called(this, "_ZN7ee547623barEv");}
ee54762 ::~ee54762(){ note_dtor("ee54762", this);} // tgen
ee54762 ::ee54762(){ note_ctor("ee54762", this);} // tgen

static void Test_ee54762()
{
  extern Class_Descriptor cd_ee54762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee54762, buf);
    ee54762 *dp, &lv = *(dp=new (buf) ee54762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee54762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee54762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee54762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(32,20), "ee54762");
    check_base_class_offset(lv, (cc762*)(dd4762*), ABISELECT(16,8), "ee54762");
    check_base_class_offset(lv, (dd4762*), ABISELECT(16,8), "ee54762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee54762.e");
    test_class_info(&lv, &cd_ee54762);
    dp->~ee54762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee54762(Test_ee54762, "ee54762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee54762C1Ev();
extern void _ZN7ee54762D1Ev();
Name_Map name_map_ee54762[] = {
  NSPAIR(_ZN7ee54762C1Ev),
  NSPAIR(_ZN7ee54762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee54762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee54762[];
extern void _ZN7ee547623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee547623barEv,_ZTv0_n20_N7ee547623barEv)();
extern void ABISELECT(_ZThn16_N7ee547623barEv,_ZThn8_N7ee547623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee547623barEv,_ZTv0_n16_N7ee547623barEv)();
extern void ABISELECT(_ZThn32_N7ee547623barEv,_ZThn20_N7ee547623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee54762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee54762[0]),
  (VTBL_ENTRY)&_ZN7ee547623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee54762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee547623barEv,_ZTv0_n20_N7ee547623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee54762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee547623barEv,_ZTv0_n16_N7ee547623barEv),
};
extern VTBL_ENTRY _ZTV7ee54762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee54762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee54762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee54762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee54762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee54762[] = {
  {&(_ZTV7ee54762[4]),  4,18},
  {&(_ZTV7ee54762[10]),  10,18},
  {&(_ZTV7ee54762[16]),  16,18},
  {&(_tg__ZTV6dd4762__7ee54762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee54762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee54762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee54762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee54762[];
extern  VTBL_ENTRY _ZTV7ee54762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee54762[];
static VTBL_ENTRY alt_thunk_names1366[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee547623barEv,_ZTv0_n16_N7ee547623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee547623barEv,_ZThn20_N7ee547623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee547623barEv,_ZTv0_n20_N7ee547623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee547623barEv,_ZThn8_N7ee547623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee54762 = {  "ee54762", // class name
  bases_ee54762, 4,
  &(vtc_ee54762[0]), // expected_vtbl_contents
  &(vtt_ee54762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee54762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee54762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee54762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1366,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee64762  : dd4762 {
  int e;
  virtual void  foo(); // _ZN7ee647623fooEv
  virtual void  bar(); // _ZN7ee647623barEv
  ~ee64762(); // tgen
  ee64762(); // tgen
};
//SIG(1 ee64762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee64762 ::foo(){vfunc_called(this, "_ZN7ee647623fooEv");}
void  ee64762 ::bar(){vfunc_called(this, "_ZN7ee647623barEv");}
ee64762 ::~ee64762(){ note_dtor("ee64762", this);} // tgen
ee64762 ::ee64762(){ note_ctor("ee64762", this);} // tgen

static void Test_ee64762()
{
  extern Class_Descriptor cd_ee64762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee64762, buf);
    ee64762 *dp, &lv = *(dp=new (buf) ee64762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee64762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee64762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee64762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(24,16), "ee64762");
    check_base_class_offset(lv, (cc762*)(dd4762*), 0, "ee64762");
    check_base_class_offset(lv, (dd4762*), 0, "ee64762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee64762.e");
    test_class_info(&lv, &cd_ee64762);
    dp->~ee64762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee64762(Test_ee64762, "ee64762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee64762C1Ev();
extern void _ZN7ee64762D1Ev();
Name_Map name_map_ee64762[] = {
  NSPAIR(_ZN7ee64762C1Ev),
  NSPAIR(_ZN7ee64762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee64762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee64762[];
extern void _ZN7ee647623fooEv();
extern void _ZN7ee647623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee647623fooEv,_ZTv0_n12_N7ee647623fooEv)();
extern void ABISELECT(_ZThn24_N7ee647623fooEv,_ZThn16_N7ee647623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee647623barEv,_ZTv0_n16_N7ee647623barEv)();
extern void ABISELECT(_ZThn24_N7ee647623barEv,_ZThn16_N7ee647623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee64762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee64762[0]),
  (VTBL_ENTRY)&_ZN7ee647623fooEv,
  (VTBL_ENTRY)&_ZN7ee647623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee64762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee647623fooEv,_ZTv0_n12_N7ee647623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee647623barEv,_ZTv0_n16_N7ee647623barEv),
};
extern VTBL_ENTRY _ZTV7ee64762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee64762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee64762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee64762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee64762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee64762[] = {
  {&(_ZTV7ee64762[3]),  3,11},
  {&(_tg__ZTV6dd4762__7ee64762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee64762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee64762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee64762[4]),  4,6},
  {&(_ZTV7ee64762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee64762[];
extern  VTBL_ENTRY _ZTV7ee64762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee64762[];
static VTBL_ENTRY alt_thunk_names1367[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd47623barEv,_ZThn16_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee647623barEv,_ZTv0_n16_N7ee647623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee647623barEv,_ZThn16_N7ee647623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee647623fooEv,_ZTv0_n12_N7ee647623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee647623fooEv,_ZThn16_N7ee647623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee64762 = {  "ee64762", // class name
  bases_ee64762, 4,
  &(vtc_ee64762[0]), // expected_vtbl_contents
  &(vtt_ee64762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee64762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee64762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee64762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1367,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee74762  : virtual dd4762 {
  int e;
  virtual void  foo(); // _ZN7ee747623fooEv
  virtual void  bar(); // _ZN7ee747623barEv
  ~ee74762(); // tgen
  ee74762(); // tgen
};
//SIG(1 ee74762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee74762 ::foo(){vfunc_called(this, "_ZN7ee747623fooEv");}
void  ee74762 ::bar(){vfunc_called(this, "_ZN7ee747623barEv");}
ee74762 ::~ee74762(){ note_dtor("ee74762", this);} // tgen
ee74762 ::ee74762(){ note_ctor("ee74762", this);} // tgen

static void Test_ee74762()
{
  extern Class_Descriptor cd_ee74762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee74762, buf);
    ee74762 *dp, &lv = *(dp=new (buf) ee74762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee74762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee74762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee74762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd4762*), ABISELECT(32,20), "ee74762");
    check_base_class_offset(lv, (cc762*)(dd4762*), ABISELECT(16,8), "ee74762");
    check_base_class_offset(lv, (dd4762*), ABISELECT(16,8), "ee74762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee74762.e");
    test_class_info(&lv, &cd_ee74762);
    dp->~ee74762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee74762(Test_ee74762, "ee74762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee74762C1Ev();
extern void _ZN7ee74762D1Ev();
Name_Map name_map_ee74762[] = {
  NSPAIR(_ZN7ee74762C1Ev),
  NSPAIR(_ZN7ee74762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd4762;
extern VTBL_ENTRY _ZTI6dd4762[];
extern  VTBL_ENTRY _ZTV6dd4762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd4762[];
static Base_Class bases_ee74762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd4762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee74762[];
extern void _ZN7ee747623fooEv();
extern void _ZN7ee747623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee747623fooEv,_ZTv0_n16_N7ee747623fooEv)();
extern void ABISELECT(_ZThn16_N7ee747623fooEv,_ZThn8_N7ee747623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee747623barEv,_ZTv0_n20_N7ee747623barEv)();
extern void ABISELECT(_ZThn16_N7ee747623barEv,_ZThn8_N7ee747623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee747623fooEv,_ZTv0_n12_N7ee747623fooEv)();
extern void ABISELECT(_ZThn32_N7ee747623fooEv,_ZThn20_N7ee747623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee747623barEv,_ZTv0_n16_N7ee747623barEv)();
extern void ABISELECT(_ZThn32_N7ee747623barEv,_ZThn20_N7ee747623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee74762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee74762[0]),
  (VTBL_ENTRY)&_ZN7ee747623fooEv,
  (VTBL_ENTRY)&_ZN7ee747623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee74762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee747623fooEv,_ZTv0_n16_N7ee747623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee747623barEv,_ZTv0_n20_N7ee747623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee74762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee747623fooEv,_ZTv0_n12_N7ee747623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee747623barEv,_ZTv0_n16_N7ee747623barEv),
};
extern VTBL_ENTRY _ZTV7ee74762[];
extern void _ZN5cc7623fooEv();
extern void _ZN6dd47623barEv();
static  VTBL_ENTRY _tg__ZTV6dd4762__7ee74762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN6dd47623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd4762__7ee74762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd4762__7ee74762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv)();
extern void ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd4762__7ee74762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd4762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv),
};
static  VTT_ENTRY vtt_ee74762[] = {
  {&(_ZTV7ee74762[4]),  4,19},
  {&(_ZTV7ee74762[11]),  11,19},
  {&(_ZTV7ee74762[17]),  17,19},
  {&(_tg__ZTV6dd4762__7ee74762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd4762__7ee74762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd4762__7ee74762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd4762__7ee74762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee74762[];
extern  VTBL_ENTRY _ZTV7ee74762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee74762[];
static VTBL_ENTRY alt_thunk_names1368[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd47623barEv,_ZTv0_n16_N6dd47623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd47623barEv,_ZThn12_N6dd47623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee747623barEv,_ZTv0_n16_N7ee747623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee747623barEv,_ZThn20_N7ee747623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee747623fooEv,_ZTv0_n12_N7ee747623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee747623fooEv,_ZThn20_N7ee747623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee747623barEv,_ZTv0_n20_N7ee747623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee747623barEv,_ZThn8_N7ee747623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee747623fooEv,_ZTv0_n16_N7ee747623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee747623fooEv,_ZThn8_N7ee747623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee74762 = {  "ee74762", // class name
  bases_ee74762, 4,
  &(vtc_ee74762[0]), // expected_vtbl_contents
  &(vtt_ee74762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee74762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee74762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee74762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1368,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd5762  : virtual cc762 {
  int d;
  virtual void  bar(); // _ZN6dd57623barEv
  ~dd5762(); // tgen
  dd5762(); // tgen
};
//SIG(-1 dd5762) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  dd5762 ::bar(){vfunc_called(this, "_ZN6dd57623barEv");}
dd5762 ::~dd5762(){ note_dtor("dd5762", this);} // tgen
dd5762 ::dd5762(){ note_ctor("dd5762", this);} // tgen

static void Test_dd5762()
{
  extern Class_Descriptor cd_dd5762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd5762, buf);
    dd5762 *dp, &lv = *(dp=new (buf) dd5762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd5762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd5762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd5762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,16), "dd5762");
    check_base_class_offset(lv, (cc762*), ABISELECT(16,8), "dd5762");
    check_field_offset(lv, d, ABISELECT(8,4), "dd5762.d");
    test_class_info(&lv, &cd_dd5762);
    dp->~dd5762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd5762(Test_dd5762, "dd5762", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd5762C1Ev();
extern void _ZN6dd5762D1Ev();
Name_Map name_map_dd5762[] = {
  NSPAIR(_ZN6dd5762C1Ev),
  NSPAIR(_ZN6dd5762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd5762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI6dd5762[];
extern void _ZN6dd57623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd5762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern VTBL_ENTRY _ZTV6dd5762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd5762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd5762[] = {
  {&(_ZTV6dd5762[4]),  4,18},
  {&(_ZTV6dd5762[10]),  10,18},
  {&(_ZTV6dd5762[16]),  16,18},
  {&(_tg__ZTV5cc762__6dd5762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd5762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static VTBL_ENTRY alt_thunk_names1369[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd5762 = {  "dd5762", // class name
  bases_dd5762, 3,
  &(vtc_dd5762[0]), // expected_vtbl_contents
  &(vtt_dd5762[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd5762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd5762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd5762),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1369,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee05762  : dd5762 {
  int e;
  ~ee05762(); // tgen
  ee05762(); // tgen
};
//SIG(1 ee05762) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee05762 ::~ee05762(){ note_dtor("ee05762", this);} // tgen
ee05762 ::ee05762(){ note_ctor("ee05762", this);} // tgen

static void Test_ee05762()
{
  extern Class_Descriptor cd_ee05762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee05762, buf);
    ee05762 *dp, &lv = *(dp=new (buf) ee05762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee05762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee05762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee05762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee05762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(16,12), "ee05762");
    check_base_class_offset(lv, (dd5762*), 0, "ee05762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee05762.e");
    test_class_info(&lv, &cd_ee05762);
    dp->~ee05762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee05762(Test_ee05762, "ee05762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee05762C1Ev();
extern void _ZN7ee05762D1Ev();
Name_Map name_map_ee05762[] = {
  NSPAIR(_ZN7ee05762C1Ev),
  NSPAIR(_ZN7ee05762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee05762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee05762[];
extern void _ZN6dd57623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee05762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee05762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee05762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee05762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern VTBL_ENTRY _ZTV7ee05762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee05762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee05762[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee05762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee05762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee05762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee05762[] = {
  {&(_ZTV7ee05762[4]),  4,18},
  {&(_tg__ZTV6dd5762__7ee05762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee05762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee05762[4]),  4,6},
  {&(_ZTV7ee05762[10]),  10,18},
  {&(_ZTV7ee05762[16]),  16,18},
  {&(_tg__ZTV5cc762__7ee05762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee05762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee05762[];
extern  VTBL_ENTRY _ZTV7ee05762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee05762[];
static VTBL_ENTRY alt_thunk_names1370[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee05762 = {  "ee05762", // class name
  bases_ee05762, 4,
  &(vtc_ee05762[0]), // expected_vtbl_contents
  &(vtt_ee05762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee05762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee05762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee05762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1370,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee15762  : virtual dd5762 {
  int e;
  ~ee15762(); // tgen
  ee15762(); // tgen
};
//SIG(1 ee15762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} Fi}


ee15762 ::~ee15762(){ note_dtor("ee15762", this);} // tgen
ee15762 ::ee15762(){ note_ctor("ee15762", this);} // tgen

static void Test_ee15762()
{
  extern Class_Descriptor cd_ee15762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee15762, buf);
    ee15762 *dp, &lv = *(dp=new (buf) ee15762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee15762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee15762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee15762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee15762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(32,16), "ee15762");
    check_base_class_offset(lv, (dd5762*), ABISELECT(16,8), "ee15762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee15762.e");
    test_class_info(&lv, &cd_ee15762);
    dp->~ee15762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee15762(Test_ee15762, "ee15762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee15762C1Ev();
extern void _ZN7ee15762D1Ev();
Name_Map name_map_ee15762[] = {
  NSPAIR(_ZN7ee15762C1Ev),
  NSPAIR(_ZN7ee15762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee15762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee15762[];
extern void _ZN6dd57623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee15762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee15762[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee15762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee15762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee15762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern VTBL_ENTRY _ZTV7ee15762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee15762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee15762[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee15762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee15762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee15762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee15762[] = {
  {&(_ZTV7ee15762[5]),  5,24},
  {&(_ZTV7ee15762[10]),  10,24},
  {&(_ZTV7ee15762[16]),  16,24},
  {&(_ZTV7ee15762[22]),  22,24},
  {&(_tg__ZTV6dd5762__7ee15762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee15762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee15762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee15762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee15762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee15762[];
extern  VTBL_ENTRY _ZTV7ee15762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee15762[];
static VTBL_ENTRY alt_thunk_names1371[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee15762 = {  "ee15762", // class name
  bases_ee15762, 4,
  &(vtc_ee15762[0]), // expected_vtbl_contents
  &(vtt_ee15762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee15762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee15762),24, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee15762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1371,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee25762  : dd5762 {
  int e;
  virtual void  foo(); // _ZN7ee257623fooEv
  ~ee25762(); // tgen
  ee25762(); // tgen
};
//SIG(1 ee25762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee25762 ::foo(){vfunc_called(this, "_ZN7ee257623fooEv");}
ee25762 ::~ee25762(){ note_dtor("ee25762", this);} // tgen
ee25762 ::ee25762(){ note_ctor("ee25762", this);} // tgen

static void Test_ee25762()
{
  extern Class_Descriptor cd_ee25762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee25762, buf);
    ee25762 *dp, &lv = *(dp=new (buf) ee25762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee25762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee25762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee25762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee25762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(16,12), "ee25762");
    check_base_class_offset(lv, (dd5762*), 0, "ee25762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee25762.e");
    test_class_info(&lv, &cd_ee25762);
    dp->~ee25762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee25762(Test_ee25762, "ee25762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee25762C1Ev();
extern void _ZN7ee25762D1Ev();
Name_Map name_map_ee25762[] = {
  NSPAIR(_ZN7ee25762C1Ev),
  NSPAIR(_ZN7ee25762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee25762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee25762[];
extern void _ZN6dd57623barEv();
extern void _ZN7ee257623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee257623fooEv,_ZTv0_n16_N7ee257623fooEv)();
extern void ABISELECT(_ZThn16_N7ee257623fooEv,_ZThn12_N7ee257623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee257623fooEv,_ZTv0_n12_N7ee257623fooEv)();
extern void ABISELECT(_ZThn32_N7ee257623fooEv,_ZThn20_N7ee257623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee25762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee25762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
  (VTBL_ENTRY)&_ZN7ee257623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee25762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee257623fooEv,_ZTv0_n16_N7ee257623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee25762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee257623fooEv,_ZTv0_n12_N7ee257623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern VTBL_ENTRY _ZTV7ee25762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee25762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee25762[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee25762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee25762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee25762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee25762[] = {
  {&(_ZTV7ee25762[4]),  4,19},
  {&(_tg__ZTV6dd5762__7ee25762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee25762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee25762[4]),  4,6},
  {&(_ZTV7ee25762[11]),  11,19},
  {&(_ZTV7ee25762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee25762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee25762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee25762[];
extern  VTBL_ENTRY _ZTV7ee25762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee25762[];
static VTBL_ENTRY alt_thunk_names1372[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee257623fooEv,_ZTv0_n12_N7ee257623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee257623fooEv,_ZThn20_N7ee257623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee257623fooEv,_ZTv0_n16_N7ee257623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee257623fooEv,_ZThn12_N7ee257623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee25762 = {  "ee25762", // class name
  bases_ee25762, 4,
  &(vtc_ee25762[0]), // expected_vtbl_contents
  &(vtt_ee25762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee25762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee25762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee25762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1372,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee35762  : virtual dd5762 {
  int e;
  virtual void  foo(); // _ZN7ee357623fooEv
  ~ee35762(); // tgen
  ee35762(); // tgen
};
//SIG(1 ee35762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 Fi}


void  ee35762 ::foo(){vfunc_called(this, "_ZN7ee357623fooEv");}
ee35762 ::~ee35762(){ note_dtor("ee35762", this);} // tgen
ee35762 ::ee35762(){ note_ctor("ee35762", this);} // tgen

static void Test_ee35762()
{
  extern Class_Descriptor cd_ee35762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee35762, buf);
    ee35762 *dp, &lv = *(dp=new (buf) ee35762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee35762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee35762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee35762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee35762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(32,16), "ee35762");
    check_base_class_offset(lv, (dd5762*), ABISELECT(16,8), "ee35762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee35762.e");
    test_class_info(&lv, &cd_ee35762);
    dp->~ee35762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee35762(Test_ee35762, "ee35762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee35762C1Ev();
extern void _ZN7ee35762D1Ev();
Name_Map name_map_ee35762[] = {
  NSPAIR(_ZN7ee35762C1Ev),
  NSPAIR(_ZN7ee35762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee35762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee35762[];
extern void _ZN7ee357623fooEv();
extern void _ZN6dd57623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee357623fooEv,_ZTv0_n16_N7ee357623fooEv)();
extern void ABISELECT(_ZThn32_N7ee357623fooEv,_ZThn16_N7ee357623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee357623fooEv,_ZTv0_n12_N7ee357623fooEv)();
extern void ABISELECT(_ZThn48_N7ee357623fooEv,_ZThn24_N7ee357623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee35762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee35762[0]),
  (VTBL_ENTRY)&_ZN7ee357623fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee35762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee35762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee357623fooEv,_ZTv0_n16_N7ee357623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee35762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee357623fooEv,_ZTv0_n12_N7ee357623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern VTBL_ENTRY _ZTV7ee35762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee35762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee35762[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee35762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee35762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee35762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee35762[] = {
  {&(_ZTV7ee35762[5]),  5,25},
  {&(_ZTV7ee35762[11]),  11,25},
  {&(_ZTV7ee35762[17]),  17,25},
  {&(_ZTV7ee35762[23]),  23,25},
  {&(_tg__ZTV6dd5762__7ee35762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee35762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee35762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee35762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee35762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee35762[];
extern  VTBL_ENTRY _ZTV7ee35762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee35762[];
static VTBL_ENTRY alt_thunk_names1373[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee357623fooEv,_ZTv0_n12_N7ee357623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee357623fooEv,_ZThn24_N7ee357623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee357623fooEv,_ZTv0_n16_N7ee357623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee357623fooEv,_ZThn16_N7ee357623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee35762 = {  "ee35762", // class name
  bases_ee35762, 4,
  &(vtc_ee35762[0]), // expected_vtbl_contents
  &(vtt_ee35762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee35762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee35762),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee35762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1373,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee45762  : dd5762 {
  int e;
  virtual void  bar(); // _ZN7ee457623barEv
  ~ee45762(); // tgen
  ee45762(); // tgen
};
//SIG(1 ee45762) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee45762 ::bar(){vfunc_called(this, "_ZN7ee457623barEv");}
ee45762 ::~ee45762(){ note_dtor("ee45762", this);} // tgen
ee45762 ::ee45762(){ note_ctor("ee45762", this);} // tgen

static void Test_ee45762()
{
  extern Class_Descriptor cd_ee45762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee45762, buf);
    ee45762 *dp, &lv = *(dp=new (buf) ee45762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee45762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee45762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee45762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee45762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(16,12), "ee45762");
    check_base_class_offset(lv, (dd5762*), 0, "ee45762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee45762.e");
    test_class_info(&lv, &cd_ee45762);
    dp->~ee45762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee45762(Test_ee45762, "ee45762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee45762C1Ev();
extern void _ZN7ee45762D1Ev();
Name_Map name_map_ee45762[] = {
  NSPAIR(_ZN7ee45762C1Ev),
  NSPAIR(_ZN7ee45762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee45762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee45762[];
extern void _ZN7ee457623barEv();
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee457623barEv,_ZTv0_n20_N7ee457623barEv)();
extern void ABISELECT(_ZThn16_N7ee457623barEv,_ZThn12_N7ee457623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee457623barEv,_ZTv0_n16_N7ee457623barEv)();
extern void ABISELECT(_ZThn32_N7ee457623barEv,_ZThn20_N7ee457623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee45762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee45762[0]),
  (VTBL_ENTRY)&_ZN7ee457623barEv,
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee45762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee457623barEv,_ZTv0_n20_N7ee457623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee45762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee457623barEv,_ZTv0_n16_N7ee457623barEv),
};
extern VTBL_ENTRY _ZTV7ee45762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee45762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee45762[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee45762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee45762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee45762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee45762[] = {
  {&(_ZTV7ee45762[4]),  4,18},
  {&(_tg__ZTV6dd5762__7ee45762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee45762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee45762[4]),  4,6},
  {&(_ZTV7ee45762[10]),  10,18},
  {&(_ZTV7ee45762[16]),  16,18},
  {&(_tg__ZTV5cc762__7ee45762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee45762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee45762[];
extern  VTBL_ENTRY _ZTV7ee45762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee45762[];
static VTBL_ENTRY alt_thunk_names1374[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee457623barEv,_ZTv0_n16_N7ee457623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee457623barEv,_ZThn20_N7ee457623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee457623barEv,_ZTv0_n20_N7ee457623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee457623barEv,_ZThn12_N7ee457623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee45762 = {  "ee45762", // class name
  bases_ee45762, 4,
  &(vtc_ee45762[0]), // expected_vtbl_contents
  &(vtt_ee45762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee45762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee45762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee45762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1374,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee55762  : virtual dd5762 {
  int e;
  virtual void  bar(); // _ZN7ee557623barEv
  ~ee55762(); // tgen
  ee55762(); // tgen
};
//SIG(1 ee55762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi} v1 Fi}


void  ee55762 ::bar(){vfunc_called(this, "_ZN7ee557623barEv");}
ee55762 ::~ee55762(){ note_dtor("ee55762", this);} // tgen
ee55762 ::ee55762(){ note_ctor("ee55762", this);} // tgen

static void Test_ee55762()
{
  extern Class_Descriptor cd_ee55762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee55762, buf);
    ee55762 *dp, &lv = *(dp=new (buf) ee55762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee55762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee55762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee55762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee55762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(32,16), "ee55762");
    check_base_class_offset(lv, (dd5762*), ABISELECT(16,8), "ee55762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee55762.e");
    test_class_info(&lv, &cd_ee55762);
    dp->~ee55762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee55762(Test_ee55762, "ee55762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee55762C1Ev();
extern void _ZN7ee55762D1Ev();
Name_Map name_map_ee55762[] = {
  NSPAIR(_ZN7ee55762C1Ev),
  NSPAIR(_ZN7ee55762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee55762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    19, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee55762[];
extern void _ZN7ee557623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee557623barEv,_ZTv0_n20_N7ee557623barEv)();
extern void ABISELECT(_ZThn16_N7ee557623barEv,_ZThn8_N7ee557623barEv)() __attribute__((weak));
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee557623barEv,_ZTv0_n20_N7ee557623barEv)();
extern void ABISELECT(_ZThn32_N7ee557623barEv,_ZThn16_N7ee557623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee557623barEv,_ZTv0_n16_N7ee557623barEv)();
extern void ABISELECT(_ZThn48_N7ee557623barEv,_ZThn24_N7ee557623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee55762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee55762[0]),
  (VTBL_ENTRY)&_ZN7ee557623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee55762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee557623barEv,_ZTv0_n20_N7ee557623barEv),
  ABISELECT(-32,-16),
  0,
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee55762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee557623barEv,_ZTv0_n20_N7ee557623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee55762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee557623barEv,_ZTv0_n16_N7ee557623barEv),
};
extern VTBL_ENTRY _ZTV7ee55762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee55762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee55762[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee55762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee55762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee55762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee55762[] = {
  {&(_ZTV7ee55762[5]),  5,25},
  {&(_ZTV7ee55762[11]),  11,25},
  {&(_ZTV7ee55762[17]),  17,25},
  {&(_ZTV7ee55762[23]),  23,25},
  {&(_tg__ZTV6dd5762__7ee55762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee55762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee55762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee55762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee55762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee55762[];
extern  VTBL_ENTRY _ZTV7ee55762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee55762[];
static VTBL_ENTRY alt_thunk_names1375[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee557623barEv,_ZTv0_n16_N7ee557623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee557623barEv,_ZThn24_N7ee557623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee557623barEv,_ZTv0_n20_N7ee557623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee557623barEv,_ZThn16_N7ee557623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee557623barEv,_ZThn8_N7ee557623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee55762 = {  "ee55762", // class name
  bases_ee55762, 4,
  &(vtc_ee55762[0]), // expected_vtbl_contents
  &(vtt_ee55762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee55762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee55762),25, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee55762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1375,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee65762  : dd5762 {
  int e;
  virtual void  foo(); // _ZN7ee657623fooEv
  virtual void  bar(); // _ZN7ee657623barEv
  ~ee65762(); // tgen
  ee65762(); // tgen
};
//SIG(1 ee65762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee65762 ::foo(){vfunc_called(this, "_ZN7ee657623fooEv");}
void  ee65762 ::bar(){vfunc_called(this, "_ZN7ee657623barEv");}
ee65762 ::~ee65762(){ note_dtor("ee65762", this);} // tgen
ee65762 ::ee65762(){ note_ctor("ee65762", this);} // tgen

static void Test_ee65762()
{
  extern Class_Descriptor cd_ee65762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee65762, buf);
    ee65762 *dp, &lv = *(dp=new (buf) ee65762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee65762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee65762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee65762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee65762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(16,12), "ee65762");
    check_base_class_offset(lv, (dd5762*), 0, "ee65762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee65762.e");
    test_class_info(&lv, &cd_ee65762);
    dp->~ee65762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee65762(Test_ee65762, "ee65762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee65762C1Ev();
extern void _ZN7ee65762D1Ev();
Name_Map name_map_ee65762[] = {
  NSPAIR(_ZN7ee65762C1Ev),
  NSPAIR(_ZN7ee65762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee65762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee65762[];
extern void _ZN7ee657623barEv();
extern void _ZN7ee657623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee657623fooEv,_ZTv0_n16_N7ee657623fooEv)();
extern void ABISELECT(_ZThn16_N7ee657623fooEv,_ZThn12_N7ee657623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee657623barEv,_ZTv0_n20_N7ee657623barEv)();
extern void ABISELECT(_ZThn16_N7ee657623barEv,_ZThn12_N7ee657623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee657623fooEv,_ZTv0_n12_N7ee657623fooEv)();
extern void ABISELECT(_ZThn32_N7ee657623fooEv,_ZThn20_N7ee657623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee657623barEv,_ZTv0_n16_N7ee657623barEv)();
extern void ABISELECT(_ZThn32_N7ee657623barEv,_ZThn20_N7ee657623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee65762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee65762[0]),
  (VTBL_ENTRY)&_ZN7ee657623barEv,
  (VTBL_ENTRY)&_ZN7ee657623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee65762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee657623fooEv,_ZTv0_n16_N7ee657623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee657623barEv,_ZTv0_n20_N7ee657623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee65762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee657623fooEv,_ZTv0_n12_N7ee657623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee657623barEv,_ZTv0_n16_N7ee657623barEv),
};
extern VTBL_ENTRY _ZTV7ee65762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee65762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee65762[] = {
  ABISELECT(-16,-12),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee65762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee65762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee65762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee65762[] = {
  {&(_ZTV7ee65762[4]),  4,19},
  {&(_tg__ZTV6dd5762__7ee65762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee65762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee65762[4]),  4,6},
  {&(_ZTV7ee65762[11]),  11,19},
  {&(_ZTV7ee65762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee65762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee65762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee65762[];
extern  VTBL_ENTRY _ZTV7ee65762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee65762[];
static VTBL_ENTRY alt_thunk_names1376[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn20_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn12_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee657623barEv,_ZTv0_n16_N7ee657623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee657623barEv,_ZThn20_N7ee657623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee657623fooEv,_ZTv0_n12_N7ee657623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee657623fooEv,_ZThn20_N7ee657623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee657623barEv,_ZTv0_n20_N7ee657623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee657623barEv,_ZThn12_N7ee657623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee657623fooEv,_ZTv0_n16_N7ee657623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee657623fooEv,_ZThn12_N7ee657623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee65762 = {  "ee65762", // class name
  bases_ee65762, 4,
  &(vtc_ee65762[0]), // expected_vtbl_contents
  &(vtt_ee65762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee65762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee65762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee65762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1376,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee75762  : virtual dd5762 {
  int e;
  virtual void  foo(); // _ZN7ee757623fooEv
  virtual void  bar(); // _ZN7ee757623barEv
  ~ee75762(); // tgen
  ee75762(); // tgen
};
//SIG(1 ee75762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 Fi} v1 v2 Fi}


void  ee75762 ::foo(){vfunc_called(this, "_ZN7ee757623fooEv");}
void  ee75762 ::bar(){vfunc_called(this, "_ZN7ee757623barEv");}
ee75762 ::~ee75762(){ note_dtor("ee75762", this);} // tgen
ee75762 ::ee75762(){ note_ctor("ee75762", this);} // tgen

static void Test_ee75762()
{
  extern Class_Descriptor cd_ee75762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee75762, buf);
    ee75762 *dp, &lv = *(dp=new (buf) ee75762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee75762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee75762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee75762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee75762");
    check_base_class_offset(lv, (cc762*)(dd5762*), ABISELECT(32,16), "ee75762");
    check_base_class_offset(lv, (dd5762*), ABISELECT(16,8), "ee75762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee75762.e");
    test_class_info(&lv, &cd_ee75762);
    dp->~ee75762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee75762(Test_ee75762, "ee75762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee75762C1Ev();
extern void _ZN7ee75762D1Ev();
Name_Map name_map_ee75762[] = {
  NSPAIR(_ZN7ee75762C1Ev),
  NSPAIR(_ZN7ee75762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd5762;
extern VTBL_ENTRY _ZTI6dd5762[];
extern  VTBL_ENTRY _ZTV6dd5762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd5762[];
static Base_Class bases_ee75762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd5762,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7ee75762[];
extern void _ZN7ee757623fooEv();
extern void _ZN7ee757623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee757623barEv,_ZTv0_n20_N7ee757623barEv)();
extern void ABISELECT(_ZThn16_N7ee757623barEv,_ZThn8_N7ee757623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee757623fooEv,_ZTv0_n16_N7ee757623fooEv)();
extern void ABISELECT(_ZThn32_N7ee757623fooEv,_ZThn16_N7ee757623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee757623barEv,_ZTv0_n20_N7ee757623barEv)();
extern void ABISELECT(_ZThn32_N7ee757623barEv,_ZThn16_N7ee757623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee757623fooEv,_ZTv0_n12_N7ee757623fooEv)();
extern void ABISELECT(_ZThn48_N7ee757623fooEv,_ZThn24_N7ee757623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee757623barEv,_ZTv0_n16_N7ee757623barEv)();
extern void ABISELECT(_ZThn48_N7ee757623barEv,_ZThn24_N7ee757623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee75762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee75762[0]),
  (VTBL_ENTRY)&_ZN7ee757623fooEv,
  (VTBL_ENTRY)&_ZN7ee757623barEv,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee75762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee757623barEv,_ZTv0_n20_N7ee757623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee75762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee757623fooEv,_ZTv0_n16_N7ee757623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee757623barEv,_ZTv0_n20_N7ee757623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee75762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee757623fooEv,_ZTv0_n12_N7ee757623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee757623barEv,_ZTv0_n16_N7ee757623barEv),
};
extern VTBL_ENTRY _ZTV7ee75762[];
extern void _ZN6dd57623barEv();
static  VTBL_ENTRY _tg__ZTV6dd5762__7ee75762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN6dd57623barEv,
};
extern void _ZN5cc7623fooEv();
extern void ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv)();
extern void ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd5762__7ee75762[] = {
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv),
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv)();
extern void ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd5762__7ee75762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd5762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee75762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee75762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee75762[] = {
  {&(_ZTV7ee75762[5]),  5,26},
  {&(_ZTV7ee75762[12]),  12,26},
  {&(_ZTV7ee75762[18]),  18,26},
  {&(_ZTV7ee75762[24]),  24,26},
  {&(_tg__ZTV6dd5762__7ee75762[4]),  4,5},
  {&(_tg__ZTV5cc762__6dd5762__7ee75762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd5762__7ee75762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee75762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee75762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee75762[];
extern  VTBL_ENTRY _ZTV7ee75762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee75762[];
static VTBL_ENTRY alt_thunk_names1377[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd57623barEv,_ZTv0_n16_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd57623barEv,_ZThn16_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd57623barEv,_ZTv0_n20_N6dd57623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd57623barEv,_ZThn8_N6dd57623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee757623barEv,_ZTv0_n16_N7ee757623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee757623barEv,_ZThn24_N7ee757623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee757623fooEv,_ZTv0_n12_N7ee757623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee757623fooEv,_ZThn24_N7ee757623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee757623fooEv,_ZTv0_n16_N7ee757623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee757623fooEv,_ZThn16_N7ee757623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee757623barEv,_ZTv0_n20_N7ee757623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee757623barEv,_ZThn16_N7ee757623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee757623barEv,_ZThn8_N7ee757623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee75762 = {  "ee75762", // class name
  bases_ee75762, 4,
  &(vtc_ee75762[0]), // expected_vtbl_contents
  &(vtt_ee75762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee75762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee75762),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee75762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1377,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd6762  : cc762 {
  int d;
  virtual void  bar(); // _ZN6dd67623barEv
  virtual void  foo(); // _ZN6dd67623fooEv
  ~dd6762(); // tgen
  dd6762(); // tgen
};
//SIG(-1 dd6762) C1{ BC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd6762 ::bar(){vfunc_called(this, "_ZN6dd67623barEv");}
void  dd6762 ::foo(){vfunc_called(this, "_ZN6dd67623fooEv");}
dd6762 ::~dd6762(){ note_dtor("dd6762", this);} // tgen
dd6762 ::dd6762(){ note_ctor("dd6762", this);} // tgen

static void Test_dd6762()
{
  extern Class_Descriptor cd_dd6762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_dd6762, buf);
    dd6762 *dp, &lv = *(dp=new (buf) dd6762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(dd6762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd6762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(16,12), "dd6762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(16,12), "dd6762");
    check_base_class_offset(lv, (cc762*), 0, "dd6762");
    check_field_offset(lv, d, ABISELECT(12,8), "dd6762.d");
    test_class_info(&lv, &cd_dd6762);
    dp->~dd6762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd6762(Test_dd6762, "dd6762", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN6dd6762C1Ev();
extern void _ZN6dd6762D1Ev();
Name_Map name_map_dd6762[] = {
  NSPAIR(_ZN6dd6762C1Ev),
  NSPAIR(_ZN6dd6762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd6762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI6dd6762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd6762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
extern VTBL_ENTRY _ZTV6dd6762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd6762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd6762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd6762[] = {
  {&(_ZTV6dd6762[3]),  3,11},
  {&(_tg__ZTV5cc762__6dd6762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd6762[4]),  4,6},
  {&(_ZTV6dd6762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static VTBL_ENTRY alt_thunk_names1378[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd6762 = {  "dd6762", // class name
  bases_dd6762, 3,
  &(vtc_dd6762[0]), // expected_vtbl_contents
  &(vtt_dd6762[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI6dd6762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV6dd6762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd6762),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1378,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee06762  : dd6762 {
  int e;
  ~ee06762(); // tgen
  ee06762(); // tgen
};
//SIG(1 ee06762) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee06762 ::~ee06762(){ note_dtor("ee06762", this);} // tgen
ee06762 ::ee06762(){ note_ctor("ee06762", this);} // tgen

static void Test_ee06762()
{
  extern Class_Descriptor cd_ee06762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee06762, buf);
    ee06762 *dp, &lv = *(dp=new (buf) ee06762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee06762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee06762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee06762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(24,16), "ee06762");
    check_base_class_offset(lv, (cc762*)(dd6762*), 0, "ee06762");
    check_base_class_offset(lv, (dd6762*), 0, "ee06762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee06762.e");
    test_class_info(&lv, &cd_ee06762);
    dp->~ee06762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee06762(Test_ee06762, "ee06762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee06762C1Ev();
extern void _ZN7ee06762D1Ev();
Name_Map name_map_ee06762[] = {
  NSPAIR(_ZN7ee06762C1Ev),
  NSPAIR(_ZN7ee06762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee06762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee06762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee06762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee06762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee06762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
extern VTBL_ENTRY _ZTV7ee06762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee06762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee06762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee06762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee06762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee06762[] = {
  {&(_ZTV7ee06762[3]),  3,11},
  {&(_tg__ZTV6dd6762__7ee06762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee06762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee06762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee06762[4]),  4,6},
  {&(_ZTV7ee06762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee06762[];
extern  VTBL_ENTRY _ZTV7ee06762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee06762[];
static VTBL_ENTRY alt_thunk_names1379[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee06762 = {  "ee06762", // class name
  bases_ee06762, 4,
  &(vtc_ee06762[0]), // expected_vtbl_contents
  &(vtt_ee06762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee06762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee06762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee06762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1379,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee16762  : virtual dd6762 {
  int e;
  ~ee16762(); // tgen
  ee16762(); // tgen
};
//SIG(1 ee16762) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee16762 ::~ee16762(){ note_dtor("ee16762", this);} // tgen
ee16762 ::ee16762(){ note_ctor("ee16762", this);} // tgen

static void Test_ee16762()
{
  extern Class_Descriptor cd_ee16762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee16762, buf);
    ee16762 *dp, &lv = *(dp=new (buf) ee16762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee16762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee16762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee16762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(32,20), "ee16762");
    check_base_class_offset(lv, (cc762*)(dd6762*), ABISELECT(16,8), "ee16762");
    check_base_class_offset(lv, (dd6762*), ABISELECT(16,8), "ee16762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee16762.e");
    test_class_info(&lv, &cd_ee16762);
    dp->~ee16762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee16762(Test_ee16762, "ee16762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee16762C1Ev();
extern void _ZN7ee16762D1Ev();
Name_Map name_map_ee16762[] = {
  NSPAIR(_ZN7ee16762C1Ev),
  NSPAIR(_ZN7ee16762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee16762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    ABISELECT(16,8), //bcp->offset
    4, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee16762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee16762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee16762[0]),
  0,
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee16762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee16762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
extern VTBL_ENTRY _ZTV7ee16762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee16762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee16762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee16762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee16762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee16762[] = {
  {&(_ZTV7ee16762[4]),  4,17},
  {&(_ZTV7ee16762[9]),  9,17},
  {&(_ZTV7ee16762[15]),  15,17},
  {&(_tg__ZTV6dd6762__7ee16762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee16762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee16762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee16762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee16762[];
extern  VTBL_ENTRY _ZTV7ee16762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee16762[];
static VTBL_ENTRY alt_thunk_names1380[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee16762 = {  "ee16762", // class name
  bases_ee16762, 4,
  &(vtc_ee16762[0]), // expected_vtbl_contents
  &(vtt_ee16762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee16762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee16762),17, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee16762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1380,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee26762  : dd6762 {
  int e;
  virtual void  foo(); // _ZN7ee267623fooEv
  ~ee26762(); // tgen
  ee26762(); // tgen
};
//SIG(1 ee26762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee26762 ::foo(){vfunc_called(this, "_ZN7ee267623fooEv");}
ee26762 ::~ee26762(){ note_dtor("ee26762", this);} // tgen
ee26762 ::ee26762(){ note_ctor("ee26762", this);} // tgen

static void Test_ee26762()
{
  extern Class_Descriptor cd_ee26762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee26762, buf);
    ee26762 *dp, &lv = *(dp=new (buf) ee26762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee26762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee26762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee26762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(24,16), "ee26762");
    check_base_class_offset(lv, (cc762*)(dd6762*), 0, "ee26762");
    check_base_class_offset(lv, (dd6762*), 0, "ee26762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee26762.e");
    test_class_info(&lv, &cd_ee26762);
    dp->~ee26762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee26762(Test_ee26762, "ee26762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee26762C1Ev();
extern void _ZN7ee26762D1Ev();
Name_Map name_map_ee26762[] = {
  NSPAIR(_ZN7ee26762C1Ev),
  NSPAIR(_ZN7ee26762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee26762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee26762[];
extern void _ZN7ee267623fooEv();
extern void _ZN6dd67623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee267623fooEv,_ZTv0_n12_N7ee267623fooEv)();
extern void ABISELECT(_ZThn24_N7ee267623fooEv,_ZThn16_N7ee267623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee26762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee26762[0]),
  (VTBL_ENTRY)&_ZN7ee267623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee26762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee267623fooEv,_ZTv0_n12_N7ee267623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
extern VTBL_ENTRY _ZTV7ee26762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee26762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee26762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee26762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee26762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee26762[] = {
  {&(_ZTV7ee26762[3]),  3,11},
  {&(_tg__ZTV6dd6762__7ee26762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee26762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee26762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee26762[4]),  4,6},
  {&(_ZTV7ee26762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee26762[];
extern  VTBL_ENTRY _ZTV7ee26762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee26762[];
static VTBL_ENTRY alt_thunk_names1381[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee267623fooEv,_ZTv0_n12_N7ee267623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee267623fooEv,_ZThn16_N7ee267623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee26762 = {  "ee26762", // class name
  bases_ee26762, 4,
  &(vtc_ee26762[0]), // expected_vtbl_contents
  &(vtt_ee26762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee26762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee26762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee26762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1381,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee36762  : virtual dd6762 {
  int e;
  virtual void  foo(); // _ZN7ee367623fooEv
  ~ee36762(); // tgen
  ee36762(); // tgen
};
//SIG(1 ee36762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee36762 ::foo(){vfunc_called(this, "_ZN7ee367623fooEv");}
ee36762 ::~ee36762(){ note_dtor("ee36762", this);} // tgen
ee36762 ::ee36762(){ note_ctor("ee36762", this);} // tgen

static void Test_ee36762()
{
  extern Class_Descriptor cd_ee36762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee36762, buf);
    ee36762 *dp, &lv = *(dp=new (buf) ee36762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee36762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee36762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee36762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(32,20), "ee36762");
    check_base_class_offset(lv, (cc762*)(dd6762*), ABISELECT(16,8), "ee36762");
    check_base_class_offset(lv, (dd6762*), ABISELECT(16,8), "ee36762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee36762.e");
    test_class_info(&lv, &cd_ee36762);
    dp->~ee36762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee36762(Test_ee36762, "ee36762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee36762C1Ev();
extern void _ZN7ee36762D1Ev();
Name_Map name_map_ee36762[] = {
  NSPAIR(_ZN7ee36762C1Ev),
  NSPAIR(_ZN7ee36762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee36762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee36762[];
extern void _ZN7ee367623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee367623fooEv,_ZTv0_n16_N7ee367623fooEv)();
extern void ABISELECT(_ZThn16_N7ee367623fooEv,_ZThn8_N7ee367623fooEv)() __attribute__((weak));
extern void _ZN6dd67623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee367623fooEv,_ZTv0_n12_N7ee367623fooEv)();
extern void ABISELECT(_ZThn32_N7ee367623fooEv,_ZThn20_N7ee367623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee36762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee36762[0]),
  (VTBL_ENTRY)&_ZN7ee367623fooEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee36762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee367623fooEv,_ZTv0_n16_N7ee367623fooEv),
  (VTBL_ENTRY)&_ZN6dd67623barEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee36762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee367623fooEv,_ZTv0_n12_N7ee367623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
extern VTBL_ENTRY _ZTV7ee36762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee36762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee36762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee36762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee36762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee36762[] = {
  {&(_ZTV7ee36762[4]),  4,18},
  {&(_ZTV7ee36762[10]),  10,18},
  {&(_ZTV7ee36762[16]),  16,18},
  {&(_tg__ZTV6dd6762__7ee36762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee36762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee36762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee36762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee36762[];
extern  VTBL_ENTRY _ZTV7ee36762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee36762[];
static VTBL_ENTRY alt_thunk_names1382[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee367623fooEv,_ZTv0_n12_N7ee367623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee367623fooEv,_ZThn20_N7ee367623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee367623fooEv,_ZTv0_n16_N7ee367623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee367623fooEv,_ZThn8_N7ee367623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee36762 = {  "ee36762", // class name
  bases_ee36762, 4,
  &(vtc_ee36762[0]), // expected_vtbl_contents
  &(vtt_ee36762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee36762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee36762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee36762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1382,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee46762  : dd6762 {
  int e;
  virtual void  bar(); // _ZN7ee467623barEv
  ~ee46762(); // tgen
  ee46762(); // tgen
};
//SIG(1 ee46762) C1{ BC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee46762 ::bar(){vfunc_called(this, "_ZN7ee467623barEv");}
ee46762 ::~ee46762(){ note_dtor("ee46762", this);} // tgen
ee46762 ::ee46762(){ note_ctor("ee46762", this);} // tgen

static void Test_ee46762()
{
  extern Class_Descriptor cd_ee46762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee46762, buf);
    ee46762 *dp, &lv = *(dp=new (buf) ee46762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee46762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee46762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee46762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(24,16), "ee46762");
    check_base_class_offset(lv, (cc762*)(dd6762*), 0, "ee46762");
    check_base_class_offset(lv, (dd6762*), 0, "ee46762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee46762.e");
    test_class_info(&lv, &cd_ee46762);
    dp->~ee46762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee46762(Test_ee46762, "ee46762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee46762C1Ev();
extern void _ZN7ee46762D1Ev();
Name_Map name_map_ee46762[] = {
  NSPAIR(_ZN7ee46762C1Ev),
  NSPAIR(_ZN7ee46762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee46762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee46762[];
extern void _ZN6dd67623fooEv();
extern void _ZN7ee467623barEv();
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee467623barEv,_ZTv0_n16_N7ee467623barEv)();
extern void ABISELECT(_ZThn24_N7ee467623barEv,_ZThn16_N7ee467623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee46762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee46762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN7ee467623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee46762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee467623barEv,_ZTv0_n16_N7ee467623barEv),
};
extern VTBL_ENTRY _ZTV7ee46762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee46762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee46762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee46762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee46762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee46762[] = {
  {&(_ZTV7ee46762[3]),  3,11},
  {&(_tg__ZTV6dd6762__7ee46762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee46762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee46762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee46762[4]),  4,6},
  {&(_ZTV7ee46762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee46762[];
extern  VTBL_ENTRY _ZTV7ee46762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee46762[];
static VTBL_ENTRY alt_thunk_names1383[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee467623barEv,_ZTv0_n16_N7ee467623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee467623barEv,_ZThn16_N7ee467623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee46762 = {  "ee46762", // class name
  bases_ee46762, 4,
  &(vtc_ee46762[0]), // expected_vtbl_contents
  &(vtt_ee46762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee46762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee46762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee46762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1383,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee56762  : virtual dd6762 {
  int e;
  virtual void  bar(); // _ZN7ee567623barEv
  ~ee56762(); // tgen
  ee56762(); // tgen
};
//SIG(1 ee56762) C1{ VBC2{ BC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee56762 ::bar(){vfunc_called(this, "_ZN7ee567623barEv");}
ee56762 ::~ee56762(){ note_dtor("ee56762", this);} // tgen
ee56762 ::ee56762(){ note_ctor("ee56762", this);} // tgen

static void Test_ee56762()
{
  extern Class_Descriptor cd_ee56762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee56762, buf);
    ee56762 *dp, &lv = *(dp=new (buf) ee56762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee56762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee56762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee56762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(32,20), "ee56762");
    check_base_class_offset(lv, (cc762*)(dd6762*), ABISELECT(16,8), "ee56762");
    check_base_class_offset(lv, (dd6762*), ABISELECT(16,8), "ee56762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee56762.e");
    test_class_info(&lv, &cd_ee56762);
    dp->~ee56762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee56762(Test_ee56762, "ee56762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee56762C1Ev();
extern void _ZN7ee56762D1Ev();
Name_Map name_map_ee56762[] = {
  NSPAIR(_ZN7ee56762C1Ev),
  NSPAIR(_ZN7ee56762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee56762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee56762[];
extern void _ZN7ee567623barEv();
extern void _ZN6dd67623fooEv();
extern void ABISELECT(_ZTv0_n40_N7ee567623barEv,_ZTv0_n20_N7ee567623barEv)();
extern void ABISELECT(_ZThn16_N7ee567623barEv,_ZThn8_N7ee567623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee567623barEv,_ZTv0_n16_N7ee567623barEv)();
extern void ABISELECT(_ZThn32_N7ee567623barEv,_ZThn20_N7ee567623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee56762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee56762[0]),
  (VTBL_ENTRY)&_ZN7ee567623barEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee56762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee567623barEv,_ZTv0_n20_N7ee567623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee56762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee567623barEv,_ZTv0_n16_N7ee567623barEv),
};
extern VTBL_ENTRY _ZTV7ee56762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee56762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee56762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee56762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee56762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee56762[] = {
  {&(_ZTV7ee56762[4]),  4,18},
  {&(_ZTV7ee56762[10]),  10,18},
  {&(_ZTV7ee56762[16]),  16,18},
  {&(_tg__ZTV6dd6762__7ee56762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee56762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee56762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee56762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee56762[];
extern  VTBL_ENTRY _ZTV7ee56762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee56762[];
static VTBL_ENTRY alt_thunk_names1384[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee567623barEv,_ZTv0_n16_N7ee567623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee567623barEv,_ZThn20_N7ee567623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee567623barEv,_ZTv0_n20_N7ee567623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee567623barEv,_ZThn8_N7ee567623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee56762 = {  "ee56762", // class name
  bases_ee56762, 4,
  &(vtc_ee56762[0]), // expected_vtbl_contents
  &(vtt_ee56762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee56762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee56762),18, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee56762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1384,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee66762  : dd6762 {
  int e;
  virtual void  foo(); // _ZN7ee667623fooEv
  virtual void  bar(); // _ZN7ee667623barEv
  ~ee66762(); // tgen
  ee66762(); // tgen
};
//SIG(1 ee66762) C1{ BC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee66762 ::foo(){vfunc_called(this, "_ZN7ee667623fooEv");}
void  ee66762 ::bar(){vfunc_called(this, "_ZN7ee667623barEv");}
ee66762 ::~ee66762(){ note_dtor("ee66762", this);} // tgen
ee66762 ::ee66762(){ note_ctor("ee66762", this);} // tgen

static void Test_ee66762()
{
  extern Class_Descriptor cd_ee66762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_ee66762, buf);
    ee66762 *dp, &lv = *(dp=new (buf) ee66762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(ee66762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee66762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(24,16), "ee66762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(24,16), "ee66762");
    check_base_class_offset(lv, (cc762*)(dd6762*), 0, "ee66762");
    check_base_class_offset(lv, (dd6762*), 0, "ee66762");
    check_field_offset(lv, e, ABISELECT(16,12), "ee66762.e");
    test_class_info(&lv, &cd_ee66762);
    dp->~ee66762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee66762(Test_ee66762, "ee66762", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN7ee66762C1Ev();
extern void _ZN7ee66762D1Ev();
Name_Map name_map_ee66762[] = {
  NSPAIR(_ZN7ee66762C1Ev),
  NSPAIR(_ZN7ee66762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee66762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //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_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee66762[];
extern void _ZN7ee667623fooEv();
extern void _ZN7ee667623barEv();
extern void ABISELECT(_ZTv0_n24_N7ee667623fooEv,_ZTv0_n12_N7ee667623fooEv)();
extern void ABISELECT(_ZThn24_N7ee667623fooEv,_ZThn16_N7ee667623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee667623barEv,_ZTv0_n16_N7ee667623barEv)();
extern void ABISELECT(_ZThn24_N7ee667623barEv,_ZThn16_N7ee667623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee66762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7ee66762[0]),
  (VTBL_ENTRY)&_ZN7ee667623fooEv,
  (VTBL_ENTRY)&_ZN7ee667623barEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7ee66762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee667623fooEv,_ZTv0_n12_N7ee667623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee667623barEv,_ZTv0_n16_N7ee667623barEv),
};
extern VTBL_ENTRY _ZTV7ee66762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee66762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee66762[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee66762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee66762[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee66762[] = {
  {&(_ZTV7ee66762[3]),  3,11},
  {&(_tg__ZTV6dd6762__7ee66762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee66762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee66762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee66762[4]),  4,6},
  {&(_ZTV7ee66762[9]),  9,11},
};
extern VTBL_ENTRY _ZTI7ee66762[];
extern  VTBL_ENTRY _ZTV7ee66762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee66762[];
static VTBL_ENTRY alt_thunk_names1385[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623barEv,_ZThn16_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N6dd67623fooEv,_ZThn16_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623barEv,_ZThn16_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N5cc7623fooEv,_ZThn16_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee667623barEv,_ZTv0_n16_N7ee667623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee667623barEv,_ZThn16_N7ee667623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee667623fooEv,_ZTv0_n12_N7ee667623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N7ee667623fooEv,_ZThn16_N7ee667623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee66762 = {  "ee66762", // class name
  bases_ee66762, 4,
  &(vtc_ee66762[0]), // expected_vtbl_contents
  &(vtt_ee66762[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI7ee66762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee66762),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee66762),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1385,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee76762  : virtual dd6762 {
  int e;
  virtual void  foo(); // _ZN7ee767623fooEv
  virtual void  bar(); // _ZN7ee767623barEv
  ~ee76762(); // tgen
  ee76762(); // tgen
};
//SIG(1 ee76762) C1{ VBC2{ BC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee76762 ::foo(){vfunc_called(this, "_ZN7ee767623fooEv");}
void  ee76762 ::bar(){vfunc_called(this, "_ZN7ee767623barEv");}
ee76762 ::~ee76762(){ note_dtor("ee76762", this);} // tgen
ee76762 ::ee76762(){ note_ctor("ee76762", this);} // tgen

static void Test_ee76762()
{
  extern Class_Descriptor cd_ee76762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee76762, buf);
    ee76762 *dp, &lv = *(dp=new (buf) ee76762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee76762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee76762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee76762");
    check_base_class_offset(lv, (bb62*)(cc762*)(dd6762*), ABISELECT(32,20), "ee76762");
    check_base_class_offset(lv, (cc762*)(dd6762*), ABISELECT(16,8), "ee76762");
    check_base_class_offset(lv, (dd6762*), ABISELECT(16,8), "ee76762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee76762.e");
    test_class_info(&lv, &cd_ee76762);
    dp->~ee76762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee76762(Test_ee76762, "ee76762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee76762C1Ev();
extern void _ZN7ee76762D1Ev();
Name_Map name_map_ee76762[] = {
  NSPAIR(_ZN7ee76762C1Ev),
  NSPAIR(_ZN7ee76762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd6762;
extern VTBL_ENTRY _ZTI6dd6762[];
extern  VTBL_ENTRY _ZTV6dd6762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd6762[];
static Base_Class bases_ee76762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    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
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_cc762,    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
    3, //immediately_derived
  0, 0},
  {&cd_dd6762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee76762[];
extern void _ZN7ee767623fooEv();
extern void _ZN7ee767623barEv();
extern void ABISELECT(_ZTv0_n32_N7ee767623fooEv,_ZTv0_n16_N7ee767623fooEv)();
extern void ABISELECT(_ZThn16_N7ee767623fooEv,_ZThn8_N7ee767623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee767623barEv,_ZTv0_n20_N7ee767623barEv)();
extern void ABISELECT(_ZThn16_N7ee767623barEv,_ZThn8_N7ee767623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee767623fooEv,_ZTv0_n12_N7ee767623fooEv)();
extern void ABISELECT(_ZThn32_N7ee767623fooEv,_ZThn20_N7ee767623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee767623barEv,_ZTv0_n16_N7ee767623barEv)();
extern void ABISELECT(_ZThn32_N7ee767623barEv,_ZThn20_N7ee767623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee76762[] = {
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee76762[0]),
  (VTBL_ENTRY)&_ZN7ee767623fooEv,
  (VTBL_ENTRY)&_ZN7ee767623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee76762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee767623fooEv,_ZTv0_n16_N7ee767623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee767623barEv,_ZTv0_n20_N7ee767623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee76762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee767623fooEv,_ZTv0_n12_N7ee767623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee767623barEv,_ZTv0_n16_N7ee767623barEv),
};
extern VTBL_ENTRY _ZTV7ee76762[];
extern void _ZN6dd67623fooEv();
extern void _ZN6dd67623barEv();
static  VTBL_ENTRY _tg__ZTV6dd6762__7ee76762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&_ZN6dd67623fooEv,
  (VTBL_ENTRY)&_ZN6dd67623barEv,
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc7626dd6762__7ee76762[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc7626dd6762__7ee76762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv)();
extern void ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv)();
extern void ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd6762__7ee76762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd6762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv),
};
static  VTT_ENTRY vtt_ee76762[] = {
  {&(_ZTV7ee76762[4]),  4,19},
  {&(_ZTV7ee76762[11]),  11,19},
  {&(_ZTV7ee76762[17]),  17,19},
  {&(_tg__ZTV6dd6762__7ee76762[3]),  3,5},
  {&(_tg__ZTV5cc7626dd6762__7ee76762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc7626dd6762__7ee76762[4]),  4,6},
  {&(_tg__ZTV4bb62__6dd6762__7ee76762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee76762[];
extern  VTBL_ENTRY _ZTV7ee76762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee76762[];
static VTBL_ENTRY alt_thunk_names1386[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd67623barEv,_ZTv0_n16_N6dd67623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623barEv,_ZThn12_N6dd67623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd67623fooEv,_ZTv0_n12_N6dd67623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd67623fooEv,_ZThn12_N6dd67623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn12_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn12_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee767623barEv,_ZTv0_n16_N7ee767623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee767623barEv,_ZThn20_N7ee767623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee767623fooEv,_ZTv0_n12_N7ee767623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee767623fooEv,_ZThn20_N7ee767623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee767623barEv,_ZTv0_n20_N7ee767623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee767623barEv,_ZThn8_N7ee767623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee767623fooEv,_ZTv0_n16_N7ee767623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee767623fooEv,_ZThn8_N7ee767623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee76762 = {  "ee76762", // class name
  bases_ee76762, 4,
  &(vtc_ee76762[0]), // expected_vtbl_contents
  &(vtt_ee76762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee76762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee76762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee76762),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1386,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  dd7762  : virtual cc762 {
  int d;
  virtual void  bar(); // _ZN6dd77623barEv
  virtual void  foo(); // _ZN6dd77623fooEv
  ~dd7762(); // tgen
  dd7762(); // tgen
};
//SIG(-1 dd7762) C1{ VBC2{ VBC3{ BC4{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  dd7762 ::bar(){vfunc_called(this, "_ZN6dd77623barEv");}
void  dd7762 ::foo(){vfunc_called(this, "_ZN6dd77623fooEv");}
dd7762 ::~dd7762(){ note_dtor("dd7762", this);} // tgen
dd7762 ::dd7762(){ note_ctor("dd7762", this);} // tgen

static void Test_dd7762()
{
  extern Class_Descriptor cd_dd7762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,8)];
    init_test(&cd_dd7762, buf);
    dd7762 *dp, &lv = *(dp=new (buf) dd7762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,28), "sizeof(dd7762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(dd7762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,16), "dd7762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,16), "dd7762");
    check_base_class_offset(lv, (cc762*), ABISELECT(16,8), "dd7762");
    check_field_offset(lv, d, ABISELECT(8,4), "dd7762.d");
    test_class_info(&lv, &cd_dd7762);
    dp->~dd7762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vdd7762(Test_dd7762, "dd7762", ABISELECT(48,28));

#else // __cplusplus

extern void _ZN6dd7762C1Ev();
extern void _ZN6dd7762D1Ev();
Name_Map name_map_dd7762[] = {
  NSPAIR(_ZN6dd7762C1Ev),
  NSPAIR(_ZN6dd7762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
static Base_Class bases_dd7762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    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
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,16), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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, 1},
  {&cd_cc762,    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},
  {0}};
extern VTBL_ENTRY _ZTI6dd7762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_dd7762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern VTBL_ENTRY _ZTV6dd7762[];
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__6dd7762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_dd7762[] = {
  {&(_ZTV6dd7762[4]),  4,19},
  {&(_ZTV6dd7762[11]),  11,19},
  {&(_ZTV6dd7762[17]),  17,19},
  {&(_tg__ZTV5cc762__6dd7762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__6dd7762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static VTBL_ENTRY alt_thunk_names1387[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_dd7762 = {  "dd7762", // class name
  bases_dd7762, 3,
  &(vtc_dd7762[0]), // expected_vtbl_contents
  &(vtt_dd7762[0]), // expected_vtt_contents
  ABISELECT(48,28), // object size
  NSPAIRA(_ZTI6dd7762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV6dd7762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6dd7762),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1387,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee07762  : dd7762 {
  int e;
  ~ee07762(); // tgen
  ee07762(); // tgen
};
//SIG(1 ee07762) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee07762 ::~ee07762(){ note_dtor("ee07762", this);} // tgen
ee07762 ::ee07762(){ note_ctor("ee07762", this);} // tgen

static void Test_ee07762()
{
  extern Class_Descriptor cd_ee07762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee07762, buf);
    ee07762 *dp, &lv = *(dp=new (buf) ee07762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee07762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee07762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee07762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee07762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(16,12), "ee07762");
    check_base_class_offset(lv, (dd7762*), 0, "ee07762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee07762.e");
    test_class_info(&lv, &cd_ee07762);
    dp->~ee07762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee07762(Test_ee07762, "ee07762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee07762C1Ev();
extern void _ZN7ee07762D1Ev();
Name_Map name_map_ee07762[] = {
  NSPAIR(_ZN7ee07762C1Ev),
  NSPAIR(_ZN7ee07762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee07762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee07762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee07762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee07762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee07762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee07762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern VTBL_ENTRY _ZTV7ee07762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee07762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee07762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee07762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee07762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee07762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee07762[] = {
  {&(_ZTV7ee07762[4]),  4,19},
  {&(_tg__ZTV6dd7762__7ee07762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee07762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee07762[4]),  4,6},
  {&(_ZTV7ee07762[11]),  11,19},
  {&(_ZTV7ee07762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee07762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee07762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee07762[];
extern  VTBL_ENTRY _ZTV7ee07762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee07762[];
static VTBL_ENTRY alt_thunk_names1388[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee07762 = {  "ee07762", // class name
  bases_ee07762, 4,
  &(vtc_ee07762[0]), // expected_vtbl_contents
  &(vtt_ee07762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee07762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee07762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee07762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1388,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee17762  : virtual dd7762 {
  int e;
  ~ee17762(); // tgen
  ee17762(); // tgen
};
//SIG(1 ee17762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} Fi}


ee17762 ::~ee17762(){ note_dtor("ee17762", this);} // tgen
ee17762 ::ee17762(){ note_ctor("ee17762", this);} // tgen

static void Test_ee17762()
{
  extern Class_Descriptor cd_ee17762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee17762, buf);
    ee17762 *dp, &lv = *(dp=new (buf) ee17762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee17762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee17762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee17762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee17762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(32,16), "ee17762");
    check_base_class_offset(lv, (dd7762*), ABISELECT(16,8), "ee17762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee17762.e");
    test_class_info(&lv, &cd_ee17762);
    dp->~ee17762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee17762(Test_ee17762, "ee17762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee17762C1Ev();
extern void _ZN7ee17762D1Ev();
Name_Map name_map_ee17762[] = {
  NSPAIR(_ZN7ee17762C1Ev),
  NSPAIR(_ZN7ee17762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee17762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    ABISELECT(16,8), //bcp->offset
    5, //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee17762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee17762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee17762[0]),
  0,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee17762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee17762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee17762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern VTBL_ENTRY _ZTV7ee17762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee17762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee17762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee17762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee17762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee17762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee17762[] = {
  {&(_ZTV7ee17762[5]),  5,26},
  {&(_ZTV7ee17762[11]),  11,26},
  {&(_ZTV7ee17762[18]),  18,26},
  {&(_ZTV7ee17762[24]),  24,26},
  {&(_tg__ZTV6dd7762__7ee17762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee17762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee17762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee17762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee17762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee17762[];
extern  VTBL_ENTRY _ZTV7ee17762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee17762[];
static VTBL_ENTRY alt_thunk_names1389[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee17762 = {  "ee17762", // class name
  bases_ee17762, 4,
  &(vtc_ee17762[0]), // expected_vtbl_contents
  &(vtt_ee17762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee17762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee17762),26, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee17762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1389,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee27762  : dd7762 {
  int e;
  virtual void  foo(); // _ZN7ee277623fooEv
  ~ee27762(); // tgen
  ee27762(); // tgen
};
//SIG(1 ee27762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee27762 ::foo(){vfunc_called(this, "_ZN7ee277623fooEv");}
ee27762 ::~ee27762(){ note_dtor("ee27762", this);} // tgen
ee27762 ::ee27762(){ note_ctor("ee27762", this);} // tgen

static void Test_ee27762()
{
  extern Class_Descriptor cd_ee27762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee27762, buf);
    ee27762 *dp, &lv = *(dp=new (buf) ee27762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee27762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee27762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee27762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee27762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(16,12), "ee27762");
    check_base_class_offset(lv, (dd7762*), 0, "ee27762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee27762.e");
    test_class_info(&lv, &cd_ee27762);
    dp->~ee27762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee27762(Test_ee27762, "ee27762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee27762C1Ev();
extern void _ZN7ee27762D1Ev();
Name_Map name_map_ee27762[] = {
  NSPAIR(_ZN7ee27762C1Ev),
  NSPAIR(_ZN7ee27762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee27762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee27762[];
extern void _ZN6dd77623barEv();
extern void _ZN7ee277623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee277623fooEv,_ZTv0_n16_N7ee277623fooEv)();
extern void ABISELECT(_ZThn16_N7ee277623fooEv,_ZThn12_N7ee277623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee277623fooEv,_ZTv0_n12_N7ee277623fooEv)();
extern void ABISELECT(_ZThn32_N7ee277623fooEv,_ZThn20_N7ee277623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee27762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee27762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN7ee277623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee27762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee277623fooEv,_ZTv0_n16_N7ee277623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee27762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee277623fooEv,_ZTv0_n12_N7ee277623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern VTBL_ENTRY _ZTV7ee27762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee27762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee27762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee27762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee27762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee27762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee27762[] = {
  {&(_ZTV7ee27762[4]),  4,19},
  {&(_tg__ZTV6dd7762__7ee27762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee27762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee27762[4]),  4,6},
  {&(_ZTV7ee27762[11]),  11,19},
  {&(_ZTV7ee27762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee27762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee27762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee27762[];
extern  VTBL_ENTRY _ZTV7ee27762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee27762[];
static VTBL_ENTRY alt_thunk_names1390[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee277623fooEv,_ZTv0_n12_N7ee277623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee277623fooEv,_ZThn20_N7ee277623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee277623fooEv,_ZTv0_n16_N7ee277623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee277623fooEv,_ZThn12_N7ee277623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee27762 = {  "ee27762", // class name
  bases_ee27762, 4,
  &(vtc_ee27762[0]), // expected_vtbl_contents
  &(vtt_ee27762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee27762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee27762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee27762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1390,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee37762  : virtual dd7762 {
  int e;
  virtual void  foo(); // _ZN7ee377623fooEv
  ~ee37762(); // tgen
  ee37762(); // tgen
};
//SIG(1 ee37762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 Fi}


void  ee37762 ::foo(){vfunc_called(this, "_ZN7ee377623fooEv");}
ee37762 ::~ee37762(){ note_dtor("ee37762", this);} // tgen
ee37762 ::ee37762(){ note_ctor("ee37762", this);} // tgen

static void Test_ee37762()
{
  extern Class_Descriptor cd_ee37762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee37762, buf);
    ee37762 *dp, &lv = *(dp=new (buf) ee37762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee37762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee37762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee37762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee37762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(32,16), "ee37762");
    check_base_class_offset(lv, (dd7762*), ABISELECT(16,8), "ee37762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee37762.e");
    test_class_info(&lv, &cd_ee37762);
    dp->~ee37762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee37762(Test_ee37762, "ee37762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee37762C1Ev();
extern void _ZN7ee37762D1Ev();
Name_Map name_map_ee37762[] = {
  NSPAIR(_ZN7ee37762C1Ev),
  NSPAIR(_ZN7ee37762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee37762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    21, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee37762[];
extern void _ZN7ee377623fooEv();
extern void _ZN6dd77623barEv();
extern void ABISELECT(_ZTv0_n48_N7ee377623fooEv,_ZTv0_n24_N7ee377623fooEv)();
extern void ABISELECT(_ZThn16_N7ee377623fooEv,_ZThn8_N7ee377623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee377623fooEv,_ZTv0_n16_N7ee377623fooEv)();
extern void ABISELECT(_ZThn32_N7ee377623fooEv,_ZThn16_N7ee377623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee377623fooEv,_ZTv0_n12_N7ee377623fooEv)();
extern void ABISELECT(_ZThn48_N7ee377623fooEv,_ZThn24_N7ee377623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee37762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee37762[0]),
  (VTBL_ENTRY)&_ZN7ee377623fooEv,
  ABISELECT(-16,-8),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee37762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee377623fooEv,_ZTv0_n24_N7ee377623fooEv),
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee37762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee377623fooEv,_ZTv0_n16_N7ee377623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee37762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee377623fooEv,_ZTv0_n12_N7ee377623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern VTBL_ENTRY _ZTV7ee37762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee37762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee37762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee37762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee37762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee37762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee37762[] = {
  {&(_ZTV7ee37762[5]),  5,27},
  {&(_ZTV7ee37762[12]),  12,27},
  {&(_ZTV7ee37762[19]),  19,27},
  {&(_ZTV7ee37762[25]),  25,27},
  {&(_tg__ZTV6dd7762__7ee37762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee37762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee37762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee37762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee37762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee37762[];
extern  VTBL_ENTRY _ZTV7ee37762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee37762[];
static VTBL_ENTRY alt_thunk_names1391[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee377623fooEv,_ZTv0_n12_N7ee377623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee377623fooEv,_ZThn24_N7ee377623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee377623fooEv,_ZTv0_n16_N7ee377623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee377623fooEv,_ZThn16_N7ee377623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee377623fooEv,_ZTv0_n24_N7ee377623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee377623fooEv,_ZThn8_N7ee377623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee37762 = {  "ee37762", // class name
  bases_ee37762, 4,
  &(vtc_ee37762[0]), // expected_vtbl_contents
  &(vtt_ee37762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee37762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee37762),27, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee37762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1391,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee47762  : dd7762 {
  int e;
  virtual void  bar(); // _ZN7ee477623barEv
  ~ee47762(); // tgen
  ee47762(); // tgen
};
//SIG(1 ee47762) C1{ BC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee47762 ::bar(){vfunc_called(this, "_ZN7ee477623barEv");}
ee47762 ::~ee47762(){ note_dtor("ee47762", this);} // tgen
ee47762 ::ee47762(){ note_ctor("ee47762", this);} // tgen

static void Test_ee47762()
{
  extern Class_Descriptor cd_ee47762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee47762, buf);
    ee47762 *dp, &lv = *(dp=new (buf) ee47762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee47762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee47762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee47762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee47762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(16,12), "ee47762");
    check_base_class_offset(lv, (dd7762*), 0, "ee47762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee47762.e");
    test_class_info(&lv, &cd_ee47762);
    dp->~ee47762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee47762(Test_ee47762, "ee47762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee47762C1Ev();
extern void _ZN7ee47762D1Ev();
Name_Map name_map_ee47762[] = {
  NSPAIR(_ZN7ee47762C1Ev),
  NSPAIR(_ZN7ee47762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee47762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee47762[];
extern void _ZN7ee477623barEv();
extern void _ZN6dd77623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee477623barEv,_ZTv0_n20_N7ee477623barEv)();
extern void ABISELECT(_ZThn16_N7ee477623barEv,_ZThn12_N7ee477623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee477623barEv,_ZTv0_n16_N7ee477623barEv)();
extern void ABISELECT(_ZThn32_N7ee477623barEv,_ZThn20_N7ee477623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee47762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee47762[0]),
  (VTBL_ENTRY)&_ZN7ee477623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee47762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee477623barEv,_ZTv0_n20_N7ee477623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee47762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee477623barEv,_ZTv0_n16_N7ee477623barEv),
};
extern VTBL_ENTRY _ZTV7ee47762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee47762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee47762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee47762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee47762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee47762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee47762[] = {
  {&(_ZTV7ee47762[4]),  4,19},
  {&(_tg__ZTV6dd7762__7ee47762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee47762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee47762[4]),  4,6},
  {&(_ZTV7ee47762[11]),  11,19},
  {&(_ZTV7ee47762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee47762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee47762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee47762[];
extern  VTBL_ENTRY _ZTV7ee47762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee47762[];
static VTBL_ENTRY alt_thunk_names1392[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee477623barEv,_ZTv0_n16_N7ee477623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee477623barEv,_ZThn20_N7ee477623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee477623barEv,_ZTv0_n20_N7ee477623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee477623barEv,_ZThn12_N7ee477623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee47762 = {  "ee47762", // class name
  bases_ee47762, 4,
  &(vtc_ee47762[0]), // expected_vtbl_contents
  &(vtt_ee47762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee47762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee47762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee47762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1392,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee57762  : virtual dd7762 {
  int e;
  virtual void  bar(); // _ZN7ee577623barEv
  ~ee57762(); // tgen
  ee57762(); // tgen
};
//SIG(1 ee57762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v1 Fi}


void  ee57762 ::bar(){vfunc_called(this, "_ZN7ee577623barEv");}
ee57762 ::~ee57762(){ note_dtor("ee57762", this);} // tgen
ee57762 ::ee57762(){ note_ctor("ee57762", this);} // tgen

static void Test_ee57762()
{
  extern Class_Descriptor cd_ee57762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee57762, buf);
    ee57762 *dp, &lv = *(dp=new (buf) ee57762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee57762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee57762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee57762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee57762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(32,16), "ee57762");
    check_base_class_offset(lv, (dd7762*), ABISELECT(16,8), "ee57762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee57762.e");
    test_class_info(&lv, &cd_ee57762);
    dp->~ee57762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee57762(Test_ee57762, "ee57762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee57762C1Ev();
extern void _ZN7ee57762D1Ev();
Name_Map name_map_ee57762[] = {
  NSPAIR(_ZN7ee57762C1Ev),
  NSPAIR(_ZN7ee57762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee57762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    21, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    ABISELECT(16,8), //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},
  {0}};
extern VTBL_ENTRY _ZTI7ee57762[];
extern void _ZN7ee577623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee577623barEv,_ZTv0_n20_N7ee577623barEv)();
extern void ABISELECT(_ZThn16_N7ee577623barEv,_ZThn8_N7ee577623barEv)() __attribute__((weak));
extern void _ZN6dd77623fooEv();
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee577623barEv,_ZTv0_n20_N7ee577623barEv)();
extern void ABISELECT(_ZThn32_N7ee577623barEv,_ZThn16_N7ee577623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee577623barEv,_ZTv0_n16_N7ee577623barEv)();
extern void ABISELECT(_ZThn48_N7ee577623barEv,_ZThn24_N7ee577623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee57762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee57762[0]),
  (VTBL_ENTRY)&_ZN7ee577623barEv,
  0,
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee57762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee577623barEv,_ZTv0_n20_N7ee577623barEv),
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
  ABISELECT(-32,-16),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee57762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee577623barEv,_ZTv0_n20_N7ee577623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee57762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee577623barEv,_ZTv0_n16_N7ee577623barEv),
};
extern VTBL_ENTRY _ZTV7ee57762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee57762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee57762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee57762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee57762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee57762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee57762[] = {
  {&(_ZTV7ee57762[5]),  5,27},
  {&(_ZTV7ee57762[12]),  12,27},
  {&(_ZTV7ee57762[19]),  19,27},
  {&(_ZTV7ee57762[25]),  25,27},
  {&(_tg__ZTV6dd7762__7ee57762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee57762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee57762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee57762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee57762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee57762[];
extern  VTBL_ENTRY _ZTV7ee57762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee57762[];
static VTBL_ENTRY alt_thunk_names1393[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee577623barEv,_ZTv0_n16_N7ee577623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee577623barEv,_ZThn24_N7ee577623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee577623barEv,_ZTv0_n20_N7ee577623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee577623barEv,_ZThn16_N7ee577623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee577623barEv,_ZThn8_N7ee577623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee57762 = {  "ee57762", // class name
  bases_ee57762, 4,
  &(vtc_ee57762[0]), // expected_vtbl_contents
  &(vtt_ee57762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee57762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee57762),27, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee57762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1393,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee67762  : dd7762 {
  int e;
  virtual void  foo(); // _ZN7ee677623fooEv
  virtual void  bar(); // _ZN7ee677623barEv
  ~ee67762(); // tgen
  ee67762(); // tgen
};
//SIG(1 ee67762) C1{ BC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee67762 ::foo(){vfunc_called(this, "_ZN7ee677623fooEv");}
void  ee67762 ::bar(){vfunc_called(this, "_ZN7ee677623barEv");}
ee67762 ::~ee67762(){ note_dtor("ee67762", this);} // tgen
ee67762 ::ee67762(){ note_ctor("ee67762", this);} // tgen

static void Test_ee67762()
{
  extern Class_Descriptor cd_ee67762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_ee67762, buf);
    ee67762 *dp, &lv = *(dp=new (buf) ee67762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(ee67762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee67762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(32,20), "ee67762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(32,20), "ee67762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(16,12), "ee67762");
    check_base_class_offset(lv, (dd7762*), 0, "ee67762");
    check_field_offset(lv, e, ABISELECT(12,8), "ee67762.e");
    test_class_info(&lv, &cd_ee67762);
    dp->~ee67762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee67762(Test_ee67762, "ee67762", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN7ee67762C1Ev();
extern void _ZN7ee67762D1Ev();
Name_Map name_map_ee67762[] = {
  NSPAIR(_ZN7ee67762C1Ev),
  NSPAIR(_ZN7ee67762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee67762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(16,12), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    0, //bcp->offset
    -1, //bcp->virtual_function_table_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},
  {0}};
extern VTBL_ENTRY _ZTI7ee67762[];
extern void _ZN7ee677623barEv();
extern void _ZN7ee677623fooEv();
extern void ABISELECT(_ZTv0_n32_N7ee677623fooEv,_ZTv0_n16_N7ee677623fooEv)();
extern void ABISELECT(_ZThn16_N7ee677623fooEv,_ZThn12_N7ee677623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee677623barEv,_ZTv0_n20_N7ee677623barEv)();
extern void ABISELECT(_ZThn16_N7ee677623barEv,_ZThn12_N7ee677623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee677623fooEv,_ZTv0_n12_N7ee677623fooEv)();
extern void ABISELECT(_ZThn32_N7ee677623fooEv,_ZThn20_N7ee677623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee677623barEv,_ZTv0_n16_N7ee677623barEv)();
extern void ABISELECT(_ZThn32_N7ee677623barEv,_ZThn20_N7ee677623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee67762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7ee67762[0]),
  (VTBL_ENTRY)&_ZN7ee677623barEv,
  (VTBL_ENTRY)&_ZN7ee677623fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7ee67762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee677623fooEv,_ZTv0_n16_N7ee677623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee677623barEv,_ZTv0_n20_N7ee677623barEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7ee67762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee677623fooEv,_ZTv0_n12_N7ee677623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee677623barEv,_ZTv0_n16_N7ee677623barEv),
};
extern VTBL_ENTRY _ZTV7ee67762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee67762[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee67762[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee67762[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee67762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee67762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee67762[] = {
  {&(_ZTV7ee67762[4]),  4,19},
  {&(_tg__ZTV6dd7762__7ee67762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee67762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee67762[4]),  4,6},
  {&(_ZTV7ee67762[11]),  11,19},
  {&(_ZTV7ee67762[17]),  17,19},
  {&(_tg__ZTV5cc762__7ee67762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee67762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee67762[];
extern  VTBL_ENTRY _ZTV7ee67762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee67762[];
static VTBL_ENTRY alt_thunk_names1394[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn20_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn20_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn12_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn12_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee677623barEv,_ZTv0_n16_N7ee677623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee677623barEv,_ZThn20_N7ee677623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee677623fooEv,_ZTv0_n12_N7ee677623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee677623fooEv,_ZThn20_N7ee677623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee677623barEv,_ZTv0_n20_N7ee677623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee677623barEv,_ZThn12_N7ee677623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee677623fooEv,_ZTv0_n16_N7ee677623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee677623fooEv,_ZThn12_N7ee677623fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee67762 = {  "ee67762", // class name
  bases_ee67762, 4,
  &(vtc_ee67762[0]), // expected_vtbl_contents
  &(vtt_ee67762[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI7ee67762),ABISELECT(24,12), //typeinfo_var
  NSPAIRA(_ZTV7ee67762),19, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee67762),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1394,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  ee77762  : virtual dd7762 {
  int e;
  virtual void  foo(); // _ZN7ee777623fooEv
  virtual void  bar(); // _ZN7ee777623barEv
  ~ee77762(); // tgen
  ee77762(); // tgen
};
//SIG(1 ee77762) C1{ VBC2{ VBC3{ VBC4{ BC5{ v1 v2 Fi} v2 v1 Fi} v1 v2 Fi} v2 v1 Fi} v1 v2 Fi}


void  ee77762 ::foo(){vfunc_called(this, "_ZN7ee777623fooEv");}
void  ee77762 ::bar(){vfunc_called(this, "_ZN7ee777623barEv");}
ee77762 ::~ee77762(){ note_dtor("ee77762", this);} // tgen
ee77762 ::ee77762(){ note_ctor("ee77762", this);} // tgen

static void Test_ee77762()
{
  extern Class_Descriptor cd_ee77762;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_ee77762, buf);
    ee77762 *dp, &lv = *(dp=new (buf) ee77762());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(ee77762)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(ee77762)");
    check_base_class_offset(lv, (aa2*)(bb62*), ABISELECT(48,24), "ee77762");
    check_base_class_offset(lv, (bb62*)(cc762*), ABISELECT(48,24), "ee77762");
    check_base_class_offset(lv, (cc762*)(dd7762*), ABISELECT(32,16), "ee77762");
    check_base_class_offset(lv, (dd7762*), ABISELECT(16,8), "ee77762");
    check_field_offset(lv, e, ABISELECT(8,4), "ee77762.e");
    test_class_info(&lv, &cd_ee77762);
    dp->~ee77762();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vee77762(Test_ee77762, "ee77762", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN7ee77762C1Ev();
extern void _ZN7ee77762D1Ev();
Name_Map name_map_ee77762[] = {
  NSPAIR(_ZN7ee77762C1Ev),
  NSPAIR(_ZN7ee77762D1Ev),
  {0,0}
};
extern Class_Descriptor cd_aa2;
extern VTBL_ENTRY _ZTI3aa2[];
extern  VTBL_ENTRY _ZTV3aa2[];
extern Class_Descriptor cd_bb62;
extern VTBL_ENTRY _ZTI4bb62[];
extern  VTBL_ENTRY _ZTV4bb62[];
extern Class_Descriptor cd_cc762;
extern VTBL_ENTRY _ZTI5cc762[];
extern  VTBL_ENTRY _ZTV5cc762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5cc762[];
extern Class_Descriptor cd_dd7762;
extern VTBL_ENTRY _ZTI6dd7762[];
extern  VTBL_ENTRY _ZTV6dd7762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6dd7762[];
static Base_Class bases_ee77762[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_aa2,    ABISELECT(48,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    1, //immediately_derived
  0, 0},
  {&cd_bb62,    ABISELECT(48,24), //bcp->offset
    22, //bcp->virtual_function_table_offset
    4, //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_cc762,    ABISELECT(32,16), //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
    3, //init_seq
    3, //immediately_derived
  0, 1},
  {&cd_dd7762,    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},
  {0}};
extern VTBL_ENTRY _ZTI7ee77762[];
extern void _ZN7ee777623fooEv();
extern void _ZN7ee777623barEv();
extern void ABISELECT(_ZTv0_n40_N7ee777623barEv,_ZTv0_n20_N7ee777623barEv)();
extern void ABISELECT(_ZThn16_N7ee777623barEv,_ZThn8_N7ee777623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n48_N7ee777623fooEv,_ZTv0_n24_N7ee777623fooEv)();
extern void ABISELECT(_ZThn16_N7ee777623fooEv,_ZThn8_N7ee777623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee777623fooEv,_ZTv0_n16_N7ee777623fooEv)();
extern void ABISELECT(_ZThn32_N7ee777623fooEv,_ZThn16_N7ee777623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N7ee777623barEv,_ZTv0_n20_N7ee777623barEv)();
extern void ABISELECT(_ZThn32_N7ee777623barEv,_ZThn16_N7ee777623barEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N7ee777623fooEv,_ZTv0_n12_N7ee777623fooEv)();
extern void ABISELECT(_ZThn48_N7ee777623fooEv,_ZThn24_N7ee777623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N7ee777623barEv,_ZTv0_n16_N7ee777623barEv)();
extern void ABISELECT(_ZThn48_N7ee777623barEv,_ZThn24_N7ee777623barEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_ee77762[] = {
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7ee77762[0]),
  (VTBL_ENTRY)&_ZN7ee777623fooEv,
  (VTBL_ENTRY)&_ZN7ee777623barEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7ee77762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee777623barEv,_ZTv0_n20_N7ee777623barEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n48_N7ee777623fooEv,_ZTv0_n24_N7ee777623fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7ee77762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee777623fooEv,_ZTv0_n16_N7ee777623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N7ee777623barEv,_ZTv0_n20_N7ee777623barEv),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7ee77762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N7ee777623fooEv,_ZTv0_n12_N7ee777623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N7ee777623barEv,_ZTv0_n16_N7ee777623barEv),
};
extern VTBL_ENTRY _ZTV7ee77762[];
extern void _ZN6dd77623barEv();
extern void _ZN6dd77623fooEv();
static  VTBL_ENTRY _tg__ZTV6dd7762__7ee77762[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&_ZN6dd77623barEv,
  (VTBL_ENTRY)&_ZN6dd77623fooEv,
};
extern void ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv)();
extern void ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv)();
extern void ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV5cc762__6dd7762__7ee77762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv),
};
extern void ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv)();
extern void ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv)();
extern void ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__6dd7762__7ee77762[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6dd7762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv),
};
extern void _ZN5cc7623fooEv();
extern void _ZN5cc7623barEv();
static  VTBL_ENTRY _tg__ZTV5cc762__7ee77762[] = {
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&_ZN5cc7623fooEv,
  (VTBL_ENTRY)&_ZN5cc7623barEv,
};
extern void ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv)();
extern void ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv)();
extern void ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV4bb62__5cc762__7ee77762[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5cc762[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv),
};
static  VTT_ENTRY vtt_ee77762[] = {
  {&(_ZTV7ee77762[5]),  5,28},
  {&(_ZTV7ee77762[13]),  13,28},
  {&(_ZTV7ee77762[20]),  20,28},
  {&(_ZTV7ee77762[26]),  26,28},
  {&(_tg__ZTV6dd7762__7ee77762[4]),  4,6},
  {&(_tg__ZTV5cc762__6dd7762__7ee77762[5]),  5,7},
  {&(_tg__ZTV4bb62__6dd7762__7ee77762[4]),  4,6},
  {&(_tg__ZTV5cc762__7ee77762[3]),  3,5},
  {&(_tg__ZTV4bb62__5cc762__7ee77762[4]),  4,6},
};
extern VTBL_ENTRY _ZTI7ee77762[];
extern  VTBL_ENTRY _ZTV7ee77762[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7ee77762[];
static VTBL_ENTRY alt_thunk_names1395[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N5cc7623barEv,_ZTv0_n16_N5cc7623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623barEv,_ZThn8_N5cc7623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N5cc7623fooEv,_ZTv0_n12_N5cc7623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N5cc7623fooEv,_ZThn8_N5cc7623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623barEv,_ZTv0_n16_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623barEv,_ZThn16_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N6dd77623fooEv,_ZTv0_n12_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N6dd77623fooEv,_ZThn16_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N6dd77623barEv,_ZTv0_n20_N6dd77623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623barEv,_ZThn8_N6dd77623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N6dd77623fooEv,_ZTv0_n16_N6dd77623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N6dd77623fooEv,_ZThn8_N6dd77623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee777623barEv,_ZTv0_n16_N7ee777623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee777623barEv,_ZThn24_N7ee777623barEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N7ee777623fooEv,_ZTv0_n12_N7ee777623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N7ee777623fooEv,_ZThn24_N7ee777623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n32_N7ee777623fooEv,_ZTv0_n16_N7ee777623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee777623fooEv,_ZThn16_N7ee777623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n48_N7ee777623fooEv,_ZTv0_n24_N7ee777623fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee777623fooEv,_ZThn8_N7ee777623fooEv),
  ALT_NAMES_TERMINATOR,
  (VTBL_ENTRY)ABISELECT(_ZTv0_n40_N7ee777623barEv,_ZTv0_n20_N7ee777623barEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N7ee777623barEv,_ZThn16_N7ee777623barEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N7ee777623barEv,_ZThn8_N7ee777623barEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_ee77762 = {  "ee77762", // class name
  bases_ee77762, 4,
  &(vtc_ee77762[0]), // expected_vtbl_contents
  &(vtt_ee77762[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI7ee77762),ABISELECT(40,24), //typeinfo_var
  NSPAIRA(_ZTV7ee77762),28, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7ee77762),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1395,
};
#endif // __cplusplus

//============================================================================

